ExcelExport : Une classe PHP pour créer des exports au format Microsoft Excel .xls
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 :
- ExcelExport.class.php pour Symfony : utilise les fonctionnalités de formatage de date de Symfony, et les informations de culture de l'utilisateur.
- ExcelExport.class.php pour PHP 5 sans Symfony.
- ExcelExport.class.php pour PHP 4.
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 :
- N° : 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' => 'N°', '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();
IE 6 et 7
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
J'utilise un serveur en php 4 sous linux donc impossible d'utiliser l'objet COM...
plusieurs feuilles
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
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
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;
}
}















export excel sous IE6 et 7