Lire un fichier excel avec php

Cette article est assez vieux (2009), un plus récent est disponible avec une nouvelle librairie maintenue. Lire un fichier Excel avec PHP nouvelle version !

Voici un tutoriel qui présente de façon simple et concise la manière la plus efficace de lire un fichier excel (*.xls) avec le langage PHP.

Premièrement, télécharger la librairie excelReader à cette adresse : http://sourceforge.net/projects/phpexcelreader

Seconde chose à faire, renommer le fichier « OLERead.ini » en « OLERead.php ».

La troisième, allé modifier le path (chemin) d’inclusion du fichier OLERead.php dans reader.php

Vérifier que le fichier excel fournie avec le package s’ouvre bien avec le logiciel Microsoft Excel (On ne sait jamais). Dans le cas où celui-ci est illisible (Ce qui m’est arrivé, c’est pour cela que je vous préviens, cela vous évitera deux heures d’investigation infructueuse ^^), prenez ou créez un fichier excel qui fonctionne.

Donc pour lire ce jolie fichier en PHP rien de très compliqué. Suivez l’exemple fournie dans le package…

Et si l’on commentait un minimum cet exemple…

// Chargement de la librairie
Include('Excel/reader.php');

// Instanciation de la class permettant la lecture du fichier excel
$data = new Spreadsheet_Excel_Reader();

// Définition du type d’encodage de caractère à utiliser pour la sortie (ce qui va être affiché à l’écran)
// ici on utilise l’encodage de Windows voir http://en.wikipedia.org/wiki/CP1251
$data->setOutputEncoding('CP1251');

// Chargement du fichier excel à lire
$data->read('mon_beau_fichier_rois_des_fichiers.xls');

/*
$data->sheets[0]['numRows'] – Donne le nombre de lignes
$data->sheets[0]['numCols'] - Donne le nombre de colonnes
$data->sheets[0]['cells'][$i][$j] – retourne la donnée de la ligne $i et de la colonne $j

$data->sheets[0]['cellsInfo'][$i][$j] – retourne des informations à-propos de la cellule

*/
error_reporting(E_ALL ^ E_NOTICE);

// Parse l’intégralité du fichier excel
for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) {
	for ($j = 1; $j <= $data->sheets[0]['numCols']; $j++) {
		echo """.$data->sheets[0]['cells'][$i][$j]."",";
	}
	echo "
";
}

Problème rencontré :

Encodage en utf-8. Pour palier à ce problème je vous conseille d’utiliser la fonction php mb_convert_encoding en lieu et place de la fonction utf8-encode. Pour dire vrai je me suis fait une petite fonction que j’appelle à chaque extraction de données de la librairie.

function cleanThis($val){
	return mb_convert_encoding($val, "UTF-8","windows-1252");
}

// Exemple d’appel
cleanThis($data->sheets[0]['cells'][$x][1])

Normalement avec tout cela vous devriez pouvoir lire aisément un fichier excel avec php.

Pour des raisons de praticité, je me suis fait mon propre package avec les recommandations que je vous ais donné au début. Le voici.

Bon dev !

Tagués avec : ,
Publié dans PHP
46 commentaires pour “Lire un fichier excel avec php
  1. .Spirit dit :

    Merci beaucoup pour cette aide précieuse !

  2. Dudu dit :

    Bonjour, y a-t-il un moyen de récupérer la formule d’une cellule ? (par exemple : =SOMME(B8+C8)).

    Merci

  3. armole dit :

    Ton truc est génial ! merci je fais tourner ta page !

  4. waldo dit :

    Dudu*, je n’en ai aucune idée.

    Mais vue qu’une formule est du contenue dans une cellule, je pense qu’il est possible de la récupérer.

  5. tim dit :

    Merci pour cet article, il va beaucoup me servir :)

    Bonne continuation pour le blog !

  6. xramber dit :

    Bonjour,

    J’ai vu que ce blog était assez actif, je voulais donc savoir si vous avez utilisé cette bibliothèque pour traiter des fichiers excel assez conséquents (plus de 3 mo): En effet, lorsque je fais des traitements en local sur ce type de fichiers, j’ai différents types d’erreurs qui s’affichent: PHP Fatal error: Maximum execution time of 60 seconds exceeded… ou PHP Fatal error: Allowed memory size of 209715200 bytes exhausted (tried to allocate 35 bytes)…

    Est-il possible donc de traiter ce type de fichier sans avoir à toucher aux paramètres php.ini ou de convertir le fichier en .csv? (la mise en page est un élément important dans le cadre de mon travail).

  7. waldo dit :

    xramber*

    Malheureusement, cette librairie est très gourmande, car elle charge l’intégralité du fichier en une fois.

    On est donc obligé de modifier certain paramètres de PHP.

  8. Rija dit :

    Merci beaucoup pour la fonction mb_convert_encoding()

  9. David dit :

    Bonjour,

    Merci beaucoup pour cet article.

    C’est exactement ce que je cherchais.

    A +

    David

  10. ouibou dit :

    Rien ne s’affiche de mon côté.

    J’ai bien changé le inc par php.

    J’ai changé le chemin dans reader.php; qui est maintenant: « require_once ‘OLERead.php'; »

    Et dans exmaple, j’ai mis:

    setOutputEncoding('CP1251');
    
    
    // Chargement du fichier excel à lire
    
    $data->read('mon_beau_fichier_rois_des_fichiers.xls');
    
    
    /*
    
    $data->sheets[0]['numRows'] – Donne le nombre de lignes
    
    $data->sheets[0]['numCols'] - Donne le nombre de colonnes
    
    $data->sheets[0]['cells'][$i][$j] – retourne la donnée de la ligne $i et de la colonne $j
    
    
    $data->sheets[0]['cellsInfo'][$i][$j] – retourne des informations à-propos de la cellule
    
    
    */
    
    error_reporting(E_ALL ^ E_NOTICE);
    
    
    // Parse l’intégralité du fichier excel
    
    for ($i = 1; $i sheets[0]['numRows']; $i++) {
    
     for ($j = 1; $j sheets[0]['numCols']; $j++) {
    
     echo """.$data->sheets[0]['cells'][$i][$j]."",";
    
     }
    
     echo "n";
    
    } ?>
    

    Mais ca n’affiche rien.

    NB: J’ai recréé un fichier excel avec le meme nom..

  11. alainlesilencieux dit :

    Super programme que j’ai appliqué de suite.

    Mais cela ne lit que la première feuille du fichier.

    Comment puis-je lire les autres ?

    Merci d’avance

  12. Waldo dit :

    Pour lire chaque feuille, il faut utiliser la propriété « boundsheets », comme ci-dessous

    $data = new Spreadsheet_Excel_Reader($file, false, "CP1252");
    
    foreach ($data->boundsheets as $iSheet => $valueSheet) {
    
    [...]
    
    }
    
  13. nico dit :

    Bonjour,

    Cela marche très bien … quand j’ouvre un fichier que j’ai créé ou que j’ai enregistrer moi-même.

    en revanche quand j’ouvre un fichier que l’on m’envoie par mail (par exemple) il me dit :

    The filename monfichier.xls is not readable

    auriez-vous une solution ?

  14. Fred dit :

    Comment faire pour que le parseur comprenne les rayures de case?

    • waldo2188 dit :

      À part le programmer dans la/les classes du parsseurs, je ne voie pas trop comment.
      Je vous conseil de faire un tour sur le groupe qui développe la librairie Excel pour l’application PhpMyAdmin. Eux seront plus à même de vous répondre.

  15. Djtale dit :

    Bonjour,
    cette librairie correspond quasiment à mes besoins.
    J’ai juste un problème avec les dates.
    Lorsque je lis dans mon fichier excel une cellule contenant cette valeur ’07/09/2009 16:00:00′,
    cela m’affiche ’31/12/1969 23:59′.

    Comment sont calculées les dates ? Est ce un bug au niveau de la librairie ?

    Cordialement.

    • waldo2188 dit :

      Excellente question! A la quelle je n’ai malheureusement pas de réponse.

      À part te conseiller d’aller étudier le code source de la librairie je ne vois pas trop quoi te conseiller.

      Si tu trouve la réponse à ta question, revient nous faire profiter de tes découverte.

      Bonne journée.

      • wasis dit :

        Bonjour,
        Il m’est arrivé de travailler sur cette question, la différence c’est je lisais un fichier « .xlsx »
        Je renommais le fichier en remplaçant l’extension « .xlsx » par « .zip », c’est bien évidemment une méthode que j’ai trouvé sur le web.
        En ce qui concerne la question, des cellules de dates, j’appliquais la formule suivante :

        $datePHP = date("Y-m-d", ($valeurChamp - 25569)*86400);

        sachant que $valeurChamps contient la valeur lue dans la cellule.

        J’espère que ceci pourra aider.

        Cordialement.

  16. Patrick dit :

    Merci pour ton tuto qui m’a beaucoup aidé.

    Cordialement

  17. RomGom dit :

    Salut et merci pour ce tuto!
    j’ai cependant une erreur que je ne parviens pas a résoudre..

    j’ai cette erreur qui s’affiche
    Deprecated: Assigning the return value of new by reference is deprecated in C:wampwwwmailingexcelReaderExcelreader.php on line 261

    et une autre mais qui vient seulement du contenu de mon fichier
    Notice: iconv() [function.iconv]: Detected an illegal character in input string in C:wampwwwmailingexcelReaderExcelreader.php on line 1055

    Est ce que vous auriez une idée ? Merci.

    • waldo2188 dit :

      Salut !

      Pour la première erreur cela est due au fait que dans les nouvelles versions de PHP le passage par référence (ex: maFonction($uneVariable, &$uneVariablepasséParRéférence)) dans une fonction est déprécié. Ce qui veux dire qu’un jour cette façon de coder ne fonctionnera plus.

      La seconde erreur que tu rencontre, je l’ai déjà eu mais je n’arrive pas à me souvenir comment je l’ai réglé.

      En attendant, je te conseil d’essayer avec le package que je me suis fait, ici http://mon-beulogue.com/upload/excelReader.zip

      Si cela ne fonctionne toujours pas correctement, renseigne toi sur la librairie utilisé par phpMyAdmin.
      Pour l’avoir essayé vite fait elle à l’air de bien fonctionner http://phpexcel.codeplex.com/

      Bon courage

      • RomGom dit :

        merci, j’ai regardé la librairie utilisé par phpMyAdmin en effet elle à l’air très puissante, mais aussi très complexe, elle fait même trop de chose pour l’utilité que j’en ai.

        j’ai cependant résolu l’erreur qui été affiché a force de chercher!! persévérance!! et pourtant pas compliqué..
        pour la première erreur j’ai fais ça

        function Spreadsheet_Excel_Reader()
            {
                //$this->_ole =&amp; new OLERead();
                $this->_ole = new OLERead();
                $this->setUTFEncoder('iconv');
            }

        et la deuxième erreur j’ai changer l’encodage avec

        $data->setOutputEncoding('UTF-16LE');

        et pour la librairie codeplex, voila un bon tuto http://g-ernaelsten.developpez.com/tutoriels/excel2007/

  18. waldo2188 dit :

    Le fait que le serveur soit sous linux ne pose aucun problème, regarde au niveau des log de php et apache s’il n’y a pas des erreurs.

  19. Figo dit :

    Très bon tuto et bon source
    J’ai juste un problème, les formules de concaténation de texte me retourne une chaine vide
    Y a t il qqchose que j’aurais loupé
    merci

  20. DIARRA dit :

    J’ai eu le message suivant: The filename mensuelles.xlsx is not readable.
    Merci d’avance.

    • waldo2188 dit :

      Ton fichier est un xlsx, ce qui est complètement différent d’un xls.

      Les fichiers xls sont des fichier binaire, les fichiers xlsx c’est une arborescence de dossier et fichier XML respectant le format Open Document et compressé avec la méthode ZIP. Donc si tu renomme ton fichier en .zip, tu pourra en voir le contenu.

      De tout cela découle ton problème, un fichier xlsx ne peut être lue avec cette vieille class.
      De plus tu as peut-être un problème de droit d’accès au fichier.

  21. jeff dit :

    Bonjour à toutes et tous,
    je vous explique mon problème :
    j’ai un fichier excel contenant des donnée et des formules
    (ex : A1=> »1″ / A2=> »a » / A3=> »=A1″ / A4=> »=A2″)

    quand j’ouvre mon fichier avec excel il affiche les bonnes information
    (ex : A1= »1″ / A2= »a » / A3= »1″ / A4= »a »)

    mais lorsque je l’ouvre avec un fichier php (et affiche le contenu) les valeurs non numérique issue de formule ne s’affiche pas
    (ex : A1= »1″ / A2= »a » / A3= »1″ / A4= » »)

    comment résoudre ce problème ? dois-je utiliser un classe plus complexe pour traiter mes fichier excel?

    j’espère avoir été assez clair et vous remercie d’avance pour vos réponse.

    • jeff dit :

      édit :
      j’ai pu contourner le problème en convertissant mon fichier excel en fichier csv.

      par contre j’aimerais bien (pour culture personnel) savoir si il existe une réponse sans convertir le fichier.

  22. Mim's dit :

    Bonjour !
    Dans le cas ou les premières feuilles de mon classeur sont masquées, est-il possible de les lire quand même ?
    soit directement, soit après démasquage?

  23. Bernard35 dit :

    Très bon. Comment faire pour récupérer les couleurs des cellules?

  24. phiper dit :

    Bonjour,
    Et merci pour cette fonction.
    Merci également à RomGom pour la correction des 2 warning.

  25. bamyes dit :

    Salut et merci pour ce tuto!
    Ce problème m’a pris toute la soirée.

    • waldo2188 dit :

      Salut Matt !
      Ça fait un baille que j’utilise ce tuto, et j’avoue ne jamais être tombé sur celui de code source.
      Le code que je met en avant a été trouvé sur le site de l’auteur de la librairie.
      Je laisse ton lien car il pourra certainement être utile à d’autre !

  26. Steeve dit :

    Bonjour,

    Tout d’abord merci pour ce tuto, très facile et utile à mettre en oeuvre :).
    Mais j’ai tout de même un petit problème, lorsque je test la lecture d’un fichier en local avec easyphp je n’ai pas de souci. Mais lorsque je veux lire le même fichier depuis un site que j’héberge sur mon ftp free j’ai l’erreur « The filename R3_Wintzfelden_CAO.xls is not readable »…

    A savoir que j’ai du modifier le fichier reader.php pour avoir
    require_once ‘oleread.php';
    au lieu de
    require_once ‘OLEread.php';

    Aurais tu une idée de la solution à apporter ?

    Merci par avance.

    • waldo2188 dit :

      Excellente question !
      Malheureusement, je n’ai pas de solution à t’apporter.

      La seul solution c’est de comprendre pourquoi il ne veux pas lire le fichier.
      As tu mis certaine restriction de lecture/écriture/exécution sur ton fichier?

  27. wizzi dit :

    J’ai remarqué que quand une cellule du fichier contient un caractère accentué, et qu’on souhaite récupérer son contenu, un contenu vide est renvoyé au lieu du contenu exact.
    Quelqu’un aurait-il rencontré ce problème?
    merci

  28. wizzi dit :

    Merci bcp ça marche nickel

  29. pierrepapierciseaux dit :

    Merci Merci Merci <3

  30. ruan01 dit :

    Bonjour,
    Merci une fois de plus pour le tuto, j’ai un leger soucis, j’aimerai recuperer les données depuis une colonne précise, ou de plusieurs cellules précises et le mettre dans une BD sql.
    Merci de vos reponses

  31. aymen dit :

    ya t’il une solution pour lire un fichier excel proteger par un mot de passe avec excel reader Merci

  32. Nicolas dit :

    Bonjour,
    Est il possible de récupérer des images ou des objets types dessins) contenues dans un fichier excel.
    En vous remerciant par avance

  33. iamyan38 dit :

    Des années après, un grand merci !!! Chaque ligne de ce tutoriel m’a aidé.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>