Aller au contenu | Aller au menu | Aller à la recherche


PHP Excel et CSV

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 :

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

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:

  1. Doubler tout séparateur de chaîne trouvé dans la cellule ( ga"bu"zo ---> ga""bu""zo )
  2. Quoter systématiquement le contenu de chaque cellule ( toto > "toto" )
  3. Puis ajouter les cellules entre elles en séparant par une virgule. ( "toto","titi","tata" )
  4. Puis ajouter les lignes entre elles en séparant par \r\n

Commentaires

1. Le mardi, janvier 14 2014, 15:21 par Kevin

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 :-)

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

Fil des commentaires de ce billet