Outils personnels
Vous êtes ici : Accueil Symfony ExcelExport : Une classe PHP pour créer des exports au format Microsoft Excel .xls
Actions sur le document
  • Send this page to somebody
  • Print this page
  • Add Bookmarklet

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

Par Pierre-Yves Landuré - Dernière modification 11/07/2009 19: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();
Attachements

export excel sous IE6 et 7

Posté par Xavier le 20/12/2010 14: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

Posté par Lone Wolf le 20/12/2010 16: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

Posté par Phil le 23/06/2011 18: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

Posté par Lone Wolf le 23/06/2011 23: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

Mise en forme

Posté par Marin le 06/07/2011 16: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

Posté par hEINE le 03/02/2012 19: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;
}
}

I can't make it work

Posté par Gcko le 20/07/2012 14:28
All I get it's an empty excel file with the first cell containing "ArrayArray" :/.

En français c'est mieux.

Posté par Gcko le 20/07/2012 14: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

Posté par Biapy le 20/07/2012 14: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é


Réalisé avec Plone

Ce site respecte les normes suivantes :

Wikio