Objectif
L’objectif de ces 4 fonctions est de générer un fichier Excel à la volée depuis une page PHP. Le contenu de la feuille Excel provient de deux tableaux PHP.
Code
<?php function xlsBOF() { echo pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0); return; } function xlsEOF() { echo pack("ss", 0x0A, 0x00); return; } function xlsWrite($Row, $Col, $Value ) { $L = strlen($Value); echo pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L); echo $Value; return; } function xlsGenerateFile($headers,$content,$filename) { header("Pragma: public"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Content-Type: application/force-download"); header("Content-Type: application/octet-stream"); header("Content-Type: application/download");; header("Content-Disposition: attachment;filename=$filename "); header("Content-Transfer-Encoding: binary "); xlsBOF(); // Make column labels from array $headers for($i=0;$i<count($headers);$i++) { xlsWriteLabel(0,$i,$headers[$i]); } $xlsRow = 1; // Put data records from array $content for($i=0;$i<count($content);$i++) { $xlsCol = 0; foreach($content[$i] as $key=>$value) { xlsWrite($xlsRow,$xlsCol,$value); $xlsCol++; } $xlsRow++; } xlsEOF(); exit(); }
Explications
La fonction xlsBOF() initialise le fichier.
La fonction xlsEOF() termine le fichier
La fonction xlsWrite() va écrire une ligne dans le fichier Excel.
La fonction xlsGenerateFile() va quand à elle utiliser les fonctions précédentes pour générer le fichier Excel.
Elle modifie les headers en premier lieu (ce qui signifie que cette fonction doit être utilisée dans une page PHP n’ayant pas encore initialisé d’headers!) afin que le fichier généré soit traité comme un fichier Excel par le navigateur.
Elle va ensuite écrire une première ligne avec l’ensemble des entêtes de colonnes qui seront contenues dans le tableau $headers.
Puis elle va parcourir le tableau de contenu $content (tableau à 2 dimensions) pour remplir le fichier excel. Typiquement ce tableau est un résultat d’une requête mySQL.
Exemple
Petit exemple pour montrer le fonctionnement.
<?php $headers = array("Num.", "Utilisateur", "Chemin"); $content[0]['num'] = "1"; $content[0]['user'] = "Foo"; $content[0]['path'] = "/home/foo"; $content[1]['num'] = "2"; $content[1]['user'] = "Bar"; $content[1]['path'] = "/home/Bar"; xlsGenerateFile($headers,$content,'users.xls')";
Dans cet exemple, le tableau $content est le résultat d’une requête SQL. Le résultat sera donc le suivant: