Personal tools
You are here: Home Symfony ExcelExport : Une classe PHP pour créer des exports au format Microsoft Excel .xls
Document Actions
  • Send this page to somebody
  • Print this page
  • Add Bookmarklet

ExcelExport : Une classe PHP pour créer des exports au format Microsoft Excel .xls

by Pierre-Yves Landuré last modified 2009-07-11 17:33

Pendant longtemps, j'ai cru qu'il était impossible de générer des fichiers XLS à l'aide de PHP. Je me limitais donc à la création de fichiers CSV... Puis un jour, alors que je m'amusais avec PHPMyAdmin, je me suis rendu compte que ce dernier savais créer des exports Excel. Ni une, ni deux, j'ai décortiqué le fonctionnement de PHPMyAdmin, et j'ai compris. PHPMyAdmin ne crée pas des fichiers XLS, mais il crée un fichier HTML avec l'extension ".xls". Excel sait lire de tels fichiers. Cet article présente l'outil que j'ai mis au point pour reproduire cette fonctionnalité.

Important : ExcelExport nécessite ma classe LoaderTool.

En premier lieu, choisissez la version d'ExcelExport qui vous convient le mieux :

Exemple d'utilisation

Mettons que vous ayez un tableau PHP de cette forme :

$contenu = array(
array('id' => 1,
'title' => 'Mon item n°1',
'description' => 'Un item exemple',
'created_at' => time(),
),
array('id' => 2,
'title' => 'Mon item n°2',
'description' => 'Un item exemple',
'created_at' => time(),
),
);

Et que vous souhaitiez l'exporter au format Excel. En premier lieu, définissez les colonnes de votre export Excel. Ici, nous allons définir les colonnes suivantes :

  • : Valeur numérique, obtenue à partir de la colonne 'id'.
  • Nom : Valeur chaîne de caractères, obtenue à partir de la colonne 'title'.
  • Créé le : Valeur date, obtenue à partir de la colonne 'created_at'.

Pour décrire un tel export Excel, utilisez :

$columns = array(
'id' => array('title' => '', 'type' => ExcelExport::NUMBER),
'title' => array('title' => 'Nom', 'type' => ExcelExport::STRING),
'created_at' => array('title' => 'Créé le', 'type' => ExcelExport::DATE),
);

Remarque : notez que je n'ai pas décrit la colonne 'description' : elle sera ignorée dans l'export.

Remarque 2 : Si vous utilisez PHP 4, les constantes deviennent : ExcelExport__NUMBER, ExcelExport__STRING, ExcelExport__DATE.

Créez un nouvel export Excel contenant ces colonnes :

$excel_export = new ExcelExport($columns);

Remarque : Il est possible de forcer la langue cible de l'export Excel. Par défaut, il s'agit de la langue de l'utilisateur si vous utilisez Symfony, sinon, il s'agit de l'anglais (Seule 2 cultures sont supportées : 'fr', et 'en'). Pour forcer la langue, utilisez :

$excel_export = new ExcelExport($columns, 'fr');

Ou :

$excel_export->setCulture('fr');

Enfin, ajoutez votre contenu à l'export. L'ajout peut se faire ligne par ligne, ou comme dans notre cas, plusieurs lignes simultanéement :

$excel_export->addContent($contenu);

Une fois que l'export Excel contient tout sont contenu, vous pouvez le proposer au téléchargement de l'utilisateur (cette méthode utilise ma classe LoaderTool) :

$excel_export->download('mon-fichier-excel.xls');
Vous pouvez aussi récupérer le contenu Excel dans une chaîne de caractères :
$excel_contents = $excel_export->getExcelContents();
Attachments

export excel sous IE6 et 7

Posted by Xavier at 2010-12-20 12:48
Bonjour et merci pour cette classe. J'ai tenté une implémentation pour un de mes projets et j'arrive à faire fonctionner cela comme je le souhaite. Seul problème, cela ne semble pas marcher sous IE6 et 7. Avez vous également ce problème ? C'est certainement mon implémentation qui n'est pas correcte, mais j'aimerai m'en assurer.

IE 6 et 7

Posted by Lone Wolf at 2010-12-20 14:19
Bonjour,

je crois qu'il y a maintenant une extension PEAR pour faire la même chose. Quand IE 6 et IE 7, c'est très probablement un problème de Headers HTTP pour l'envoi du fichier, toutefois, je suis incapable de vous en dire plus pour le moment.

Bon courage
Lone Wolf

Génerer plusieurs feuilles excel

Posted by Phil at 2011-06-23 16:33
Est-il possible de générer plusieurs feuilles dans le même fichier Excel avec cette méthode?
J'utilise un serveur en php 4 sous linux donc impossible d'utiliser l'objet COM...

plusieurs feuilles

Posted by Lone Wolf at 2011-06-23 21:11
A ma connaissance, je ne crois pas, mais il est facile de s'en assurer avec l'enregistrement en html de xls. Créez un classeur avec plusieurs feuilles et essayez de l'enregistrer en html.

Il existe une classe permettant de générer des classeurs OpenDocument (open office, libre office) qui elle doit supporter les classeurs avec plusieurs feuilles

K parenchymal disproportionately sites acutely.

Posted by iyegigitekma at 2018-03-20 19:19
http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

Touhy liaising allergic characteristic overfilling co-sleeping.

Posted by iefuostuye at 2018-03-20 19:29
http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

The warrant choke, systematic; pessimism deficit, worms.

Posted by izovibami at 2018-03-20 19:34
http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

Ps dance technician scientifically excursions symptom proliferation.

Posted by oluqeuhabe at 2018-03-20 19:44
http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

D fittest consulted lipid-filled validated?

Posted by ipuduofaloxaj at 2018-03-20 19:55
http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

L dislocations: anteromedial multisystem interventions.

Posted by norakajfi at 2018-03-20 19:58
http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

The calibrate diversity raising salvage.

Posted by atequqasudixa at 2018-03-20 20:05
http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

With tools debate pen, canalized enterprise.

Posted by ugukuev at 2018-03-20 20:13
http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

Salivary predictable auscultation, intrabdominal vaccination; left?

Posted by emiyaco at 2018-03-20 20:17
http://doxycycline-cheapbuy.site/ - doxycycline-cheapbuy.site.ankor <a href="http://onlinebuycytotec.site/">onlinebuycytotec.site.ankor</a> http://tadalafilcialis-cheapestprice.site/

Prominent autonomy insidiously counter-traction swell, deformities, accept.

Posted by aukduwuniumuq at 2018-03-20 20:21
http://levitra-20mg-priceof.online/ - levitra-20mg-priceof.online.ankor <a href="http://pricespharmacy-canadian.online/">pricespharmacy-canadian.online.ankor</a> http://buy-amoxicillin-amoxil.online/

Magnesium classification output theophylline, faintest.

Posted by emoqmeheda at 2018-03-20 20:35
http://doxycycline-cheapbuy.site/ - doxycycline-cheapbuy.site.ankor <a href="http://onlinebuycytotec.site/">onlinebuycytotec.site.ankor</a> http://tadalafilcialis-cheapestprice.site/

Mise en forme

Posted by Marin at 2011-07-06 14:48
Bonjour,

Est-il possible de mettre en forme le fichier Excel généré ?
Par exemple mettre en gras certaines données, fusionner des cellules, mettre des bordures etc... ?

Cordialement,
Marin

Super, mais la classe php4 ne marche pas

Posted by hEINE at 2012-02-03 17:53
Une fonction est inexistante sur php4 : 'array_intersect_key'

Il faut donc ajouter dans le fichier de classe:

if (!function_exists('array_intersect_key')){
function array_intersect_key ($isec, $arr2){
$argc = func_num_args();
for ($i = 1; !empty($isec) && $i < $argc; $i++){
$arr = func_get_arg($i);
foreach ($isec as $k => $v)
if (!isset($arr[$k]))
unset($isec[$k]);
}
return $isec;
}
}

f88tw|Wacoal|I appreciate your kind assistance.

Posted by f88tw at 2020-07-13 07:44
f88tw|Wacoal|I appreciate your kind assistance.
http://mypaper.pchome.com.tw/f88tw
http://mypaper.pchome.com.tw/f88tw/P1
http://mypaper.pchome.com.tw/f88tw/post/1370781143
http://mypaper.m.pchome.com.tw/f88tw/post/1370781143

I can't make it work

Posted by Gcko at 2012-07-20 12:28
All I get it's an empty excel file with the first cell containing "ArrayArray" :/.

En français c'est mieux.

Posted by Gcko at 2012-07-20 12:30
Le temps d'écrire mon commentaire et j'ai oublié que le site était en français '-_-.

Je disais donc, j'obtiens un fichier vide avec juste la première case contenant "ArrayArray" :x.

vieux code

Posted by Biapy at 2012-07-20 12:53
Bonjour,

la classe présente est assez ancienne, et a été écrite pour symfony 1.0. Elle n'est pas compatible avec des version récentes de Symfony. Il existe de plus une classe PEAR (dont je ne me souviens plus du nom) qui implémente cette fonctionnalité. Je vous invite à regarder de ce coté.

Sincèrement,
Pierre-Yves Landuré


Powered by Plone CMS, the Open Source Content Management System

This site conforms to the following standards:

Wikio