Page 1

Introduction à PHPExcel

par Ernaelsten Gérard (MaitrePylos) Date de publication : 05/02/2009 Dernière mise à jour : 14/07/2010

Nous allons voir dans cet article une bibliothèque orientée objet (PHP 5), la génération de feuilles de calcul sous différents formats d'exportation et/ou d'enregistrement. Cette bibliothèque étant assez conséquente, et mon apprentissage de celle-ci ne faisant que de commencer, nous aurons un article construit au fil du temps.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos)

Avant-propos................................................................................................................................................................ 4 PHPExcel................................................................................................................................................................ 4 1.1 - Téléchargement........................................................................................................................................4 1.2 - Spécificités................................................................................................................................................4 1.3 - Testé sur ..................................................................................................................................................4 Premier fichier.............................................................................................................................................................. 6 2.1 - MaitrePylos en A1......................................................................................................................................... 6 2.2 - Dans un autre format.................................................................................................................................... 7 2.2.1 - Excel5.................................................................................................................................................... 7 2.2.2 - PDF........................................................................................................................................................7 2.2.3 - HTML..................................................................................................................................................... 8 2.2.4 - CSV....................................................................................................................................................... 8 2.2.5 - Excel 2007 - compatible 2003.............................................................................................................. 8 2.3 - Afficher le tableur...........................................................................................................................................8 2.3.1 - Excel 2007 sur le navigateur................................................................................................................ 8 Excel 5......................................................................................................................................................... 9 PDF.............................................................................................................................................................. 9 CSV.............................................................................................................................................................. 9 HTML............................................................................................................................................................9 Pour la suite...créons nos outils................................................................................................................................ 10 3.1 - Etendre PHPExcel....................................................................................................................................... 10 3.2 - Petit exemple............................................................................................................................................... 12 3.3 - Les formules................................................................................................................................................ 12 3.4 - Multi feuilles (sheets)...................................................................................................................................12 Mise en forme............................................................................................................................................................ 14 4.1 - La classe de style "Font".............................................................................................................................14 4.1.1 - MaitrePylos en vert............................................................................................................................. 14 4.1.2 - applyFromArray................................................................................................................................... 15 4.2 - PHPExcel_Style........................................................................................................................................... 16 4.2.1 - applyFromArray de PHPExcel_Style...................................................................................................16 4.2.1.1 - Format de cellule..............................................................................................................................17 4.2.1.2 - Alignement de la cellule................................................................................................................... 18 4.2.1.3 - Les autres styles de PHPExcel_Style_Alignment............................................................................ 18 4.3 - Les bordures................................................................................................................................................19 4.3.1 - Toutes les bordures.............................................................................................................................20 4.4 - Le fond de la cellule....................................................................................................................................20 4.5 - Les images.................................................................................................................................................. 21 Style par défaut..........................................................................................................................................................23 5.1 - Dupliquer le style.........................................................................................................................................23 Les formats de cellules..............................................................................................................................................25 6.1 - PHPExcel_Cell_DataType........................................................................................................................... 25 Vite dit........................................................................................................................................................................ 26 7.1 - Fusion de cellules........................................................................................................................................26 7.2 - Largeur de colonne..................................................................................................................................... 26 7.3 - Hauteur de ligne.......................................................................................................................................... 26 7.4 - Taille de la page.......................................................................................................................................... 26 7.5 - Orientation de la page.................................................................................................................................27 7.6 - Freeze Pane................................................................................................................................................ 28 Ca existe aussi.......................................................................................................................................................... 29 Travailler avec l'existant.............................................................................................................................................30 8 - Lire un fichier Excel........................................................................................................................................30 8.1 - Ecrire dans un fichier existant !...................................................................................................................31 8.2 - Connaître son fichier....................................................................................................................................32 8.2.1 - Le nom des sheets............................................................................................................................. 32 8.2.2 - L'index des sheets.............................................................................................................................. 32 8.3 - Fusionner plusieurs fichiers Excel...............................................................................................................32 8.3.1 - Utiliser plusieurs fois le même sheet.................................................................................................. 33 Extraire des images................................................................................................................................................... 34 -2Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos)

Conclusion..................................................................................................................................................................35 Merci..................................................................................................................................................................... 35 Liens......................................................................................................................................................................35

-3Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos)

Avant-propos Lors de la rédaction de l'article sur Spreadsheet_Excel_Writer en PHP , Yogui , m'avait demandé si j'allais faire un parallèle avec la classe PHPExcel . Ne connaissant pas cette classe, je n'avais pas répondu positivement à cette demande. Et je ne vais toujours pas le faire ici, parce que nous ne sommes pas à faire un parallèle, mais bien à découvrir un outil puissant qui va nous rendre de grands services dans la génération de nos tableurs.

PHPExcel PHPExcel va nous proposer la génération des formats suivants : • • • • • •

Excel 2007 Excel 2007 - compatible Excel 2003 Excel 5 - via la librairie Spreadsheet_Excel_Writer PDF - via la librairie FPDF CSV HTML

En plus, PHPExcel va affiner nos tableurs avec des éléments tel que : • • • • •

Formater les cellules. Ajouter des formules Ajouter des images Protéger les données, les cellules ....

1.1 - Téléchargement Pour commencer, nous allons télécharger la librairie PHPExcel , ce fichier comporte la librairie dans le répertoire ./ Classes, nous avons également l'API dans le répertoire ./Documentation , ainsi qu'un répertoire ./Tests avec un certain nombre d'exemples. Il faut extraire le répertoire ./Classes et le déposer dans le répertoire de votre Web serveur.

1.2 - Spécificités PHPExcel ne fonctionne qu'avec PHP 5 et réclame des extensions spécifiques pour fonctionner correctement. Ces extensions sont : • • •

Zip GD XML

Vous pouvez vérifier que vous avez ces extensions avec la fonction. phpinfo();

1.3 - Testé sur .... J'ai testé tous les exemples sur différents OS et tableurs.

-4Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos)

• • • •

O0o 2.4 / Debian O0o 3.0 / Debian Excel 2007 /VirtualBox/Windows XP Excel 2007 /Windows Serveur 2003

On peut retrouver quelques différences entre les versions de tableurs, notamment au niveau des couleurs de remplissage des cellules, ou encore dans les bordures, Ooo 2.4 ne reconnaît pas les formats type Dash Dot (BORDER_DASHDOT). Sur le serveur 2003 en production avec PHP 5.2.6 , j'ai été confronté à un souci de dll ( "php_zip.dll"), cela tronque le fichier. Sur le forum de PHPExcel il est conseillé de télécharger une autre version de php_zip.dll, notamment sur http:// snaps.php.net

-5Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos)

Premier fichier Nous allons voir comment créer notre premier fichier au format Excel 2007

2.1 - MaitrePylos en A1 include 'PHPExcel.php'; include 'PHPExcel/Writer/Excel2007.php'; $workbook = new PHPExcel; $sheet = $workbook->getActiveSheet(); $sheet->setCellValue('A1','MaitrePylos'); $writer = new PHPExcel_Writer_Excel2007($workbook); $records = './fichier.xlsx'; $writer->save($records);

Ce code enregistre un fichier nommé 'fichier.xlsx' sur le disque dur du serveur, il n'apparaîtra pas sur le navigateur. Il faut d'abord inclure les fichiers nécessaires à la génération du tableur include 'PHPExcel.php'; include 'PHPExcel/Writer/Excel2007.php';

Ensuite nous instancions notre objet PHPExcel $workbook = new PHPExcel;

Nous activons la feuille sur laquelle nous allons travailler (la feuille par défaut), grâce à la méthode ->getActiveSheet(). $sheet = $workbook->getActiveSheet();

Lors de l'instanciation de notre objet PHPExcel, le constructeur a également instancié diverses classes, notamment la classe PHPExcel_Worksheet et la méthode getActiveSheet nous donnes donc la main sur cet objet. Nous remplissons notre première cellule avec la méthode ->setCellValue() $sheet->setCellValue('A1','MaitrePylos');

Vous remarquerez que, pour désigner la cellule, la méthode ->setCellValue() accepte son nom de tableau à double entrée. Il existe une autre méthode pour désigner la cellule que l'on veut modifier.

-6Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos)

$sheet->setCellValueByColumnAndRow(1, 4, 'MaitrePylos');

Cette méthode prend trois paramètres : • • •

La ligne La colonne La valeur Notez que dans le cas de cette méthode, la ligne commence à partir de zéro(0), et la colonne commence à un (1).

Enfin pour créer le fichier, nous devons instancier un objet writer, spécifique au type de tableau que nous voulons générer. $writer = new PHPExcel_Writer_Excel2007($workbook);

Nous donnons un nom à notre fichier, et l'enregistrons

$records = './fichier.xlsx'; $writer->save($records);

Vous prêterez une attention toute particulière à l'extension du fichier, en l'occurrence ici "xlsx".

2.2 - Dans un autre format Pour enregistrer le fichier dans un autre format, il faut juste 3 modifications au script précédent

2.2.1 - Excel5 include 'PHPExcel/Writer/Excel5.php'; ... $writer = new PHPExcel_Writer_Excel5(); ... $records = './fichier.xls';

2.2.2 - PDF include 'PHPExcel/Writer/PDF.php'; ... $writer = new PHPExcel_Writer_PDF(); $writer->setSheetIndex(0);//Une seule feuille possible ... $records = './fichier.pdf';

Dans la génération des fichiers de types PDF, HTML, il n'est possible que de travailler sur une seule feuille, et nous devons lui indiquer laquelle, via la méthode ->setSheetIndex() -7Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos)

2.2.3 - HTML include 'PHPExcel_Writer/HTML.php'; ... $writer = new PHPExcel_Writer_HTML(); $writer->setSheetIndex(0);//Une seule feuille possible ... $records = './fichier.html';

2.2.4 - CSV include 'PHPExcel/Writer/CSV.php'; ... $writer = new PHPExcel_Writer_CSV(); $writer->setDelimiter(",");//l'opérateur de séparation est la virgule $writer->setSheetIndex(0);//Une seule feuille possible ... $records = './fichier.csv';

Dans le cadre d'un fichier de type CSV, il faut en plus noter le séparateur, ce qui est le rôle de la méthode ->setDelimiter().

2.2.5 - Excel 2007 - compatible 2003 Pour assurer une compatibilité avec Excel 2003, il suffit de mettre la méthode ->setOffice2003Compatibility(), à true. $writer = new PHPExcel_Writer_Excel2007($workbook); $writer->setOffice2003Compatibility(true); $records = './fichier.xlsx'; $writer->save($records);

2.3 - Afficher le tableur Il est également possible de générer un tableur et de l'afficher plutôt que de l'enregistrer. Pour se faire, il faut passer les entêtes à la sortie standard.

2.3.1 - Excel 2007 sur le navigateur include 'PHPExcel.php'; include 'PHPExcel/Writer/Excel2007.php'; $workbook = new PHPExcel; $sheet = $workbook->getActiveSheet(); $sheet->setCellValue('A1','MaitrePylos'); $writer = new PHPExcel_Writer_Excel2007($workbook); header('Content-type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');

-8Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos) header('Content-Disposition:inline;filename=Fichier.xlsx '); $writer->save('php://output');

Ici, le fichier va demander à être ouvert via votre logiciel de tableur. Les autres possibilités sont :

Excel 5 header('Content-type: application/vnd.ms-excel');

PDF header('Content-type: application/pdf');

CSV header('Content-type: text/csv');

HTML header('Content-type: text/html');

-9Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos)

Pour la suite...créons nos outils Pour la suite de cet article, je me baserai sur l'affichage du tableur. Afin de ne pas réécrire l'ensemble des codes, je vais étendre la classe PHPExcel, et commencer à créer des outils personnalisés pour la génération des fichiers.

3.1 - Etendre PHPExcel Soit la nouvelle classe suivante : /** * Classe étendue de PHPExcel. * Cette classe permet la génération dynamique * de fichier tableur suivant différent format. * * @copyright 2008 MaitrePylos Technologies (Formatux.be) * @author Ernaelsten Gerard * @license GPL * @version Release: 0.1 */ require 'PHPExcel.php'; class MaitrePylosExcel extends PHPExcel { public function __construct() { parent::__construct(); } /** * Méthode englobant une fonction switch pour le choix du format de tableur. * @method affiche * @param String $format * @param String $nomFichier * @example $workbook->affiche('Excel2007','MonFichier'); */ public function affiche($format = 'Excel5',$nomFichier = 'Tableur'){ switch($format){ case 'Excel2007' : include 'PHPExcel/Writer/Excel2007.php'; $writer = new PHPExcel_Writer_Excel2007($this); $ext = 'xlsx'; $header = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; //supprime le pré-calcul $writer->setPreCalculateFormulas(false); break; case 'Excel2003' : include 'PHPExcel/Writer/Excel2007.php'; $writer = new PHPExcel_Writer_Excel2007($this); $writer->setOffice2003Compatibility(true); $ext = 'xlsx'; $header = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; //supprime le pré-calcul $writer->setPreCalculateFormulas(false); break; case 'Excel5' : include 'PHPExcel/Writer/Excel5.php'; $writer = new PHPExcel_Writer_Excel5($this); $ext = 'xls'; $header = 'application/vnd.ms-excel'; break; case 'CSV' : include 'PHPExcel/Writer/CSV.php'; $writer = new PHPExcel_Writer_CSV($this); $writer->setDelimiter(",");//l'opérateur de séparation est la virgule - 10 Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos) $writer->setSheetIndex(0);//Une seule feuille possible $ext = 'csv'; $header = 'text/csv'; break; case 'PDF' : include 'PHPExcel/Writer/PDF.php'; $writer = new PHPExcel_Writer_PDF($this); $writer->setSheetIndex(0);//Une seule feuille possible $ext = 'pdf'; $header = 'application/pdf'; break; case 'HTML' : include 'PHPExcel/Writer/HTML.php'; $writer = new PHPExcel_Writer_HTML($this); $writer->setSheetIndex(0);//Une seule feuille possible $ext = 'html'; $header = 'text/html'; break; }

}

header('Content-type:'.$header); header('Content-Disposition:inline;filename='.$nomFichier.'.'.$ext); $writer->save('php://output');

/** * Méthode englobant une fonction switch pour le choix du format de tableur. * @method enregistre * @param String $format * @param String $nomFichier * @example $workbook->enregistre('Excel2007','MonFichier'); */ public function enregistre($format = 'Excel5',$nomFichier = 'Tableur'){ switch($format){ case 'Excel2007' : include 'PHPExcel/Writer/Excel2007.php'; $writer = new PHPExcel_Writer_Excel2007($this); $ext = 'xlsx'; //supprime le pré-calcul $writer->setPreCalculateFormulas(false); break; case 'Excel2003' : include 'PHPExcel/Writer/Excel2007.php'; $writer = new PHPExcel_Writer_Excel2007($this); $writer->setOffice2003Compatibility(true); $ext = 'xlsx'; //supprime le pré-calcul $writer->setPreCalculateFormulas(false); break; case 'Excel5' : include 'PHPExcel/Writer/Excel5.php'; $writer = new PHPExcel_Writer_Excel5($this); $ext = 'xls'; break; case 'CSV' : include 'PHPExcel/Writer/CSV.php'; $writer = new PHPExcel_Writer_CSV($this); $writer->setDelimiter(",");//l'opérateur de séparation est la virgule $writer->setSheetIndex(0);//Une seule feuille possible $ext = 'csv'; break; case 'PDF' : include 'PHPExcel/Writer/PDF.php'; $writer = new PHPExcel_Writer_PDF($this); $writer->setSheetIndex(0);//Une seule feuille possible $ext = 'pdf'; break; case 'HTML' : include 'PHPExcel/Writer/HTML.php'; - 11 Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos) $writer = new PHPExcel_Writer_HTML($this); $writer->setSheetIndex(0);//Une seule feuille possible $ext = 'html'; break; } $writer->save($nomFichier.'.'.$ext); }

}

3.2 - Petit exemple Nous utiliserons cette classe de cette façon :

include 'MaitrePylosExcel.php'; $workbook = new MaitrePylosExcel(); $sheet = $workbook->getActiveSheet(); $sheet->setCellValue('A1','MaitrePylos'); $workbook->affiche('Excel2007','MonPremierFichier');

Vous prêterez attention au fait que dans l'article j'utilise la variable $sheet, qui sera le remplacement de $workbook->getActiveSheet(), dans les exemples fournis par l'application, ils utiliseront plus l'écriture $workbook->getActiveSheet()->getFont(), or je privilégie $sheet->getFont(), gardez bien cela à l'esprit.

3.3 - Les formules Pour introduire des formules dans le fichier , il suffit de passer en argument la dite formule.

include 'MaitrePylosExcel.php'; $workbook = new MaitrePylosExcel(); $sheet = $workbook->getActiveSheet(); $sheet->setCellValue('A1',4); $sheet->setCellValue('A2',5); $sheet->setCellValue('A3','=SUM(A1:A2)'); $workbook->affiche('Excel2007','MaPremiereFormule');

3.4 - Multi feuilles (sheets) Ici nous allons voir comment faire pour avoir plusieurs feuilles dans le tableur. Le fait d'avoir plusieurs feuilles ne vous permettra pas de générer le tableur dans les formats suivants :

- 12 Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos)

• • •

PDF CSV HTML

Ces format ne permettant que la génération d'une seule feuille. Lors de la création de votre document, une feuille est automatiquement créée, et nous en prenons possession avec la méthode getActiveSheet().

include 'MaitrePylosExcel.php'; $workbook = new MaitrePylosExcel(); $sheet = $workbook->getActiveSheet(); $workbook->affiche('Excel2007','MaPremiereFormule');

Pour donner un nom à cette feuille, on utilise la méthode setTitle() $sheet->setTitle('feuille 1');

Pour créer de nouvelles feuilles, nous utiliserons la méthode createSheet() de la classe PHPExcel, qui elle même instancie la classe PHPExcel_WoorkSheet. /********************************************************* * * Création de la deuxième feuille *******************************************************/ //création de la nouvelle feuille $sheet2 = $workbook->createSheet(); //nom de la feuille $sheet2->setTitle('feuille 2');

/********************************************************* * * Création de la troisème feuille *******************************************************/ $sheet3 = $workbook->createSheet(); $sheet3->setTitle('feuille 3'); /********************************************************* * * Création de la quatrième feuille *******************************************************/ $sheet4 = $workbook->createSheet(); $sheet4->setTitle('feuille 4');

- 13 Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos)

Mise en forme PHPExcel nous offre 8 classes pour mettre en forme nos cellules : • • • • • • • •

PHPExcel_Style PHPExcel_Style_Fill PHPExcel_Style_Font PHPExcel_Style_Border PHPExcel_Style_Borders PHPExcel_Style_Alignment PHPExcel_Style_NumberFormat PHPExcel_Style_Protection

Nous n'allons pas voir l'ensemble des classes, mais nous verrons les 2-3 approches qu'il est possible de faire, ensuite je vous renvoie vers la documentation officielle, pour explorer plus en avant l'ensemble des classes.

4.1 - La classe de style "Font" Dans la classe PHPExcel_Style_Font, les méthodes importantes sont les suivantes : • • • • • • • • •

setName() setBold() setItalic() setUnderline() setStriketrough() getColor() setSize() setSuperScript() setSubScript()

La plupart de celles-ci sont assez explicites.

4.1.1 - MaitrePylos en vert... Nous allons mettre en forme une cellule en fonction des critères suivants : • • • •

En gras De taille 12 De police 'Arial' De couleur Verte

Pour ce faire il suffit d'écrire le code suivant : $workbook = new MaitrePylosExcel(); $sheet = $workbook->getActiveSheet(); $styleA1 = $sheet->getStyle('A1'); $styleFont = $styleA1->getFont(); $styleFont->setBold(true); $styleFont->setSize(12); $styleFont->setName('Arial'); $styleFont->getColor()->setARGB(PHPExcel_Style_Color::COLOR_GREEN); $sheet->setCellValue('A1','MaitrePylos'); $workbook->affiche('Excel2007','MonPremierFichier'); - 14 Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos)

Nous allons passer en revue ce code bien comprendre ce qu'il se passe. $styleA1 = $sheet->getStyle('A1');

getStyle() est une méthode de la classe PHPExcel_Worksheet qui instancie la classe PHPExcel_Style (que nous verrons plus tard), on lui passe en paramètre la cellule visée. $styleFont = $styleA1->getFont();

getFont() est donc une méthode de la classe PHPExcel_Style, qui instancie la classe PHPExcel_Style_Font. A partir de cette instanciation nous pouvons utiliser les méthodes de PHPExcel_Style_Font. $styleFont->setBold(true);//passage à true de façon à activer la graisse. $styleFont->setSize(12);//taille de la police $styleFont->setName('Arial');//nom de la police $styleFont->getColor()->setARGB(PHPExcel_Style_Color::COLOR_GREEN);

Pour la couleur, c'est un peu plus compliqué, il faut repasser par une nouvelle classe PHPExcel_Style_Color Celle-ci défini un certain nombre de constantes que voici : Constante

COLOR_BLACK COLOR_WHITE COLOR_RED COLOR_DARKRED COLOR_BLUE COLOR_DARKBLUE COLOR_GREEN COLOR_DARKGREEN COLOR_YELLOW COLOR_DARKYELLOW

'FF000000' 'FFFFFFFF' 'FFFF0000' 'FF800000' 'FF0000FF' 'FF000080' 'FF00FF00' 'FF008000' 'FFFFFF00' 'FF808000'

Valeur

Ainsi que deux méthodes : setARGB(), que vous connaissez déjà (voir exemple ci-dessus) et qui prend en paramètre une des constantes. setRGB(), qui, elle prend en paramètre le code HTML de la couleur : $styleFont->getColor()->setRGB('FF00FF00');

4.1.2 - applyFromArray Il y a moyen d'alléger ce code. En effet, la classe PHPExcel_Style_Font propose une méthode applyFromArray() qui prend un tableau en paramètre afin de ne pas utiliser les setter et getter de la classe et de rendre le code plus lisible. Les mots clés de ce tableau sont : • • •

name bold italic

- 15 Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos)

• • • • • •

underline strike color size superScript subScript

Les noms sont fort proches des méthodes, et pour cause, elles utiliseront celles-ci, pour définir notre style de cellule. Notre nouveau code sera donc : $styleA1 = $sheet->getStyle('A1'); $styleFont = $styleA1->getFont() ->applyFromArray(array( 'bold'=>true, 'size'=>12, 'name'=>Arial, 'color'=>array( 'rgb'=>'FF00FF00')));

Ce simple tableau remplace tous les appels aux méthodes de PHPExcel_Style_Font, puisqu'il le fait lui-même. Vous remarquerez que color demande un nouveau tableau, parce que la classe PHPExcel_Style_Color à également une méthode applyFromArray, avec soit rgb ou argb.

4.2 - PHPExcel_Style PHPExcel_Style est la classe qui nous permet de travailler avec les autres classes de 'style'. Quand nous appelons la méthode getStyle(), en fait nous instancions la classe PHPExcel_Style, celle-ci dispose de méthodes nous permettant d'instancier les autres classes de styles, les méthodes sont : • • • • • •

getFill() getFont() getBorders() getAlignment() getNumberFormat() getProtection()

Chaque méthode instancie la classe par rapport à son nom : - getFont() instancie PHPExcel_Style_Font. - getAlignment() instancie PHPExcel_Style_Alignment. ...

4.2.1 - applyFromArray de PHPExcel_Style PHPExcel_Style dispose également d'une méthode applyFromArray contenant le tableau suivant : • • • • • •

fill font borders alignment numberformat protection

Notre code deviendra dès lors :

- 16 Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos)

$styleA1 = $sheet->getStyle('A1'); $styleA1->applyFromArray(array( 'font'=>array( 'bold'=>true, 'size'=>12, 'name'=>Arial, 'color'=>array( 'rgb'=>'FF00FF00')) ));

4.2.1.1 - Format de cellule On veut parfois obtenir un format d'affichage spécifique pour une cellule, comme par exemple les dates, on pourrait vouloir le format " yy-mm-dd" ou encore " dd/mm/yyyy". Pour cela la classe PHPExcel_Style_NumberFormat, vient à notre secours et ce de la même façon que vu au chapitre 4, traitant de la mise en forme. $sheet->getStyle('B43')->getNumberFormat()->applyFromArray( array( 'code' => PHPExcel_Style_NumberFormat::FORMAT_DATE_DDMMYYYY ) ); $sheet->setCellValue('B43', '=TODAY()');

De nouveau de façon très simple, la librairie PHPExcel, nous permet de définir un format précis, grâce à un certain nombre de constantes prédéfinies. Constante Valeur FORMAT_GENERAL 'General' FORMAT_NUMBER '0' FORMAT_NUMBER_00 '0.00' FORMAT_NUMBER_COMMA_SEPARATED1'#,##0.00' FORMAT_NUMBER_COMMA_SEPARATED2'#,##0.00_-' FORMAT_PERCENTAGE '0%' FORMAT_PERCENTAGE_00 '0.00%' FORMAT_DATE_YYYYMMDD 'yy-mm-dd' FORMAT_DATE_DDMMYYYY 'dd/mm/yy' FORMAT_DATE_DMYSLASH 'd/m/y' FORMAT_DATE_DMYMINUS 'd-m-y' FORMAT_DATE_DMMINUS 'd-m' FORMAT_DATE_MYMINUS 'm-y' FORMAT_DATE_DATETIME 'd/m/y h:mm' FORMAT_DATE_TIME1 'h:mm AM/PM' FORMAT_DATE_TIME2 'h:mm:ss AM/PM' FORMAT_DATE_TIME3 'h:mm' FORMAT_DATE_TIME4 'h:mm:ss' FORMAT_DATE_TIME5 'mm:ss' FORMAT_DATE_TIME6 'h:mm:ss' FORMAT_DATE_TIME7 'i:s.S' FORMAT_DATE_TIME8 'h:mm:ss;@' FORMAT_DATE_YYYYMMDDSLASH 'yy/mm/dd;@' FORMAT_CURRENCY_USD_SIMPLE '"$"#,##0.00_-' FORMAT_CURRENCY_USD '$#,##0_-' FORMAT_CURRENCY_EUR_SIMPLE '[$EUR ]#,##0.00_-' - 17 Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos)

Il peut paraître fastidieux de retenir toutes ces constantes, ou de devoir aller dans l'API pour retrouver le format qui nous convient. Dans ce cas, il suffit de passer un string en paramètre plutôt qu'une constante. $sheet->getStyle('B43')->getNumberFormat()->applyFromArray( array( 'code' => 'dd/mm/yyyy' ) );

4.2.1.2 - Alignement de la cellule Pour aligner nos cellules nous avons deux méthodes de la classe PHPExcel_Style_Alignment : setHorizontal() - prenant en paramètre : Constantes HORIZONTAL_GENERAL HORIZONTAL_LEFT HORIZONTAL_RIGHT HORIZONTAL_CENTER HORIZONTAL_JUSTIFY

'general' 'left' 'right' 'center' 'justify'

Valeur

setVertical() - prenant en paramètre : Constante VERTICAL_BOTTOM VERTICAL_TOP VERTICAL_CENTER VERTICAL_JUSTIFY

'bottom' 'top' 'center' 'justify'

Valeur

Voici un exemple d'utilisation $sheet->duplicateStyleArray(array( 'alignment'=>array( 'horizontal'=>PHPExcel_Style_Alignment::HORIZONTAL_CENTER), 'A21:F37');

4.2.1.3 - Les autres styles de PHPExcel_Style_Alignment Pour la rotation du texte , il suffit de passer l'angle voulu dans la méthode rotation(). $sheet->duplicateStyleArray(array( 'alignment'=>array( 'rotation'=>90), 'A21:F37');

Si vous utilisez une version inférieure à Excel 2007, seules les valeurs "0,90,180,270" seront acceptées La passage automatique à la ligne : 'Wrap' $sheet->duplicateStyleArray(array( - 18 Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos) 'alignment'=>array( 'wrap'=>true), 'A21:F37');

Ajuster les cellules : 'shrinkToFit' $sheet->duplicateStyleArray(array( 'alignment'=>array( 'shrinkToFit'=>true), 'A21:F37');

Tout en même temps : $sheet->duplicateStyleArray(array( 'alignment'=>array( 'shrinkToFit'=>true, 'wrap'=>true, 'rotation'=>90, 'horizontal'=>PHPExcel_Style_Alignment::HORIZONTAL_CENTER) , 'A21:F37');

4.3 - Les bordures Les bordures possèdent deux classes PHPExcel_Style_Border et PHPExcel_Style_Borders. PHPExcel_Style_Borders définit notamment quatre méthodes : • • • •

getLeft() getRight() getTop() getBottom()

Ces méthodes instancient un objet de la classe PHPExcel_Style_Border, qui permet de définir le style de bordure (via des constantes définies), et le style de couleur de la bordure via les méthodes de la classe PHPExcel_Style_Color dont j'ai déjà parlé plus haut. Voici un petit exemple : $styleA11 = $sheet->getStyle('A11'); $styleA11->applyFromArray(array( 'borders'=>array( 'top'=>array( 'style'=>PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT), 'bottom'=>array( 'style'=>PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT, 'color'=>array( 'rgb' => '808080')))));

Les constantes définies sont les suivantes :

- 19 Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos)

Constante BORDER_NONE BORDER_DASHDOT BORDER_DASHDOTDOT BORDER_DASHED BORDER_DOTTED BORDER_DOUBLE BORDER_HAIR BORDER_MEDIUM BORDER_MEDIUMDASHDOT BORDER_MEDIUMDASHDOTDOT BORDER_MEDIUMDASHED BORDER_SLANTDASHDOT BORDER_THICK BORDER_THIN

Valeur 'none' 'dashDot' 'dashDotDot' 'dashed' 'dotted' 'double' 'hair' 'medium' 'mediumDashDot' 'mediumDashDotDot' 'mediumDashed' 'slantDashDot' 'thick' 'thin'

4.3.1 - Toutes les bordures Définir chaque ligne peut être vite fastidieux, il est possible de définir les 4 côtés de la cellule en un seule array(), grâce au mot clé 'allborders'. $sheet->getStyle('B2')->getBorders()->applyFromArray( array( 'allborders' => array( 'style' => PHPExcel_Style_Border::BORDER_DASHDOT, 'color' => array( 'rgb' => '808080' ) ) ) );

4.4 - Le fond de la cellule Nous pourrions avoir besoin de mettre une cellule en couleur, pour ce faire nous utiliserons la classe PHPExcel_Style_Fill. Cette classe nous permet de définir le style de fond, si elle doit être solide,linéaire, etc. En fonction du style choisi, nous pourrons définir une rotation, un dégradé ou une couleur de fond. Les dégradés ne fonctionnent que sur Excel 2007. Comme pour les autres méthodes, une série de constantes sont définies, pour le style de fond de la cellule.

- 20 Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos)

Constante FILL_NONE FILL_SOLID FILL_GRADIENT_LINEAR FILL_GRADIENT_PATH FILL_PATTERN_DARKDOWN FILL_PATTERN_DARKGRAY FILL_PATTERN_DARKGRID FILL_PATTERN_DARKHORIZONTAL FILL_PATTERN_DARKTRELLIS FILL_PATTERN_DARKUP FILL_PATTERN_DARKVERTICAL FILL_PATTERN_GRAY0625 FILL_PATTERN_GRAY125 FILL_PATTERN_LIGHTDOWN FILL_PATTERN_LIGHTGRAY FILL_PATTERN_LIGHTGRID FILL_PATTERN_LIGHTHORIZONTAL FILL_PATTERN_LIGHTTRELLIS FILL_PATTERN_LIGHTUP FILL_PATTERN_LIGHTVERTICAL FILL_PATTERN_MEDIUMGRAY

'none' 'solid' 'linear' 'path' 'darkDown' 'darkGray' 'darkGrid' 'darkHorizontal' 'darkTrellis' 'darkUp' 'darkVertical' 'gray0625' 'gray125' 'lightDown' 'lightGray' 'lightGrid' 'lightHorizontal' 'lightTrellis' 'lightUp' 'lightVertical' 'mediumGray'

Valeur

Pour la couleur, c'est toujours la classe PHPExcel_Style_Color, qui fournit les méthodes. Exemple : $sheet->getStyle('A9')->applyFromArray(array( 'fill'=>array( 'type'=>PHPExcel_Style_Fill::FILL_SOLID, 'color'=>array( 'argb'=>'FFCC99'))));

Voici un exemple avec un dégradé : $sheet->getStyle('B2')->getFill()->applyFromArray( array( 'type' => PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR, 'rotation' => 0, 'startcolor' => array( 'rgb' => '000000' ), 'endcolor' => array( 'argb' => 'FFFFFFFF' ) ) );

4.5 - Les images Il est également possible d'insérer des images dans notre document. La classe est PHPExcel_Worksheet_Drawing.

- 21 Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos)

Je n'ai à l'heure actuelle encore jamais testé cette classe. Le code est sorti tout droit des exemples fournis avec la librairie. $objDrawing = new PHPExcel_Worksheet_Drawing(); $objDrawing->setName('PHPExcel logo'); $objDrawing->setDescription('PHPExcel logo'); $objDrawing->setPath('./images/phpexcel_logo.gif'); $objDrawing->setHeight(36); $objDrawing->setCoordinates('D24'); $objDrawing->setOffsetX(-10); $objDrawing->setWorksheet($sheet);

- 22 Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos)

Style par défaut La classe PHPExcel_Worksheet nous offre une méthode qui permet d'appliquer un style à tout le tableur par défaut. Ce style défini par défaut pourra soit être complété, soit remplacé en fonction des besoins. include 'MaitrePylosExcel.php'; $workbook = new MaitrePylosExcel(); $sheet = $workbook->getActiveSheet(); $sheet->getDefaultStyle() ->applyFromArray(array( 'font'=>array( 'name' => 'Arial', 'size' => 12, 'bold' => true), 'alignment'=>array( 'horizontal'=>PHPExcel_Style_Alignment::HORIZONTAL_CENTER), 'borders' => array( 'allborders'=>array( 'style' => PHPExcel_Style_Border::BORDER_DASHDOT)) ) ); $workbook->affiche('Excel2007','MonPremierFichier');

Par défaut donc mon tableur sera fixé comme suit : La police Arial sera de taille 12 en gras. Le contenu des cellules sera centré horizontalement. Les cellules seront encadrées par des bordures.

5.1 - Dupliquer le style Dans la classe PHPExcel_Worksheet, nous avons une méthode qui nous permet de dupliquer le style appliqué à une cellule. $sheet->duplicateStyle($styleA1,'E5:F6');

Nous appliquons le style de la cellule A1 aux cellules E5-E6-F5-F6, et voici un petit code pour vérifier nos dires.

include 'MaitrePylosExcel.php'; $workbook = new MaitrePylosExcel(); $sheet = $workbook->getActiveSheet(); $styleA1 = $sheet->getStyle('A1'); $styleA1->applyFromArray(array( 'font'=>array( 'bold'=>true, 'size'=>12, 'name'=>Arial, 'color'=>array( 'rgb'=>'FF00FF00')) - 23 Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos) )); $sheet->duplicateStyle($styleA1,'E5:F6'); $sheet->setCellValue('A1','MaitrePylos'); $sheet->setCellValue('E5','MaitrePylos'); $sheet->setCellValue('E6','MaitrePylos'); $sheet->setCellValue('F5','MaitrePylos'); $sheet->setCellValue('F6','MaitrePylos'); $workbook->affiche('Excel2007','MonPremierFichier');

Vous pouvez également propager directement un style vers un ensemble de cellules via la méthode duplicateStyleArray(), dans le code suivant, nous allons appliquer un style aux cellules allant de A3 jusqu'à E3. $sheet->duplicateStyleArray( array( 'font' => array( 'bold' => true ), 'alignment' => array( 'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_RIGHT, ), 'borders' => array( 'top' => array( 'style' => PHPExcel_Style_Border::BORDER_THIN ) ), 'fill' => array( 'type' => PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR, 'rotation' => 90, 'startcolor' => array( 'argb' => 'FFA0A0A0' ), 'endcolor' => array( 'argb' => 'FFFFFFFF' ) ) ), 'A3:E3' );

- 24 Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos)

Les formats de cellules Par défaut les cellules prennent le format qui leur à été envoyé par les méthodes setCellValue et setCellValueByColumnAndRow

6.1 - PHPExcel_Cell_DataType Cette classe va nous permettre de fixer le type de données, grâce aux méthodes setCellValueExplicit() et setCellValueByColumnAndRowExplicit(). Ces deux méthodes prennent un troisième argument définissant le type de la cellule. $sheet->setCellValue('A1','MaitrePylos',PHPEcel_Cell_DataType::TYPE_STRING);

Nous définissons ici explicitement une cellule en A1 contenant 'MaitrePylos' et la cellule sera fixée au type string. Les différents types définis sont : Constante TYPE_STRING TYPE_FORMULA TYPE_NUMERIC TYPE_BOOL TYPE_NULL TYPE_INLINE TYPE_ERROR

's' 'f' 'n' 'b' 's' 'inlineStr' 'e'

Valeur

- 25 Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos)

Vite dit 7.1 - Fusion de cellules //on fusionne les cellules de A1 à D1 $sheet->mergeCells('A1:D1');

7.2 - Largeur de colonne $sheet->getColumnDimension('A')->setWidth(28);

7.3 - Hauteur de ligne $sheet->getRowDimension('2')->setRowHeight(70);

7.4 - Taille de la page $sheet->getPageSetup()->setPaperSize(PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4);

Les formats possibles sont :

- 26 Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos)

Type Letter paper (8.5 in. by 11 in.) Letter small paper (8.5 in. by 11 in.) Tabloid paper (11 in. by 17 in.) Ledger paper (17 in. by 11 in.) Legal paper (8.5 in. by 14 in.) Statement paper (5.5 in. by 8.5 in.) Executive paper (7.25 in. by 10.5 in.) A3 paper (297 mm by 420 mm) A4 paper (210 mm by 297 mm) A4 small paper (210 mm by 297 mm) A5 paper (148 mm by 210 mm) B4 paper (250 mm by 353 mm) B5 paper (176 mm by 250 mm) Folio paper (8.5 in. by 13 in.) Quarto paper (215 mm by 275 mm) Standard paper (10 in. by 14 in.) Standard paper (11 in. by 17 in.) Note paper (8.5 in. by 11 in.) Envelope (3.875 in. by 8.875 in.) Envelope (4.125 in. by 9.5 in.) Envelope (4.5 in. by 10.375 in.) Envelope (4.75 in. by 11 in.) Envelope (5 in. by 11.5 in.) C paper (17 in. by 22 in.) Etc..

Constante PAPERSIZE_LETTER 1 PAPERSIZE_LETTER_SMALL2 PAPERSIZE_TABLOID

3

PAPERSIZE_LEDGER

4

PAPERSIZE_LEGAL PAPERSIZE_STATEMENT

5 6

PAPERSIZE_EXECUTIVE

7

PAPERSIZE_A3

8

PAPERSIZE_A4

9

PAPERSIZE_A4_SMALL

10

PAPERSIZE_A5

11

PAPERSIZE_B4

12

PAPERSIZE_B5

13

PAPERSIZE_FOLIO PAPERSIZE_QUARTO

14 15

Valeur

PAPERSIZE_STANDARD_1 16 PAPERSIZE_STANDARD_2 17 PAPERSIZE_NOTE 18 PAPERSIZE_NO9_ENVELOPE19 PAPERSIZE_NO10_ENVELOPE 20 PAPERSIZE_NO11_ENVELOPE 21 PAPERSIZE_NO12_ENVELOPE 22 PAPERSIZE_NO14_ENVELOPE 23 PAPERSIZE_C 24

Vour retrouverez l'ensemble des formats dans le fichier PHPExcel_Worksheet_PageSetup.php

7.5 - Orientation de la page $sheet->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE);

Les orientations possibles sont :

- 27 Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos)

Constante ORIENTATION_DEFAULT ORIENTATION_LANDSCAPE ORIENTATION_PORTRAIT

'default' 'landscape' 'portrait'

Valeur

7.6 - Freeze Pane Pour geler une celule //mettre la cellule en paramètres. $sheet->freezePane('A2');

- 28 Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos)

Ca existe aussi PHPExcel offre vraiment une panoplie de possibilités, cet article n'étant qu'une approche sommaire, je vous laisse le soin d'aller plus loin dans l'exploration de ces classes. Vous pourriez découvrir notamment : • • • • • •

La protection des documents et cellules Les entêtes et pieds de pages Les zones d'impression Les sauts de page Les métas informations sur les cellules/fichiers Tout ce que je n'ai pas lu ou aperçu :)

- 29 Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos)

Travailler avec l'existant Suite à la publication de cet article, une des demandes était de savoir si on pouvait modifier un fichier Excel existant ? La réponse est oui ! Et nous allons voir comment faire, pour lire le fichier, récupérer les données et en ajouter ou modifier.

8 - Lire un fichier Excel La première action à faire est de lire le fichier Excel. Pour ce faire nous allons créer un environnement de travail correct pour les exemples. PHPExcel respectant la convention de nommage de PEAR, cela va nous faciliter la travail, en effet je vais partir du principe que nous travaillons dans le répertoire 'Classes', fourni par l'archive de PHPExcel. Au coeur de ce répertoire nous allons créer un fichier 'read.php' avec le contenu suivant: $path = './'; set_include_path(get_include_path() . PATH_SEPARATOR . $path); function __autoload($classe) { $fichier = str_replace ( '_', # Caractère à remplacer. DIRECTORY_SEPARATOR, # Caractère de remplacement. $classe # Cible du remplacement. ) . '.php' ; require_once($fichier) ; # Chargement de la classe. }

$objet = new PHPExcel_Reader_Excel5(); $excel = $objet->load('Exemple14.xls'); $writer = new PHPExcel_Writer_Excel5($excel); $writer->save('autreFichier.xls');

Voici quelques explications de ce code. On précise d'abord où on travaille, la racine des classes. $path = './'; set_include_path(get_include_path() . PATH_SEPARATOR . $path);

Ensuite, on met en place la fonction autoload standard de la SPL. Cela nous évitera de mettre en place les require's nécessaire. function __autoload($classe) { $fichier = str_replace ( '_', # Caractère à remplacer. DIRECTORY_SEPARATOR, # Caractère de remplacement. $classe # Cible du remplacement. ) . '.php' ; require_once($fichier) ; # Chargement de la classe. }

- 30 Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos)

On instancie un objet de lecture de PHPExcel $objet = new PHPExcel_Reader_Excel5();

Ici j'ai pris le plis de travailler avec un fichier Excel non XML (.xls), mais nous disposons des possiblitées suivantes : • • • • • •

CSV Excel2003(XML) Excel2007 Excel5 SYLK OoCalc

Ensuite nous lisons le fichier Excel, pour les exemples, je me base sur un fichier (le 14) généré par les démos de PHPExcel $excel = $objet->load('Exemple14.xls');

Nous disposons donc d'un objet, possédant le contenu de notre fichier Excel. A partir de ce moment nous pouvons travailler sur le fichier Excel. Une fois le travail terminé nous l'enregistrons ou créons un nouveau document. $writer = new PHPExcel_Writer_Excel5($excel); $writer->save('autreFichier.xls')

Ici nous avons tous simplement enregistrer le fichier sous un autre nom Pour faciliter le travail avec cette librairie, les développeurs de PHPExcel, ont mis en place un pattern factory. $objet = PHPExcel_IOFactory::createReader('Excel5'); $excel = $objet->load('Exemple14.xls'); $writer = PHPExcel_IOFactory::createWriter($excel); $writer->save('Exemple14.xls');

8.1 - Ecrire dans un fichier existant ! Un des aspects les plus intéressant est de pouvoir écrire dans un fichier existant. Cela se fait très facilement, en fait de la même façon que de créer un document, il faut juste signaler à PHPExcel où l'on veut écrire ! $objet = PHPExcel_IOFactory::createReader('Excel5'); $excel = $objet->load('Exemple14.xls'); $sheet = $excel->getSheet(0); $sheet->setCellValue('A50', 'MaitrePylos'); $writer = PHPExcel_IOFactory::createWriter($excel);

- 31 Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos) $writer->save('Exemple14.xls');

Ici nous devons donc savoir sur quelles feuilles travailler $sheet = $excel->getSheet(0);

La méthode getSheet(), renvoie donc un sheet indexé, mais si nous connaissons son nom, il est également possible de la récupèrer $sheet = $excel->getSheetByName('Invoice');

Ensuite nous écrivons dedans $sheet->setCellValue('A35', 'MaitrePylos');

8.2 - Connaître son fichier. Dans la perspective où vous ne connaîtriez pas le fichier avec lesquel vous travaillez, il est possible de récupèrer une serie d'information sur ce fichier.

8.2.1 - Le nom des sheets La méthode getSheetNames() retourne un tableau contenant le nom des sheet $name_sheet = $excel->getSheetNames();

8.2.2 - L'index des sheets La méthode getSheetCount() retourne le nombre de sheet suivant son index $count_sheet = $excel->getSheetCount();

8.3 - Fusionner plusieurs fichiers Excel Maintenant que nous savons lire un fichier Excel, rien ne nous empêche d'en fusionner plusieurs $objet1 = new PHPExcel_Reader_Excel5(); $excel1 = $objet1->load('Exemple14.xls'); $objet2 = new PHPExcel_Reader_Excel5(); $excel2 = $objet2->load('autreFichier.xls'); $writer = new PHPExcel(); //insertion des sheet du premier fichier for ($i=0;$i<$excel1->getSheetCount();$i++){ $writer->addSheet($excel1->getSheet($i)); } //insertion des sheet du second fichier for ($i=0;$i<$excel2->getSheetCount();$i++){ $writer->addSheet($excel2->getSheet($i)); } - 32 Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos) //je modifie un sheet pour voir la différence $sheet = $writer->getSheet(3); $sheet->setCellValue('A50', 'MaitrePylos'); $save = new PHPExcel_Writer_Excel5($writer); $save->save('Exemple_gg.xls');

8.3.1 - Utiliser plusieurs fois le même sheet On peut vouloir dupliquer le même sheet, dans ce cas il faut utiliser la méthode copy de l'objet Reader $objet1 = new PHPExcel_Reader_Excel5(); $excel1 = $objet1->load('Exemple14.xls'); $sheet1 = $excel1->getSheet(0); $sheet2 = $sheet1->copy(); $sheet2->setTitle('Cloned Worksheet'); $writer = new PHPExcel(); $writer->addSheet($sheet1); $writer->addSheet($sheet2); $sheet2 = $writer->getSheet(2); $sheet2->setCellValue('A2', 2); $save = new PHPExcel_Writer_Excel5($writer); $save->save('bugResult1.xls');

Nous avons ici copié deux fois le même sheet Une autre possiblité est d'utiliser la fonction Clone de PHP $objet1 = new PHPExcel_Reader_Excel5(); $excel1 = $objet1->load('Exemple14.xls'); $sheet1 = $excel1->getSheet(0); $sheet2 = clone $sheet1; $sheet2->setTitle('Cloned Worksheet'); $writer = new PHPExcel(); $writer->addSheet($sheet1); $writer->addSheet($sheet2); $sheet2 = $writer->getSheet(2); $sheet2->setCellValue('A2', 2); $save = new PHPExcel_Writer_Excel5($writer); $save->save('bugResult1.xls');

Mes essais concernant cette seconde méthode ne sont pas très concluants quand le sheet que l'on veut copier contient des images. En effet lors de la copie je perd toute trace des images. Dans ce cas, je préfère réaliser une fusion de deux fichiers, en utilisant deux fois le même fichier d'origine. Je terminerai ici ce paragraphe sur la lecture des fichiers.

- 33 Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos)

Extraire des images Lors d'échanges sur le forum, @objectifweb un posteur,nous a soumis une difficulté qu'il rencontrait, c'est à dire extraire des photos d'un fichier existant. Il nous à orienté sur une solution, que l'on peut retrouver dans les archives de PHPExcel. A la lecture d'un fichier Excel, une des méthodes qui recense les images est getDrawingCollection(). Dans un premier temps créer un répertoire / images pour recpetionner toutes les images, ensuite il faut boucler sur getDrawingCollection() et créer les images avec la fonction image/jpeg/gif() de PHP $objet1 = new PHPExcel_Reader_Excel5(); $excel1 = $objet1->load('Exemple14.xls'); $sheet1 = $excel1->getSheet(0); foreach ($sheet1->getDrawingCollection() as $drawing) { // $drawing->getCoordinates(); // we have an ordinary drawing (case xlsx) if ($drawing instanceof PHPExcel_Worksheet_Drawing) { $filename = $drawing->getPath(); copy($filename, 'images/' . $drawing->getIndexedFilename()); // we have a memory drawing (case xls) } else if ($drawing instanceof PHPExcel_Worksheet_MemoryDrawing) { $image = $drawing->getImageResource(); // save image to disk $renderingFunction = $drawing->getRenderingFunction(); switch ($renderingFunction) { case PHPExcel_Worksheet_MemoryDrawing::RENDERING_JPEG: imagejpeg($image, 'images/' . $drawing->getIndexedFilename()); break; case PHPExcel_Worksheet_MemoryDrawing::RENDERING_GIF: imagegif($image, 'images/' . $drawing->getIndexedFilename()); break;

}

}

}

case PHPExcel_Worksheet_MemoryDrawing::RENDERING_PNG: case PHPExcel_Worksheet_MemoryDrawing::RENDERING_DEFAULT: imagepng($image, 'images/' . $drawing->getIndexedFilename()); break;

- 34 Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.


Introduction à PHPExcel par Ernaelsten Gérard (MaitrePylos)

Conclusion Pour finir, je dirais que nous avons là une librairie qui va nous rendre de grands services dans le développement de nos activités. Ils ne nous reste plus qu'à injecter des données venant de nos bases de données.

Merci Que soient remerciés ici tous ceux qui m'ont apporté une aide précieuse à la confection de cet article (Frédérique, Yogui, Celira....). Je voudrais aussi remercier Magali Contensin et Cécile Odero du CNRS, pour leur article sur PHPExcel paru dans le Phpsolutions du mois de mai 2008, s'il vous est possible de vous procurer cet article, je vous en conseille la lecture.

Liens PHPExcel Spreadsheet_Excel_Writer en PHP Spreadsheet_Excel_Writer FPDF http://snaps.php.net/

- 35 Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.

Php Excel  
Php Excel  

Introduction à PHPExcel

Advertisement