Pour les débutants Les différents formats de sortie proposés par PHPExcel La bibliothèque orientée objet PHPExcel permet de lire et créer des fichiers pour tableurs. Dans cette série d articles, vous apprendrez à manipuler ces classeurs, les mettre en page, y insérer des formules ou des graphiques. Cet article explique : Comment définir le format de sortie d un classeur. Comment le stocker sur le serveur web. Ce qu il faut savoir : Avoir lu l article Générer des classeurs pour tableur avec PHPExcel (PHP Solutions - août 2011). Bases de PHP. Dans l'article précédent, vous avez appris à créer un classeur comportant plusieurs feuilles. La première feuille contenait des données brutes sans mise en forme. La seconde feuille donnait un exemple de mise en forme de cellules, de colonnes et de lignes. Vous avez vu comment envoyer ce classeur au format Excel2007 vers le navigateur. La bibliothèque PHPExcel propose plusieurs formats de sortie : Excel2007, CSV, PDF, HTML ou BIFF5. Cet article présente ces différents formats de sortie et explique comment envoyer vers le navigateur, ou stocker sur le disque du serveur web, les documents générés. Quel que soit le format de sortie choisi, il faut suivre les mêmes étapes lors de la création d'un classeur : inclure la bibliothèque principale (fichier PHPExcel. php), créer le classeur (objet PHPExcel), obtenir la feuille de travail avec la méthode getactivesheet, ajouter des données avec ou sans mise en forme et éventuellement définir le titre de la feuille, ajouter d'autres feuilles et données si nécessaire. Lorsque le classeur contient toutes les données et que les styles ont été définis, il faut fixer un format de sortie et envoyer ou stocker le document généré. Ceci est réalisé en suivant les étapes : inclure la bibliothèque spécifique au format de sor sortie : les scripts qui gèrent l'enregistrement des données dans les différents formats sont tous situés dans le sous-répertoire Writer du répertoire principal de la bibliothèque PHPExcel, créer une instance de la classe gérant le format, fixer les informations nécessaires pour ce format (extension du fichier, type MIME pour l'envoi vers le navigateur), envoyer le classeur vers le navi ateur navigateur ou le stoc stocker sur le serveur en utilisant la méthode save. Chaque format sera détaillé dans cet article et illustré grâce à une adaptation de l'exemple utilisé pour l'article précédent : un classeur à deux feuilles dont une contient uniquement des données brutes (Figures 1 et 3) et l'autre des données formatées (Figure 2). Les extensions à utiliser seront précisées, ainsi que les noms des classes gérant les formats et les fichiers PHP à inclure. Figure 1. Feuille 1 du classeur au format CSV 1 9/2011
pour les débutants Pour tester les listings de cet article, vous devez au préalable avoir installé la bibliothèque PHPExcel (cf Générer des classeurs pour tableur avec PHPExcel). Excel2007 Le format Excel2007 (SpreadsheetML) a été présenté dans l'article du numéro précédent. Cette section rappelle brièvement ses caractéristiques. Listing 1. fonctions.php <?php /** * Place les donnees du tableau dans les cellules de la feuille * @param $feuille (objet) feuille du classeur * @param $tab_donnees (tableau) tableau de donnees a deux dimensions */ function ajouterdonnees($feuille, $tab_donnees){ $i_ligne = 1; foreach ($tab_donnees as $ligne){ $nb_cell = count($ligne); for ($i_col = 0; $i_col < $nb_cell; $i_col++){ $feuille->setcellvaluebycolumnandrow($i_ col, $i_ligne, $ligne[$i_col]); $i_ligne++; /** * Genere un document au format passe en parametre. * Enregistre sur le disque du serveur ou envoie au navigateur. * @param $classeur (objet) classeur * @param $format_sortie (chaine) format de fichier * @param $afficher (boolean) si a true, le fichier est envoye au navigateur, sinon enregistre sur le serveur */ function genererdoc($classeur, $format_ sortie= HTML,$afficher=true){ $nom_fichier = ; $sortie = ; $writer = null; $ext = ; $header = ; $chemin_bib = PHPExcel/Writer/ ; switch ($format_sortie){ case Excel2007 : require $chemin_bib. Excel2007.php ; Excel2007($classeur); $ext = xlsx ; $header = application/vnd.openxmlformatsofficedocument.spreadsheetml.sheet ; case CSV : require $chemin_bib. CSV.php ; CSV($classeur); $writer->setdelimiter(, ); //une seule page : deuxieme feuille $writer->setsheetindex(1); $ext = csv ; $header = text/csv ; case PDF : require $chemin_bib. PDF.php ; PDF($classeur); $ext = pdf ; $header = application/pdf ; case Excel5 : require $chemin_bib. Excel5.php ; Excel5($classeur); $ext = xls ; $header = application/vnd.ms-excel ; case HTML : default: require $chemin_bib. HTML.php ; HTML($classeur); $writer->writeallsheets(); $ext = html ; $header = text/html ; $nom_fichier = basename(str_replace(. php,..$ext,$_server[ SCRIPT_ NAME ])); $sortie = resultats/.$nom_fichier; //stocke sur disque ou envoie au navigateur if (!$afficher){ header( Content-type:.$header); header( Content-Disposition:inline;filename=.$ nom_fichier); $sortie = php://output ; else { echo donnees enregistrees : <a href=.$sortie. >.$sortie. </ a> ; $writer->save($sortie); phpsolmag.org/fr 2
Pour les débutants Un document Excel2007 est une archive Zip comportant plusieurs fichiers XML. Ces fichiers décrivent le classeur, ses feuilles, les données de tout le classeur ainsi que les informations de mises en page de cellesci. Les classeurs Excel2007 supportent : la mise en forme des cellules et de la feuille, les formules et les images, la protection des données, les méta-informations (auteur, titre, description), les feuilles multiples. Pour générer un classeur à ce format il faut : inclure le fichier Excel2007.php, créer un objet de la classe PHPExcel _ Writer _ Excel2007, utiliser l'extension.xlsx et le type MIME application/ vnd.openxmlformats-officedocument.spreadsheetml.sheet. Dans cet article, les listings 1 (fonctions) et 2 (script principal) permettent de générer des documents dans différents formats, dont Excel2007. Le script principal comporte une partie indépendante du format de sortie (création du classeur et de ses feuilles, ajout de données et mise en forme) et une partie spécifique. Les instructions utilisées dans la première partie pour générer le classeur, placer et mettre en forme les données, ont été présentées dans l'article du numéro précédent (Générer des classeurs pour tableur avec PHPExcel). Le script principal de cet article (Listing 2) permet à l'internaute de choisir le format de sortie souhaité, grâce à l'argument format dans l'url (méthode GET). Pour générer un fichier Excel2007, le script reçoit en paramètre : differents_formats.php?format=excel2007 Le script récupère la valeur du choix passé en paramètre et l'envoie à la fonction genererdoc (Listing 1). Celle-ci prend trois arguments : l'objet $classeur, le format $format _ sortie et un argument facultatif qui permettra de stocker le fichier sur le disque du serveur web (cf Stocker le fichier sur le serveur). Par défaut, le fichier sera envoyé vers le navigateur. Si on lui passe le format Excel2007, la fonction genererdoc : inclut la bibliothèque associée au format de sortie qu'elle reçoit en paramètre (instruction require), instancie un objet PHPExcel _ Writer _ Excel2007, fixe le nom du fichier (nom du script avec l'exten l'extension.xlsx), génère les lignes d'en-tête HTTP suivantes (type MIME du fichier, nom et disposition) et envoie le document au navigateur (flux php://output) : header('content-type:application/vnd.openxmlformatsofficedocument.spreadsheetml.sheet'); header('content-disposition:inline;filename=differe nts_formats.xslx'); CSV Les tableurs peuvent importer les données d'un tableau à deux dimensions, stocké dans un fichier texte comportant des délimiteurs de cellules et de lignes. En fonction du caractère délimiteur de cellule utilisé, ce format de stockage est nommé CSV (Comma Separated Value) ou TSV (Tab Separated Values). Ces formats sont très utilisés pour échanger des informations entre applications, ou manipuler et présenter des données issues d'une base de données. Cette section présente rapidement le format CSV, et explique comment générer un fichier CSV à partir d'un classeur. Définition du CSV Un fichier CSV est un fichier texte qui contient les données d'un tableau et des séparateurs de cellules, géné- Figure 2. Feuilles du classeur au format HTML Figure 3. Feuille 1 du classeur au format PDF 3 9/2011
pour les débutants ralement des virgules, et de lignes. Il peut être ouvert dans le tableur Microsoft Excel ou dans le tableur Calc de la solution bureautique alternative gratuite OpenOffice.org. Le format CSV permet de stocker un tableau à deux dimensions dans un format texte très simple : une ligne de tableau par ligne de fichier, la première ligne contient les titres des colonnes du tableau, les cellules d'une ligne de tableau sont séparées par des virgules, chaque li ne ligne comporte le même nombre de cel cellules, si le texte d'une cellule contient un caractère délimiteur, il faut entourer le texte de guillemets, délimi si le texte contient un guillemet, il faut répéter le guillemet et entourer le texte de guillemets. Par exemple, la première ligne de la deuxième feuille du classeur de l'exemple sera ainsi formatée en CSV : Listing 2. differents_formats.php <?php // inclure la bibliotheque principale require PHPExcel.php ; require fonctions.php ; try{ /* PARTIE INDEPENDANTE DU FORMAT DE SORTIE */ // creer le classeur $classeur = new PHPExcel(); // selectionner la feuille de travail $feuille = $classeur->getactivesheet(); // Tableau de donnees a deux dimensions $donnees_feuille1 = array( ); array( lettres, chiffres ), array( xxx,12), array( yyy,5), array( zzz,214) // ajouter des donnees dans la feuille ajouterdonnees($feuille, $donnees_feuille1); Produit,Couleur,Taille,Prix,Livraison Par défaut, certains tableurs importent directement les données pour le format CSV, sans demander les séparateurs de cellules, de lignes ou les délimiteurs de texte. Générer un CSV La bibliothèque PHPExcel permet d'enregistrer les données d'une feuille du classeur au format CSV, et une seule uniquement. C'est la classe PHPExcel_Writer_ CSV, définie dans le fichier CSV.php, qui permet l'export d'une des feuilles du classeur au format CSV. Si le classeur comporte plusieurs feuilles, il faut créer un fichier CSV par feuille. Le document généré ne comporte que les données brutes, aucune information de style et de mise en page ne peut être exportée. Pour générer un document CSV, il faut : inclure le script CSV.php, créer une instance de PHPExcel _ Writer _ CSV (objet $writer), ); array( Chaussure, marron, 43,42, sous 48H ) ajouterdonnees($feuille2, $donnees_feuille2); // mise en page >setautosize(true); $style_feuille = $feuille2->getstyle( A1 ); $style_feuille_font = $style_feuille->getfont(); $style_feuille_font->setname( Verdana ); $style_feuille_font->setsize(14); $style_feuille_font->setbold(true); $feuille2->getcolumndimension( A )- $feuille2->getcolumndimension( E )- >setautosize(true); $style_feuille = $feuille2->getstyle( E1 ); $style_feuille_font = $style_feuille->getfont(); $style_feuille_font->setsize(14); $style_feuille_font->setbold(true); $style_feuille = $feuille2->getstyle( E2 ); $style_feuille_font = $style_feuille->getfont(); $style_feuille_font->getcolor()->setargb(phpexcel_ Style_Color::COLOR_RED); // creer une deuxieme feuille $feuille2 = $classeur->createsheet(); // definir le titre de la feuille $feuille2->settitle( Commandes ); $feuille2->getrowdimension( 1 )->setrowheight(35); $donnees_feuille2 = array( array( Produit, Couleur, Taille, Prix, Liv raison ), array( T-shirt, marron, L,16, EFFECTUEE ), array( Pantalon, bleu, 42,69.9, sous 48H ), /* PARTIE DEPENDANTE DU FORMAT DE SORTIE */ // envoi au navigateur ou stockage sur le serveur $format = (isset($_get[ format ]))? $_ GET[ format ] : ; $stocker = isset($_get[ stocker ]); genererdoc($classeur, $format, $stocker); catch(exception $e){ die( echec :.$e->getmessage());?> phpsolmag.org/fr 4
Pour les débutants choisir la feuille à exporter, s'il y en a plusieurs, avec la méthode SetSheetIndex de la classe PHPExcel _ Writer _ CSV. La méthode prend en argument l'indice de la feuille du classeur (la première feuille a l'indice 0), utiliser l'extension.csv et le type MIME text/csv. Pour générer un CSV (Figure 1), le script PHP reçoit le format CSV en paramètre : differents_formats.php?format=csv La fonction genererdoc (Listing 1) : inclut la bibliothèque associée au format de sortie qu'elle reçoit en paramètre, instancie un objet PHPExcel _ Writer _ CSV, indique que le séparateur de cellules doit être une virgule (méthode setdelimiter) et que la feuille à exporter est la seconde (méthode SetSheetIndex), génère les lignes d'en-tête HTTP suivantes (type MIME du fichier, nom et disposition) et envoie le document au navigateur (flux php://output). header('content-type:text/csv'); header('content-disposition:inline;filename=differents_ formats.csv'); PDF La classe PHPExcel_Writer_PDF, définie dans le fichier PDF.php, permet d'exporter une des feuilles du classeur, ou tout le classeur, au format PDF. PHPExcel utilise le générateur de PDF FPDF. Ce freeware est inclus dans la distribution PHPExcel 1.7.6. Attention, l'export ne conserve pas toutes les propriétés de style (Figure 3). Pour générer un document PDF, il faut : inclure le script PDF.php, créer une instance de PHPExcel _ Writer _ PDF, choisir la feuille à exporter, s'il y en a plusieurs, avec la méthode SetSheetIndex de la classe PHPExcel _ Writer _ PDF. La méthode prend en argument l'indice de la feuille du classeur. Par défaut c'est la première feuille qui est exportée. Pour exporter tout le classeur il faut utiliser la méthode writeallsheets. utiliser l'extension.pdf et le type MIME application/ pdf. L'extension GD2 est nécessaire si vous souhaitez exporter en PDF ou en BIFF5 une feuille de classeur contenant des images (cf Générer des classeurs pour tableur avec PHPExcel dans le numéro précédent). HTML Il est possible de générer une des pages du classeur, ou tout le classeur, au format HTML. Attention, là aussi l'export ne conserve pas toutes les propriétés de style. Cette fonctionnalité peut être utile si l'internaute n'a pas de tableur ou pour visualiser rapidement les données. Pour générer un document HTML, il faut : inclure le script HTML.php, créer une instance de PHPExcel _ Writer _ HTML, déterminer la feuille à exporter, s'il y en a plu plusieurs, avec la méthode SetSheetIndex de la classe PHPExcel _ Writer _ HTML ou utiliser la méthode writeallsheets pour indiquer qu'il faut exporter toutes les feuilles, par défaut c'est la première feuille qui est exportée, utiliser l'extension.html et le type MIME text/html. Si aucun format n'est fourni au script, c'est le format HTML qui est pris par défaut dans la fonction genererdoc. BIFF5 Les versions antérieures de Microsoft Excel ne peuvent pas ouvrir les documents au format Excel2007. Pour générer un document pour ces tableurs, vous devez utiliser la classe PHPExcel_Writer_Excel5, définie dans le fichier Excel5.php. Cette classe est une réécriture du module PEAR Spreadsheet_Excel_Writer (PHP4), elle comporte les mêmes limitations que la classe PEAR. Le document est généré au format BIFF5 (Excel5 Binary Interchange File Format). L'extension à utiliser est.xls. Lors de l'export du classeur certaines fonctionnalités ne seront pas conservées (dégradé de couleur de fond, style par défaut de la feuille, style conditionnel, metainformations...). Pour que le document soit généré au format BIFF5, il faut : inclure le script Excel5.php, créer une instance de PHPExcel _ Writer _ Excel5, utiliser l'extension.xls et le type MIME application/ vnd.ms-excel. Vous avez jusqu'à présent généré avec PHPExcel des fichiers qui étaient envoyés au navigateur. Vous allez apprendre dans la section suivante à stocker le document sur le disque. Stocker le fichier sur le serveur Toutes les classes décrites ci-dessus (PHPExcel_ Writer_*) définissent la méthode save. Comme vous l'avez vu, celle-ci permet d'envoyer le document au navigateur si elle prend en argument le paramètre php:// output. Elle peut aussi stocker le classeur sur le ser- 5 9/2011
pour les débutants Sur Internet http://www.php.net - Site officiel de PHP, http://phpexcel.codeplex.com site officiel de la bibliothèque PHPExcel. veur web. Pour ce faire, il faut lui passer en argument le chemin où doit être enregistré le fichier. La fonction genererdoc du Listing 1 indique que le fichier doit être enregistré dans un répertoire 'resultats' situé dans le même répertoire que le script exécuté. Sous Linux/MacOS, veillez à ce que le script ait les droits en écriture sur ce dossier. Les choix du format et du mode de sortie sont réalisés dans l'url. L'argument format contrôle le format de sortie (cf la partie Excel2007). Si l'argument stocker est présent, le fichier est enregistré sur le disque du serveur web, sinon il est envoyé vers le navigateur. Dans l'exemple ci-après, l'appel au script enregistrera le document au format Excel5 sur le disque du serveur : differents_formats.php?format=excel5&stocker Conclusion Dans cet article, vous avez appris à générer des documents dans les différents formats de sortie proposés par la bibliothèque PHPExcel : Excel2007, CSV, PDF, HTML et BIFF5. Vous avez vu comment stocker ces documents sur le disque dur du serveur web ou les envoyer vers le navigateur. Dans les prochains numéros, vous verrez comment réaliser la mise en page, fixer le style des cellules et des feuilles et comment insérer des formules et des images dans les cellules. CILIA MAURO, MAGALI CONTENSIN Cilia Mauro est gestionnaire de bases de données et développeur d applications web au CNRS. Elle enseigne les bases de données et PHP à l université. Contact : cilia.mro@gmail.com Magali Contensin est chef de projet en développement d applications au CNRS. Elle enseigne depuis plus de dix ans le développement d applications web à l université et est l auteur de nombreux articles sur le développement web en PHP. Contact : http://magali.contensin.online.fr phpsolmag.org/fr 6