PHP Excel et CSV
Par PlaceOweb le jeudi, septembre 1 2011, 00:12 - PHP - Lien permanent
Générer des fichiers .csv, .xls ou .xlsx avec PHP. Comment créer des onglets, feuilles ou classeurs ? Comment formater le style ? Colorier une cellule...
XLS (Excel)
Un bon article sur la création de fichiers Excel nous indique
PHPExcel 2007
Le projet PHPExcel, constitue un ensemble de classes destinées à la génération de fichiers Excel 2007 et Excel2003 , Excel 5. Elle permet de lire lire et écrire des .csv, .xls, .xlsx, .html
A l'utilisation, pour la génération de fichier csv de 250 colonnes et 8000 lignes, cela prends 100% du CPU durant 3 minutes... alors qu'une simple boucle avec un echo "'".$valeur."';" prends ni CPU ni temps. Je déconseille donc de se baser sur cette classe pour générer un simple csv (a moins que vous ayez des ressources CPU à consommer et du temps à perdre).
Mais pour générer ou compléter des documents xls (Excel5) ou xlsx (Excel2007) cela est parfait, voyez par exemple :
- Introduction à PHPExcel
- Spreadsheet_Excel_Writer en PHP
- Aide de feuille de calcul Excel Simple
- et lisez une copie de l'officielle documentation de l'API PHPExcel en ligne,
- ainsi que le PHPExcel Cheatsheet
Notes sur PHPExcel et la génération de ficher Excel :
Mettre des bordures sur une cellule fusionnée (style)
Bien que vous ayez fusionner les 9 premières cellules, il vous faudrait décorer chacune de ces cellules fusionnées (le style ne s'appliquant qu'a la cellule que vous spécifiez)
$objPHPExcel->getActiveSheet()->mergeCellsByColumnAndRow($pColumn,$pRow,8,$pRow); // Fusion des cellules for( $i = 0; $i< 9; $i++) { $objPHPExcel->getActiveSheet()->getStyleByColumnAndRow($i, $pRow)->getBorders()->applyFromArray( array( 'allborders' => array( 'style' => PHPExcel_Style_Border::BORDER_MEDIUM ) ) ); }
Colorier une cellule avec une couleur de fond avec sa valeur hexa
/* * http://fr.wikipedia.org/wiki/Couleurs_du_Web * http://www.javascripter.net/faq/rgbtohex.htm * Rouge foncé (standard) => 192 0 0 => C00000 Rouge (standard) : 255 0 0 => FF0000 Orange (standard) : 255 192 0 => FFBE00 Jaune (standard) : 255 255 0 => FFFF00 Vert (standard) : 146 208 80 => 92D050 Vert foncé (standard) : 0 176 80 => 00B050 Vert : 0 255 0 => 00FF00 Bleu clair (standard) : 0 176 240 => 00B0F0 Bleu (standard) : 0 112 192 => 0070C0 Bleu foncé (standard) : 0 32 96 => 002060 Bleu : 0 0 255 => 0000FF Violet (standard) : 112 48 160 => 7030A0 */ $color = '00FF00'; $objPHPExcel->getActiveSheet()->getStyle('J1')->getFill()->applyFromArray( array( 'type' => PHPExcel_Style_Fill::FILL_SOLID, 'rotation' => 0, 'startcolor' => array( 'argb' => $color ), 'endcolor' => array( 'argb' => $color ) ) ); // Voyez aussi : PHPExcel_Style_Color::COLOR_BLUE
Le nombre de feuilles (sheet) dans le document Excel
$feuilles_nbr = $objPHPExcel->getSheetCount(); echo $feuilles_nbr . " feuilles dans ce fichier Excel." . PHP_EOL;
Le nom des feuilles (sheet) du document Excel
$feuilles = $objPHPExcel->getSheetNames(); print_r($feuilles); // Un tableau de string (utf-8)
Modifier le nom d'une feuille
$objPHPExcel->getActiveSheet()->setTitle($nouveauNomDeFeuilleQuiRespecteLeStandardsDeNommageExcel);
// Avec création de la feuille $sheetId = 1; $this->objPHPExcel->createSheet(NULL, $sheetId); $this->objPHPExcel->setActiveSheetIndex($sheetId); $this->objPHPExcel->getActiveSheet()->setTitle($index);
Lecture d'une feuille Excel comme un tableau PHP
foreach( $objPHPExcel->getSheet()->toArray() as $ligne => $tab ) { print_r($tab); }
PHPExcel 1.7.5 Production : Attention aux différences dans les lignes avec des colonnes vides : CSV worksheet->toArray skips empty cells => This problem has been resolved in the latest SVN code.
Depuis le 2011-02-27, la version stable de PHPExcel v1.7.6 corrige ce problème de la version précédente PHPExcel v1.7.5 du 2010-12-10.
Les objets spéciaux : CheckBox Cases à cocher, Images transparentes, Connecteur Droit, Ellipse, TextBox
Aucun de ces objets n'est implémenté, s'il y en a dans votre document xls initial, PHPExcel vous fera un erreur de lorsque vous le manipulerez. Objets Excel bloquant pour un traitement avec PHPExcel :
- CheckBox Cases à cocher
- TextBox
- Connecteur Droit
- Ellipse
- Images transparentes (ne plante pas mais ne s'affiche pas)
Voyez les demandes de fonctionnalités dans PHPExcel : Feature requests
Les cases à cocher (checkbox) dans les form ou activeX
PHPExcel ne gère pas les cases à cocher. Snif...
PHPExcel - Discussions - Retrieve the value of a checkbox Form elements (including checkboxes) are not supported by PHPExcel.
Comments - PHPExcel, PHPExcel currently features Does PHPExcel support definition of radio button and checkbox controls?
Checkboxes + Templates I have a Template that contains Checkboxes. When I populate the template with data and present it to the user to OPen the Checkboxes are gone. This is with excel5 is there a plan to implement support for Form Controls?
Eventually, yes. But it isn't currently high on the list of priorities, fgalling well behind performance/memory improvements, charting and pivot tables.
Cacher ou supprimer des feuilles avec PHPExcel
Visibilité d'une feuille : Class: PHPExcel_Worksheet
- SHEETSTATE_HIDDEN = 'hidden'
- SHEETSTATE_VERYHIDDEN = 'veryHidden'
- SHEETSTATE_VISIBLE = 'visible'
Suppression d'une feuille : removeSheetByIndex
$objPHPExcel->setActiveSheetIndexByName('F3'); // Cacher une feuille Excel $objPHPExcel->getActiveSheet()->setSheetState(PHPExcel_Worksheet::SHEETSTATE_VERYHIDDEN); // http://www.placeoweb.com/doc/PHPExcel/PHPExcel_Worksheet/PHPExcel_Worksheet.html // Supprimer une feuille Excel $objPHPExcel->removeSheetByIndex($objPHPExcel->getIndex($objPHPExcel->getActiveSheet())); // http://www.placeoweb.com/doc/PHPExcel/PHPExcel/PHPExcel.html#methodremoveSheetByIndex
PEAR::Spreadsheet_Excel_Writer
La classe PEAR::Spreadsheet_Excel_Writer est très complète et s'appuie sur le format BIFF5, utilisé par Excel dans sa version 5.0. Elle permet un minimum de mise en forme, et la génération de classeurs (plusieurs feuilles au sein d'un même fichier).
PEAR et générer du CSV en fichier ou à la volée
- File: Common file and directory routines, also CSV handling
- File_CSV: Read and write of CSV files
- Structures_DataGrid_DataSource_CSV: DataSource driver using CSV files
- Structures_DataGrid_Renderer_CSV: Renderer driver that generates a CSV string
Limitation d'Excel
Avant Excel 2007, cette erreur se produit généralement lorsque vous essayez d'ouvrir un fichier de plus de 65 536 lignes ou 256 colonnes. Une feuille de calcul Excel ne peut contenir plus de 65 536 lignes de données et 256 colonnes. Vous pouvez créer plusieurs feuilles de calcul ayant le nombre maximum de lignes et de colonnes, mais une telle quantité de données est souvent trop importante pour un seul classeur (fichier). Le nombre de feuilles de calcul par classeur n'est limité que par la quantité de mémoire disponible sur votre ordinateur. Par défaut, Excel est capable de gérer 3 feuilles de calcul, plus si vous disposez de suffisamment de mémoire pour la quantité de données contenues sur chaque feuille. La troncation des lignes et des colonnes surnuméraires est automatique et non configurable. Une solution typique à ce problème consiste à ouvrir le fichier source dans un éditeur de texte, tel que Microsoft Office Word, et à l'enregistrer en plusieurs fichiers dont le nombre de lignes et de colonnes ne dépasse pas les valeurs limites pour les feuilles de calcul Excel. Ces fichiers peuvent ensuite être ouverts et importés dans des feuilles de calcul Excel. Si vous utilisez un format de données incompatible avec l'utilisation d'un éditeur de texte, il sera plus facile d'importer les données dans Microsoft Office Access et d'utiliser ensuite la fonction exporter d'Access pour importer les données dans un format Excel. D'autres méthodes d'importation de fichiers volumineux dans plusieurs feuilles de calcul sont disponibles, mais elles sont sans doute plus complexes que l'utilisation d'un éditeur de texte ou d'Access. En savoir plus sur ce message d'erreur en ligne.
Exporter à coup sûr du CSV
Pour exporter à coup sûr (même si vos cellules contiennent des virgules, des espaces, des guillemets ou même des retours à la ligne) vos données en CSV:
- Doubler tout séparateur de chaîne trouvé dans la cellule ( ga"bu"zo ---> ga""bu""zo )
- Quoter systématiquement le contenu de chaque cellule ( toto
> "toto" ) - Puis ajouter les cellules entre elles en séparant par une virgule. ( "toto","titi","tata" )
- Puis ajouter les lignes entre elles en séparant par \r\n
Commentaires
Bonjour, merci pour ce tuto mais j'ai un petit conseil à donner sur le point suivant :
"Mettre des bordures sur une cellule fusionnée (style)
Bien que vous ayez fusionner les 9 premières cellules, il vous faudrait décorer chacune de ces cellules fusionnées (le style ne s'appliquant qu'a la cellule que vous spécifiez)"
Effectivement, il faut bel et bien décorer chaque cellules. Mais pourquoi faire une boucle?
Personnellement, je fais appel à la méthode applyFromArray et j'ai séparé mon style :
$sheet->mergeCells('G1':J1');
$sheet->getStyle('G1':J1')->applyFromArray(FichierExcelStyles::getStyleHeader());
Il suffit juste de lui donner la plage de cellules fusionnées :-)