Générer des fichiers Excel (XLS) avec PHP

Moulinex

Que ce soit pour extraire des informations d'une base de données (ex: MySQL) ou pour les convertir à partir d'un autre format, l'écriture de multiples fichiers Excel par un script de manière automatisée peut s'avérer utile, voire indispensable lorsqu'on vous demande plusieurs centaines de fichiers.

Pour ceci, PHPIndex a publié un mini article PHP et Excel : point de situation, qui date un peu certes mais qui faute de mieux présente des solutions manipulation de fichiers Excel depuis PHP.

Après tri selon les critères les plus courants (générer des fichiers binaires véritablement au format Excel natif, utiliser une librairie facile à installer), PHP_Writeexcel se démarque du lot. A l'aide de deux includes, la création de l'objet writeexcel_workbook (classeur) est à votre portée, ainsi que l'ajout de worksheet (feuilles) à ce classeur. Les cellules sont remplissables par ce type d'instruction : $worksheet->write(x, y, $valeur, $format); où x et y représentent les coordonnées de la cellule dans la feuille de calcul, $valeur le contenu texte de la cellule et $format le format de la cellule.

Il ne faut pas s'attendre à pouvoir définir des formats exceptionnels mais ils sont suffisants dans la plupart des cas. Couleur de fond, police, bordures, alignement du texte, etc. Il est aussi possible de définir la hauteur des lignes ou la largeur des colonnes, voire de fusionner plusieurs cellules entre elles. Les exemples fournis sont un bon point de départ, même si on peut regretter une documentation absente.

La moulinette est performante et ne peut que faire gagner du temps. Il suffit d'envoyer un petit header("Content-Type: application/x-msexcel"); pour obliger le navigateur à considérer le fichier dans le bon type (affichage ou téléchargement), ou bien de demander au script de l'écrire sur le disque. Après test en situation réelle, une centaine de classeurs comportant chacun une page basique munie d'un tableau de données de taille 6x40, sont générés en 20 secondes.

15 commentaires pour “Générer des fichiers Excel (XLS) avec PHP”

  1. Cid dit :

    Super, il fallait bien faire le point cette fonctionnalité est vraiment très utile. Merci !

  2. Marilyne dit :

    Moi aussi, je pensais que c’était bien (et cela le semble).
    J’ai essayé de l’utiliser mais je n’arrive pas…

    J’ai l’erreur suivante :
    open_basedir restriction in effect. File is in wrong directory in …

    J’ai juste fait un copier/coller pour l’instant.
    Et chaque démo que j’essaie, j’ai la même erreur.
    Comment faire epour ne pas écrire sur le serveur ???

  3. seka dit :

    Il suffit de générer une page comme ça et ça marche tout seul avec excel > 2000
    <?
    header("Content-Type: application/force-download; name=\"$NomFichier\"");

    header("Content-Transfer-Encoding: binary");
    header("Content-Disposition: attachment; filename=\"$NomFichier\"");
    header("Expires: 0");
    header("Cache-Control: no-cache, must-revalidate");
    header("Pragma: no-cache");?>
    <html xmlns:o="urn:schemas-microsoft-com:office:office"
    xmlns:x="urn:schemas-microsoft-com:office:excel"
    xmlns="http://www.w3.org/TR/REC-html40&...
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-latin-1" />
    <meta name="ProgId" content="Excel.Sheet" />
    <meta name="Generator" content="Microsoft Excel 9" />
    <style>
    <!–//
    td.xleuro {
    mso-style-parent:style0;
    mso-number-format:"\#\,\#\#0\.00\\ \0022\20AC\0022";
    }
    //–>
    </style>
    </head>
    <body>
    <table x:str="true" border="1" cellpadding="0" cellspacing="0">
    <tr>
    <th>Numero</th>
    <th>Montant</th>
    <th>France Telecom</th>
    <th>Orange</th>
    <th>Wanadoo</th>
    <th>Canal</th>
    </tr>
    <tr>
    <td x:num= »>1234567892</td>
    <td class=’xleuro’ x:num= »>125</td>
    <td class=’xleuro’ x:num= »>50</td>
    <td class=’xleuro’ x:num= »>50</td>
    <td class=’xleuro’ x:num= »>25</td>
    <td class=’xleuro’ x:num= »>Moi</td>
    </tr>
    <tr>
    <td x:num= »>1234567893</td>
    <td class=’xleuro’ x:num= »>130</td>
    <td class=’xleuro’ x:num= »>10</td>
    <td class=’xleuro’ x:num= »>10</td>
    <td class=’xleuro’ x:num= »>10</td>
    <td class=’xleuro’ x:num= »>Machin</td>
    </tr>
    </table>
    </body>
    </html>

  4. seka dit :

    J’oubliais

    a la place de x:num on peut utiliser x:func ou x:str etc
    les feuilles peuvent être avec des formules etc.

    pour les classeurs il faut faire des fichier html dans un dossier et fournir un fichier xml qui contient la liste du contenu.

  5. jo2214 dit :

    étonnant comme c’est simple en regard du résultat,
    mais ou trouver tous ces paramétres et leur syntaxe?
    x:func, x:str , des choses du genre:
    mso-number-format:"\#\,\#\#0\.00\\ \0022\20AC\0022";
    (je suppose que ça parle d’euro ?)
    les couleurs de cellule…
    merci d’avance

  6. MiMi dit :

    ‘llo :-)

    >> "mais ou trouver tous ces paramétres et leur syntaxe?"

    je crois qu’il y a un peu de doc à ce sujet sur http://www.agoric.com/sources/so... :-)

  7. Xuxu dit :

    Merci pour le billet ca va m’être très utile ^^

  8. MoN ChTi' BlOg dit :

    Génération simple d’un fichier XLS

    Voici un petit exemple qui va générer un fichier xls :
    $dir = « /data/ »;
    $nomFichier = « test.xls »;

  9. MoN ChTi' BlOg dit :

    Génération simple d’un fichier XLS

    Etant donné que certaines personnes ne savait pas comment convertir un fichier .csv en .xls ( -_-; ), j’ai donc parcouru le web via Google afin de « trouver une petite solution ».
    Je suis donc tombé sur un petit blog (

  10. tigroubelze dit :

    Salut,
    J’arrive à générer des fichiers excel mais il par contre quand je met des images elles se superposent avec le reste du document.

  11. le marsoin dit :

    J’utilise PHP writeexcel et il limite la taille des cellules à 255 caracteres. Quelqu’un a une idée ou a déja eu le meme problème ?

  12. jei186 dit :

    Salut à tous, j’arrive a générer un fichier excel mais j’aimerai colorer des lignes.
    J’ai utiliser : bg_color mais ca marche pas.

    $center2 =& $workbook->addformat(array(‘align’ => ‘center’, ‘bg_color’ => ‘FFFF00’));

  13. Claude dit :

    Bonjour à tous, j’ai utilisé les librairies excel, et tout marche bien, sauf que je n’arrive pas à faire la pagination.
    Si quelqu’un a des idée je suis preneur :)

    Merci d’avance !!

  14. Stan dit :

    Claude va voir là
    search.cpan.org/src/JMCNA…

    J’ai fait une belle feuille mais je n’arrive pas à formater mon pied de page (taille police et couleur)

    Si y quelqu’un qui sais je suis preneur.
    @+ Stan

  15. jerdiv dit :

    j’ai besoin d’un syllabus d’Excel

  16. zinfo dit :

    Bonjour, je voudrais lier une cellule d’une feuille à une autre. Exemple j’ai 2 feuilles, "feuil1" et "feuil2", je veux que le contenu A1 de feuil1 soit lié dans B2 de feuil2. Alors dans la cellule B2 (de feuil2) je met ‘=feuil1!A1’, tout s’exécute bien, mais quand j’ouvre le fichier avec Excel2002 j’obtiens des erreurs de plantage et j’ai 0 dans la cellule B2. Est-ce que quelqu’un a déja eu ce genre de problème?

  17. Roooni dit :

    Salut a tous,
    j’ai un petit souci, lorsque je lance ma page php et qu’un fichier est créé, il va automatiquement dans mon repertoire tmp meme quand je ferme mon fichier.
    A chaque fois que je relance la page j’ai une sorte de compteur qui s’incremente du genre : Fichier-1 puis Fichier-2….et en + les fichiers s’entassent dans le repertoire tmp…
    De plus, quand je fais fichier->enregistrer sous, ça me l’enregistre en tant que page web.
    Cmt faire pour changer tt ça svp??
    Merci d’avance

Laisser un commentaire