Création d’un fichier Excel grâce à PHP

Créer des fichier au format CSV est à la porté de tout le monde ( avec un minimum de recherche sur internet ).
Par contre créer un vrais fichier Excel, la c’est un peu plus difficile.
Mais Johann Hanne a trouvé la solution! Il a créer un ensemble de classe nommées « writeexcel ». Comme son nom l’indique il est fait pour créer et écrire des fichiers de type Excel et cela dynamiquement avec PHP. C’est pas beau ça ;p ?

Ça fonctionne plutôt bien, son seul défaut à l’heure actuelle, c’est qu’il ne supporte pas l’UTF-8.
Donc si votre site est en UTF-8 n’oubliez pas la fonction utf8_decode.

Pour télécharger writeexcel c’est ici.
Ou par la (au cas où le site de l’auteur tombe)

Alors comment ça marche?

Il faut juste les fichiers suivant :
– class.writeexcel_workbook.inc.php
– class.writeexcel_worksheet.inc.php

ceux-ci font partie de la librairie writeexcel.

require_once "writeexcel/class.writeexcel_workbook.inc.php";
require_once "writeexcel/class.writeexcel_worksheet.inc.php";

//On indique ensuite un emplacement sur le serveur, là où; sera stocké le fichier
$fname = "../../files/tmp/extraction.xls";

/**
 * on instancie la classe principal de writeexcel.
 * la classe  « writeexcel_workbook » permet de créer le fichier excel en lui même.
 * La fonction  addworksheet de la class « writeexcel_workbook » permet de créer une feuille au sein du fichier Excel ( Vous savez les petit onglet en bas à droite )
 */
$workbook =& new writeexcel_workbook($fname); // on lui passe en paramètre le chemin de notre fichier
$worksheet =& $workbook->addworksheet('Extraction'); //le paramètre ici est le nom de la feuille

 /**
  * Ici on va définir un format pour les colonnes de A à D
  */
$worksheet->set_column('A:D', 30); // le 30 représente la largeur de chaque colonne
$heading  =& $workbook->addformat(array('bold' => 1, // on met le texte en gras
									    'color' => 'black', // de couleur noire
  										'size' => 12, // de taille 12
										'merge' => 1, // avec une marge
										'fg_color' => 0x33 // coloration du fond des cellules));

$headings = array('Nom', 'Prénom', 'société', 'Email', 'Pays'); //définition du texte pour chaque célulles
$worksheet->write_row('A1', $headings, $heading); On intègre notre texte et les le format de cellule.

// Le premier paramètre correspond à la cellule où l'on souhaite commencer à intégrer les différent paramètre.
for($x = 2; $x <= 10; $x++) {
  	$worksheet->write("A".$x,'un text'); // ici on va écrire une célule bien définie
  	$worksheet->write("B".$x,'un text');
  	$worksheet->write("C".$x,'un text');
  	$worksheet->write("D".$x,'un text');
	$worksheet->write("E".$x,'un text');
}

$workbook->close(); // on ferme le fichier Excel créer

Voici une version pour créer plusieurs onglets dans un fichier Excel.
La différence avec le script au-dessus, c’est que nous allons créer plusieurs « workbook  » grâce à la fonction $workbook->addworksheet(‘Nom de l’onglet’)

require_once "writeexcel/class.writeexcel_workbook.inc.php";
require_once "writeexcel/class.writeexcel_worksheet.inc.php";
//On indique ensuite un emplacement sur le serveur, là où sera stocké le fichier
$fname = "./extraction.xls";

/**
 * on instancie la classs principal de writeexcel.
 * la classe « writeexcel_workbook » permet de créer le fichier excel en lui même.
 */
$workbook =& new writeexcel_workbook($fname); // on lui passe en paramètre le chemin de notre fichier

for($y=0; $y<=2; $y++) {
	// La fonction  addworksheet de la classe « writeexcel_workbook » permet de créer une feuille au sein du fichier Excel ( Vous savez les petit onglet en bas à droite )
	// Pour créer plusieurs onglet il faut ré-appeler la fonction addworksheet.
	// Cela permettra d'ajouter une autre feuille au fichier excel
	$worksheet =& $workbook->addworksheet('Extraction'.$y); //le paramètre ici est le nom de la feuille

	/**
	 * Ici on va définir un format pour les colonnes de A à D
	 */
	 $worksheet->set_column('A:D', 30); // le 30 représente la largeur de chaque colonne
	 $heading  =& $workbook->addformat(array('bold' => 1, // on met le texte en gras
	 										 'color' => 'black', // de couleur noire
	 										 'size' => 12, // de taille 12
	 										 'merge' => 1, // avec une marge
	 										 'fg_color' => 0x33 // coloration du fond des cellules));

	 $headings = array('Nom', 'Prénom', 'société', 'Email', 'Pays'); //définition du texte pour chaque cellules
	 $worksheet->write_row('A1', $headings, $heading); //On intègre notre texte et les le format de cellule.
	 // le premier paramètre correspond à la cellule où l'on souhaite commencer à intégrer les différent paramètre.

	 for($x = 2; $x <= 10; $x++) {
	 	$worksheet->write("A".$x,'un text'.$y); // ici on va écrire une cellules bien définie
	 	$worksheet->write("B".$x,'un text'.$y);
	 	$worksheet->write("C".$x,'un text'.$y);
	 	$worksheet->write("D".$x,'un text'.$y);
	 	$worksheet->write("E".$x,'un text'.$y);
	 }
}

$workbook->close(); // on ferme le fichier Excel créer

Ça y est c’est fait.
Bien sur je vous est présenté ça de manière succincte.
Grâce à la librairie writeexcel il est possible de faire bien des choses, comme intégrer des formule mathématiques, et bien d’autre.
Alors maintenant vous n’avez plus d’excuse quand on vous demandera un générateur de fichier Excel en PHP ^^.

Tagués avec : , , ,
Publié dans PHP
25 commentaires pour “Création d’un fichier Excel grâce à PHP
  1. Andre73100 dit :

    Salut,

    J’aurais une petite questions : Le code que tu cite au dessus, on le met ou et comment, je ne comprends pas…

    Merci d’avance ;)

  2. Waldo dit :

    Salut,

    @Andre73100, tu le pose en vrac où tu veux.

    Les deux blocs de code sont indépendants.

    Le premier permet de créer un seul onglet :

    "$worksheet =& $workbook->addworksheet('Extraction');"

    le second code en crée plusieurs :

    "$worksheet =& $workbook->addworksheet('Extraction'.$y);"

    Maintenant le code en lui même peut être placé dans une fonction, class, dans un fichier .php

    J’espère avoir répondu à la question, sinon n’hésite pas à y apporter des précisions.

  3. zipawi dit :

    Bonjour, est-il possible de créer des graphiques sur les fichiers excel? sachant que les données servant à la production de ces graphiques sont stockées dans une base de données en MySQL!

    Merci

  4. waldo dit :

    zipawi*,

    J’avoue que je n’est sais rien, et comme cette classe n’est plus supporté et que sont auteur n’a jamais rédiger de doc, je ne peu vraiment pas te répondre.

    Par contre il existe JpGraph (http://jpgraph.net/) qui permet de généré des graphique en image, que tu peux insérer dans ton fichier excel.

  5. high_tech dit :

    Bonjour tous le monde,

    j’ai un problème avec cette lib, j’espère pouvoir trouvé une solution ici.

    voila j’utilise cette lib pour générer un fichier Excel à partir des données d’une BD, le soucis c’est que mes données sont sous format html c’est en fait le resultat d’une sauvgarde d’un editeur wisywigs, alors quand j’obtiens mon fichier j’ai des données qui sont pas formaté genre j’obtiens dans la colonne A2 par exemple lorem islem tolem

  6. Waldo dit :

    @hight_teck

    Du fait du peu de documentation sur cette librairie, je te conseille vivement d’utiliser phpExcel : http://phpexcel.codeplex.com/.

    C’est la librairie utilisé par PhpMyAdmin.

  7. phil30 dit :

    Bonjour,

    savez vous s’il est possible de créer des graphiques via writeexcel ?

    En ce qui me concerne j’utilise PhpExcel pour créer des feuilles excel via php mais je n’ai pas trouvé comment y insérer des graphiques.

    Merci de votre aide.

  8. v l. dit :

    Bonjour tout le monde,

    Je voudrais savoir : Est-il possible de modifier un fichier Excel existant avec la librairie WriteExcel ?
    Si oui, comment ?

    Merci d’avance

  9. waldo2188 dit :

    @v l.
    C’est une chose à essayer. A mon sens, oui il serait possible de faire des modifications, mais je n’ai jamais essayé.

  10. v l. dit :

    Ok waldo2188.
    Tu as une petite idée ou pas ? Car je nage un peu!!lol.
    J’ai essayé de faire quelque chose dans ce gout la :

    include('class.writeexcel_workbook.inc.php');
    include('excel/class.writeexcel_worksheet.inc.php');
    include('excel/functions.writeexcel_utility.inc.php');
     
    $data = new Spreadsheet_Excel_Reader();
    $data->setOutputEncoding('CP1251'); 
    $data->read("test.xls"); 	$workbook = & new writeexcel_workbook("test.xls");
    $workbook->sheets(0)->write(0, 19, 'Hello');
    

    mais j’ai ce message d’erreur :

    Fatal error: Call to a member function write() on a non-object in D:portailpicacontenugestion_expexpertise_contestationtest.php on line 22

    Si quelqu’un à une idée de comment je peux faire pour résoudre ce problème : je suis preneur!!

    Merci d’avance!

    • waldo2188 dit :

      Là comme ça, non pas vraiment…

      Par contre tu peux certainement déjà essayer de créer un fichier excel temporaire.
      Et un fois que tu as fini tes modifications, tu enregistre ton fichier temporaire, supprime le vrais et enfin renomme le temporaire.

      Ça fait bidouille comme démarche, mais beaucoup d’applications utilisent cette méthode.

  11. v l. dit :

    Tu as lu dans mes pensées ?lol.
    Car c’est totalement ça que j’essaye de mettre en place.
    Pour le moment j’arrive à créer un nouveau fichier, récupérer les données de l’ancien fichier mais pour les récrire au bon endroit, je bloque un peu. Voici mon code :

    include(RelativePathClass.'excel/class.writeexcel_workbook.inc.php');
    include(RelativePathClass.'excel/class.writeexcel_worksheet.inc.php');
    include(RelativePathClass.'excel/functions.writeexcel_utility.inc.php');	
    
    $data = new Spreadsheet_Excel_Reader();
    $data->setOutputEncoding('CP1251');
    	
    $fichier = "Test.xls";
    $data->read($fichier); 
    $workbook = &amp;new writeexcel_workbook("Test2.xls");
    $worksheet = $data->sheets[0];
    $sheet =&amp; $workbook->addworksheet('test2');
    for ($i = 1; $i sheets[0]['numRows']; $i++) {
    	for ($j = 1; $j sheets[0]['numCols']; $j++) {
    		$donnees = $worksheet['cells'][$i][$j];
    		echo $donnees." - i: ".$i." - j: ".$j."";
    	}
    }	
    	
    $workbook->close();
    

    Cordialement

  12. v l. dit :

    Bonjour,

    Pour ceux que ça intéresse je met ici la solution de mon problème :

    include(RelativePathClass.'excel/class.writeexcel_workbook.inc.php');
    include(RelativePathClass.'excel/class.writeexcel_worksheet.inc.php');
    include(RelativePathClass.'excel/functions.writeexcel_utility.inc.php');	
    $data = new Spreadsheet_Excel_Reader();
    $data->setOutputEncoding('CP1251');	
    $fichier = "Test.xls";
    $data->read($fichier); // On lit le fichier "Test.xls".
    $workbook = &amp;new writeexcel_workbook("Test2.xls"); // On créé un second fichier nommé "Test2.xls".
    $sheet = $data->sheets[0]; // On lit la feuille 1 du fichier "Test.xls".
    $worksheet =&amp; $workbook->addworksheet('test2'); // On créé un feuille sur le fichier "Test2.xls".
    // On récupère les données par ligne puis par colonnes.
    for ($i = 1; $i sheets[0]['numRows']; $i++) {
    	for ($j = 1; $j sheets[0]['numCols']; $j++) {
    		// Si on as une données à la ligne et colonne correspondant 
    		// alors on l'insère dans une variable puis on l'écrit sur notre nouveau fichier ("Test2.xls").
    		if (isset($sheet['cells'][$i][$j])) {
    			$donnees = $sheet['cells'][$i][$j];
    			$worksheet->write($i-1, $j-1, $donnees,'');
    		}
    	}
    }	
    // On supprime le fichier d'origine (Test.xls).
    unlink($fichier);
    // On renomme le nouveau fichier "Test2.xls" en "Test.xls".
    rename("Test2.xls", "Test.xls"); 
    

    Merci à waldo2188 pour m’avoir éclairé.
    Cordialement.

  13. John dit :

    Any ideas on how to use the utf8_decode function in this case? Thanks!

  14. billel dit :

    merci pour cette illustration, votre code m’a aidé.

  15. Charks dit :

    Un très grand merci, ça va m’aider à faire mon petit programme.

  16. Badplayer dit :

    Bonjour,

    Comment puis-je définir une cellule au format texte ?

    En fait, je dois stocker une référence de type 000365695 (9 chiffres avec 3 zéros au début), mais si je fais un simple
    $worksheet->write('B2', $ref);
    les zéros disparaissent car la cellule est formatée par défaut en nombre.

    Merci d’avance pour votre aide !

    Laurent

  17. chrismaniia dit :

    Bonjour,

    Très bon script, ca fonctionne avec pleins d’erreurs mais a merveille.

    J’ai une petite question, comment faire pour créer un nouveau dossier à chaque fois que j’appelle cette page de script.
    ex : extraction.xls
    extraction1.xls
    extraction2.xls

    Merci d’avance pour votre aide!

  18. Anouk dit :

    Bonjour !
    Ma question va peut être paraître stupide mais est ce qu’on est obligé d’utiliser PhpExcel pour exécuter ce code , ou bien les classes writeexcel sont accessibles sans ca ?
    J’ai tenté de récupérer ce script mais il a beaucoup d’erreurs chez moi :/

  19. ghizlane dit :

    bonjour,
    s’il vous plait, je veux générer un fichier Excel avec (PHPExcel), et je veux le remplir par des données d’un tableau.mais j’ai un prbleme de remplissage du fichier , voila mon code

    $pdl = array();
    for($k=0;$ksetCellValue(‘A’.$IndexLigne, $pdl[‘nom’]);
    $feuille->setCellValue(‘B’.$IndexLigne, $pdl[‘etage’]);
    $feuille->setCellValue(‘C’.$IndexLigne, $pdl[‘matricule’]);
    $feuille->setCellValue(‘D’.$IndexLigne, $pdl[‘commune’]);
    $feuille->setCellValue(‘E’.$IndexLigne, $pdl[‘pdl’]);
    $feuille->setCellValue(‘F’.$IndexLigne, $pdl[‘gestionnaire’]);
    $feuille->setCellValue(‘G’.$IndexLigne, $pdl[‘date_resiliation’]);
    $feuille->setCellValue(‘H’.$IndexLigne, $pdl[‘semaine_libre’]);
    $feuille->setCellValue(‘I’.$IndexLigne, $pdl[‘situation_compteur’]);
    $feuille->setCellValue(‘J’.$IndexColumn,$IndexLigne, $pdl[‘tel’]);
    $feuille->setCellValue(‘K’.$IndexColumn,$IndexLigne, $pdl[‘mail’]);
    }
    }

    et voila l’erreur:

    Fatal error: Uncaught exception ‘PHPExcel_Exception’ with message ‘Invalid cell coordinate AM FOURTIER BENOIT’ in
    C:\Users\ghizlane\Desktop\xamp\htdocs\Gestion_Bailleur\Bibliotheque\PHPExcel\Classes\PHPExcel\Cell.php:558 Stack trace: #0
    C:\Users\ghizlane\Desktop\xamp\htdocs\Gestion_Bailleur\Bibliotheque\PHPExcel\Classes\PHPExcel\Worksheet.php(1227): PHPExcel_Cell::coordinateFromString(‘AM FOURTIER BEN…’) #1
    C:\Users\ghizlane\Desktop\xamp\htdocs\Gestion_Bailleur\Bibliotheque\PHPExcel\Classes\PHPExcel\Worksheet.php(1186): PHPExcel_Worksheet->_createNewCell(‘AM FOURTIER BEN…’) #2
    C:\Users\ghizlane\Desktop\xamp\htdocs\Gestion_Bailleur\Bibliotheque\PHPExcel\Classes\PHPExcel\Worksheet.php(1095): PHPExcel_Worksheet->getCell(‘AM FOURTIER BEN…’) #3
    C:\Users\ghizlane\Desktop\xamp\htdocs\Gestion_Bailleur\Controllers\Rechercher.php(91): PHPExcel_Worksheet->setCellValue(‘AM FOURTIER BEN…’, ‘M FOURTIER BENO…’) #4 {main} thrown in
    C:\Users\ghizlane\Desktop\xamp\htdocs\Gestion_Bailleur\Bibliotheque\PHPExcel\Classes\PHPExcel\Cell.php on line 558

    « merci d’avance »

Laisser un commentaire

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

*