IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[Spreadsheet] Lire un fichier xlsx et formater la date


Sujet :

Bibliothèques et frameworks PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2012
    Messages : 19
    Par défaut [Spreadsheet] Lire un fichier xlsx et formater la date
    Bonjour,

    J'essaye de me mettre à Spreadsheet car je dois importer des donner en provenance d'un fichier excel/tableur.
    Je ne trouve pas leur doc très clair et je n'arrive pas à faire ce que je veux.
    Je veux importer le contenu du fichier et formater les dates au format qui va bien pour les enregistrer dans la bdd mysql (donc format YYYY-MM-JJ)
    C'est donc sur cette partie que je bloc.
    Je suppose bien qu'il faut utiliser getNumberFormat() et/ou setFormatCode('AAAA-MM-JJ') vers la ligne 65, mais comment ?

    Voici mon code actuel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    use PhpOffice\PhpSpreadsheet\Spreadsheet;
    use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
    use PhpOffice\PhpSpreadsheet\Reader\IReader;
    use PhpOffice\PhpSpreadsheet\IOFactory;
     
    \PhpOffice\PhpSpreadsheet\Cell\Cell::setValueBinder( new \PhpOffice\PhpSpreadsheet\Cell\AdvancedValueBinder() );
     
    class chunkReadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter
    {
        private $_startRow = 0;
     
        private $_endRow = 0;
     
        /**
         * We expect a list of the rows that we want to read to be passed into the constructor.
         *
         * @param mixed $startRow
         * @param mixed $chunkSize
         */
        public function __construct($startRow, $chunkSize)
        {
            $this->_startRow = $startRow;
            $this->_endRow = $startRow + $chunkSize;
        }
     
        public function readCell($column, $row, $worksheetName = '')
        {
            //  Only read the heading row, and the rows that were configured in the constructor
    //        if (($row == 1) || ($row >= $this->_startRow && $row < $this->_endRow)) {
            if  ($row >= $this->_startRow && $row < $this->_endRow) {
                return true;
            }
     
            return false;
        }
    }
     
     
        $inputFileType = 'Xls';
        $inputFileName = '06largescale.xlsx';
    //$inputFileName = __DIR__ . '/../../06largescale.xlsx';
     
        /**  Identify the type of $inputFileName  **/
        $inputFileType = \PhpOffice\PhpSpreadsheet\IOFactory::identify($inputFileName);
        /**  Create a new Reader of the type that has been identified  **/
        $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType);
        /**  Load $inputFileName to a Spreadsheet Object  **/
        $spreadsheet = $reader->load($inputFileName);
     
        /*  Define how many rows we want for each "chunk"  **/
        $chunkSize = 20;
     
        /*  Loop to read our worksheet in "chunk size" blocks  **/
        for ($startRow = 2; $startRow <= 240; $startRow += $chunkSize) {
            echo 'Loading WorkSheet using configurable filter for headings row 1 and for rows ',$startRow,' to ',($startRow + $chunkSize - 1),'<br />';
            /*  Create a new Instance of our Read Filter, passing in the limits on which rows we want to read  **/
            $chunkFilter = new chunkReadFilter($startRow, $chunkSize);
            /*  Tell the Reader that we want to use the new Read Filter that we've just Instantiated  **/
            $reader->setReadFilter($chunkFilter);
            /*  Load only the rows that match our filter from $inputFileName to a PhpSpreadsheet Object  **/
            $spreadsheet = $reader->load($inputFileName);
     
     
            $sheetData = $spreadsheet->getActiveSheet()->toArray(null, true, true, true);
     
            var_dump($sheetData);
     
            if (empty($sheetData[$startRow]['A']) || ($sheetData[$startRow]['A'] === '') && empty($sheetData[$startRow]['B']) || ($sheetData[$startRow]['B'] === '') ) break;
     
     
        }
     
    foreach ($sheetData as $data) {
          /* boucle pour  enregistrer chaque ligne dans ma bdd (après vérif des données) */
    }
    Avez-vous une idée ?
    Merci

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 350
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 350
    Billets dans le blog
    17
    Par défaut
    Pareil, je trouve la doc de cette lib vraiment confuse.

    Dans mon cas ce genre de script suffit pour parcourir un fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file);
    $rows = $spreadsheet->getActiveSheet()->toArray();
    foreach ($rows as $row) { ...
    Je suppose bien qu'il faut utiliser getNumberFormat() et/ou setFormatCode('AAAA-MM-JJ') vers la ligne 65, mais comment ?
    J'ai envie de te dire qu'il vaut mieux éviter au max l'usage de la lib
    De base la date sort du fichier sous quel format ? Tu pourras peut-être la traiter directement avec strtotime(), date(), DateTime

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2012
    Messages : 19
    Par défaut
    C'est pourtant la seul lib à jour (et recommandée)

    Quand j'ouvre le fichier excel, la date est du type : 25/03/2020
    mais quand je l'affiche après import, elle est au format (trop étrange) 03/25/2020
    mais bon je ne veux pas faire un truc trop fermer, car c'est ca membre qui pourra importer son fichier (et donc en fonction de excel le format ne sera peut etre pas tjs tjs le même...)

    Merci

  4. #4
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 350
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 350
    Billets dans le blog
    17
    Par défaut
    Quand j'ouvre le fichier excel, la date est du type : 25/03/2020
    mais quand je l'affiche après import, elle est au format (trop étrange) 03/25/2020
    Les joies d'Excel qui formate tout... au final on ne sait plus ce qui est dans le fichier.
    MM/DD/AAAA est le format de date américain, tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $date_ymd = date('y-m-d', strtotime($date_excel_mdy)); // 2020-03-25

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2012
    Messages : 19
    Par défaut
    Oui je vais faire comme ca, merci !

    Je ne passe pas le sujet en résolu, car j'aimerais savoir comment faire en vrai avec cette lib, donc si jamais quelqu'un à la réponse

Discussions similaires

  1. [XL-2010] Formater colonne fichier xlsx au format XML en colonnes ?
    Par Le Mad dans le forum Excel
    Réponses: 2
    Dernier message: 02/12/2015, 14h03
  2. Réponses: 0
    Dernier message: 11/08/2014, 18h58
  3. Réponses: 2
    Dernier message: 29/01/2010, 16h59
  4. Lire un fichier texte pré-formaté
    Par taupinfada dans le forum C++
    Réponses: 7
    Dernier message: 31/03/2007, 11h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo