Traitement de fichiers Excel en PHP
Publié le 15/11/2011 à 12:15 dans la catégorie Programmation Web.Tags : développement, web, php, excel.
8 commentaires.
Présentation de PHP Excel
PHP Excel est un ensemble de classes distribuées sous licences LGPL 2.1, qui permet de lire et écrire des données dans des fichiers Excel (.xls ou .xlsx ainsi que dans d'autres formats (pdf, html, csv, Excel 5, ...)). PHP Excel permet de saisir des données dans les cellules d'une feuille de travail mais également de modifier les propriétés du texte et des cellules, d'ajouter un en-tête ou un pied de page, de définir des zones d'impression, de fusionner des cellules et ajouter des bordures, etc...

Pour pouvoir utiliser PHP Excel, vous devez utiliser une version de PHP supérieure ou égale à la 5.2.0 et avoir les extensions suivantes activées :
- php_zip
- php_xml
- php_gd2
La documentation est particulièrement claire, raison pour laquelle je ne ferais que présenter les bases de l'utilisation de cette classe.
Téléchargement et Installation
Commençons par récupérer la dernière version sur le site de PHP Excel. Décompressez le fichier récupéré dans votre espace de travail PHP. Le fichier contient trois dossiers ainsi que les fichiers de licence, changelog, et les instructions d'installation.
- Classes, contient les fichiers à utiliser dans votre production sur le serveur.
- Documentation, vous trouverez ici toute la documentation nécessaire pour utiliser PHP Excel dans son ensemble.
- Tests, de nombreux exemples d'utilisation.
Pour mon exemple, j'ai placé le contenu du dossier Classes dans un dossier à la racine du serveur. Lorsque nous utilisons PHP Excel dans un site, nous plaçons le contenu de ce dossier dans le même dossier que les autres classes PHP.
Pour utiliser PHP Excel, il suffit de faire un require() vers le fichier Classes/PHPExcel.php dans votre script PHP.
<?php
require('Classes/PHPExcel.php');
...
?>
Création d'un fichier
Après le require() du fichier de PHPExcel, il faut créer une instance de la classe. On ajoute donc la ligne suivante.
// Ajout de la classe PHP Excel
require('Classes/PHPExcel.php');
// Création de l'objet PHPExcel
$objPHPExcel = new PHPExcel();
Définition des propriétés
Il est désormais possible de définir les propriétés du fichier. Ce n'est pas indispensable, mais ça reste plus propre. On fait appel à la méthode getProperties() de l'objet $objPHPExcel pour indiquer que l'on va accéder aux propriétés, pour ensuite faire appel aux sous-méthodes afin de les définir.
// Définition d'une propriété par instruction
$objPHPExcel->getProperties()->setCreator('Infoject\'');
$objPHPExcel->getProperties()->setLastModifiedBy('Infoject\'');
// Définition de plusieurs propriétés
$objPHPExcel->getProperties()->setTitle('Test de PHP Excel')
->setSubject('Test de PHP Excel')
->setDescription('Fichier de test de PHP Excel.)
->setKeywords('phpexcel test')
->setCategory('Fichier de test');
Écriture des données
Pour écrire les données, il faut commencer par indiquer quelle est la feuille sur laquelle on souhaite travailler. On fait donc appel à la méthode setActiveSheetIndex() de notre objet PHPExcel.
On peut ensuite écrire des données dans une cellule avec la méthode SetCellValue(cell, value). Le premier paramètre est la cellule, à indiquer sous la forme "A1" pour la colonne A de la première ligne et le second paramètre est le contenu de la cellule.
// Définition de la feuille active
$objPHPExcel->setActiveSheetIndex(0);
// Titre de la feuille
$objPHPExcel->getActiveSheet()->setTitle('Feuille de test');
// Données de la cellule A1
$objPHPExcel->getActiveSheet()->setCellValue('A1', 'Fichier de test');
// Saisie de plusieurs cellules en une instruction
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A2', '5')
->setCellValue('B2', '37')
->setCellValue('A3', 'Résultat')
->setCellValue('B3', '=A2+B2');
// Utilisation de la méthode setCellValueByColumnAndRow() pour écrire dans la cellule A4
$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(1, 4, 'A4 => 21*29,7');
Modification des propriétés des cellules
PHPExcel permet de modifier certaines propriétés du document ou des cellules. Il faut pour cela faire appel à la méthode getStyle() et à ses sous-méthodes pour modifier certaines propriétés.
// Modification de la couleur du texte
$objPHPExcel->getActiveSheet()->getStyle('B3')->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_BLUE);
// Aligner le texte au milieu à droite
$objPHPExcel->getActiveSheet()->getStyle('B3')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);
// Modification de la bordure inférieure de la cellule
$objPHPExcel->getActiveSheet()->getStyle('B3')->getBorders()->getBottom()->setBorderStyle(PHPExcel_Style_Border::BORDER_THICK);
// Modification de la largeur de la colonne
$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(15);
Il est possible de modifier bien d'autres propriétés telles que les marges, les zones d'impression, l'alignement du texte, etc... Vous trouverez la liste complète des propriétés modifiables dans la documentation officielle.
Enregistrement du document
Pour enregistrer le document, il faut créer un objet PHPExcel_Writer adapté au format d'enregistrement souhaité. Pour un fichier .xlsx (Excel 2007 et 2010) il faut utiliser PHPExcel_Writer_Excel2007. Une fois l'objet créé, on peut faire appel à la méthode save() en précisant le nom du fichier.
// Enregistrement de l'objet $objPHPExcel dans le fichier Fichier de test.xlsx
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$objWriter->save('Fichier de test.xlsx');
En ouvrant le fichier avec Excel, vous devriez obtenir le résultat suivant :

Lecture de fichier
Pour charger un fichier Excel, il existe plusieurs méthodes. La plus efficace est de faire appel directement à la classe de lecture adaptée au format du fichier que vous souhaitez lire. Dans certains cas, vous pouvez ne pas connaître le format. Il faudra donc faire appel à la fonction de chargement automatique (plus simple mais légèrement plus lente).
// Création de l'objet Reader pour un fichier Excel 2007
$objReader = new PHPExcel_Reader_Excel2007();
// Permet de ne récupérer que les valeurs des cellules sans les propriétés de style
$objReader->setReadDataOnly(true);
// Lecture du fichier.
$objPHPExcel = $objReader->load("Fichier de test.xlsx");
// Si on ignore le format du fichier, utiliser PHPExcel_IOFactory
$objPHPExcel = PHPExcel_IOFactory::load("Fichier de test.xlsx");
On peut désormais lire le contenu des cellules du document avec la méthode getCellByColumnAndRow() en fournissant en premier argument le numéro de la colonne (A = 0, B = 1, C = 2, etc...) et en second le numéro de la ligne en commençant à 1.
// Lecture du contenu de la cellule B2
$b2 = $objPHPExcel->getActiveSheet()->getCellByColumnAndRow(1, 2)->getValue();
Il est aisé de placer cette fonction dans une boucle pour transférer le contenu d'un fichier dans une base de données par exemple.
Pour aller plus loin...
PHPExcel permet d'utiliser de nombreuses fonctions équivalentes à celles que l'on trouve dans Excel. La liste des ces fonctions est disponible dans le dossier Documentation.
Vous pouvez trouver des exemples de codes bien détaillés dans le dossier Tests de l'archive que vous avez téléchargé, ou fouiller sur le site de PHP Excel pour plus de renseignements.
Et pour Word ou PowerPoint ?
Les auteurs de PHPExcel ont dérivés leurs travaux pour donner naissance à deux autres ensembles de classes PHP permettant de manipuler des fichiers Word (.doc, .docx) et PowerPoint (.ppt, .pptx).

Ces classes sont toujours en cours de développement actuellement mais les fonctionnalités principales sont présentes.

Bonjour
Voulant tester PHPExcel j'ai rencontré un soucis, il semble qu'il est nécessaire d'avoir un fichier Autoloader.php, voici l'erreur :
" Warning: require(F:\EasyPHP-5.3.9\www\lapim\Classes/PHPExcel/Autoloader.php) [function.require]: failed to open stream: No such file or directory in F:\EasyPHP-5.3.9\www\lapim\Classes\PHPExcel.php on line 32
Fatal error: require() [function.require]: Failed opening required 'F:\EasyPHP-5.3.9\www\lapim\Classes/PHPExcel/Autoloader.php' (include_path='.;C:\php\pear') in F:\EasyPHP-5.3.9\www\lapim\Classes\PHPExcel.php on line 32 "
Et cela dés la première ligne de donc le require()
Bonjour,
Le fichier existe-t-il sur le disque dur dans le dossier indiqué ?
"F:\EasyPHP-5.3.9\www\lapim\Classes/PHPExcel/Autoloader.php"
Car il est bien présent dans l'archive .zip téléchargé depuis PHPExcel (version 1.7.6)
Il font mention dans ce sujet: http://phpexcel.codeplex.com/discussions/240730 de soucis de compatibilité avec d'autres scripts. Utilises-tu une autre classe, framework, CMS ou autre qui pourrait entraîner ce problème ?
J'utilise cette classe sans autre framework et tout fonctionne a merveille. Pourtant, je n'ai pas de fichier Autoloader.php dans le dossier Classes/PHPExcel