Créer des fichiers Excel en PHP avec PHPExcel

Publié le 10 octobre 2017

Il est assez simple d’écrire un fichier CSV pour être lu dans excel avec fputcsv(). Mais cette fonction à des limites. La bibliothèque PHPExcel est très rapide à prendre en main. Si elle manque de documentation claire, elle reste accessible et permet d’avoir accès à un grand nombre de fonctionnalités indispensables.

Important !

Cette bibliothèque est maintenant dépréciée. Vous pouvez utiliser à la place la bibliothèque PhpSpreadsheet  (article à venir)

Installation de PHPExcel

La bibliothèque PHPExcel est à télécharger sur Github.

Inclure la bibliothèque à votre script :

require_once dirname(__FILE__) . '/PHPExcel/Classes/PHPExcel.php'; 

Instanciez  l’objet PHPExcel :

$objPHPExcel = new PHPExcel();

Renseignez les propriétés du document :

$objPHPExcel->getProperties()->setCreator("Charlie Stram");

Activez votre feuille de calcul :

/* Active la feuille sur laquelle nous allons travailler  */
$feuille = $objPHPExcel->getActiveSheet();
$feuille->setTitle('Le nom de ma feuille'); // Pas de caractères spéciaux ici !

Comment ajouter des valeurs à ma feuille Excel ?

Vous avez le choix entre 2 façons de cibler votre cellule :

  1. Soit en ciblant la cellule par son emplacement de type ‘B1’
    [pastacode lang= »php » manual= »%24feuille-%3EsetCellValue(‘B1’%2C’Ma%20valeur’)%3B » message= » » highlight= » » provider= »manual »/]
  2. Soit en ciblant directement la ligne et la colonne souhaitée. Notez que dans ce cas, les lignes commencent à 0 (zéro) et les colonnes à 1.
    [pastacode lang= »php » manual= »%24feuille-%3EsetCellValueByColumnAndRow(1%2C%202%2C%20’Ma%20valeur’)%3B » message= » » highlight= » » provider= »manual »/]

Comment créer un fichier Excel à partir d’un tableau en PHP ?

Prenons par exemple ce tableau tout simple, composé d’un header de 4 colonnes et de 3 lignes de données. Ce tableau peut évidemment provenir de votre base de donnée, bref, de n’importe où à condition qu’il soit bien encodé en UTF-8.

// Le tableau que nous voulons exporter en XLS : 
$header = array('COL 1', 'COL 2', 'COL 3', 'COL 4') ;
$rows[] = array( 'LIGNE 1', 'LIGNE 1', 'LIGNE 1', '1' ) ;
$rows[] = array( 'LIGNE 2', 'LIGNE 2', 'LIGNE 2', '2' ) ;
$rows[] = array( 'LIGNE 3', 'LIGNE 3', 'LIGNE 3', '3' ) ;

On s’économise quelques boucles, car PHPExcel va s’occuper de gérer notre tableau avec la fonction fromArray() qui attend 4 paramètres dont les 3 premiers sont obligatoires :

  1. $source (array) le tableau contenant les données,
  2. $nullValue (mixed) la valeur en cas de cellule vide
  3. $startCell (string) l’emplacement sur lequel démarrer l’insertion de nos données.
  4. $strictNullComparison (bool) Applique une comparaison stricte en cas de cellule vide
$feuille->fromArray($header, NULL, 'A1', true); 
$feuille->fromArray($rows, NULL, 'A2', true);

Comment enregistrer mon fichier excel ?

Vous pouvez enregistrer le fichier dans un répertoire de votre serveur, ou bien le forcer à se télécharger après génération.

Enregistrer le fichier excel :

$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel); 
$file = 'fichier.xlsx';
$objWriter->save($file);

Ou télécharger le fichier excel automatiquement après génération :

$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel); 
header('Content-type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition:inline;filename=fichier.xlsx ');
$objWriter->save('php://output');
exit ;

Comment modifier la largeur d’une cellule ou d’une colonne ?

Vous pouvez régler la largeur d’une cellule de cette manière :

$feuille->getColumnDimension('B')->setWidth(50);
$feuille->getColumnDimension('D')->setWidth(50);

Comment modifier l’apparence des cellules ?

Vous pouvez également agir sur le style, les bordures, le background et le format des données de vos cellules grâce à getStyle(). Vous pouvez cibler une cellule en particulier (‘D’) ou plusieurs cellules comme dans l’exemple suivant.

Cet exemple est complet, vous n’avez qu’à ajouter les personnalisations qui vous intéressent :

$my_style = $feuille->getStyle('D1:D10');

$my_style->applyFromArray(array(
// Personnaliser les polices
'font'=>array(
'bold'=>true,
//'italic'=>true,
//'underline'=>true,
//'strike' => true,
//'name'=>Arial,
'size'=>14,
'color'=>array('rgb'=>'FFFFFF') //soit rgb ou argb
),

// Personnaliser les fonds
'fill'=>array(
'type'=>'solid', // solid, linear, path, darkDown, darkGray, darkGrid, darkHorizontal, darkTrellis, etc.
'color'=>array('rgb'=>'1588B8') //soit rgb ou argb
),

// Personnaliser le format d'affichage
'numberformat'=>array(
'code'=>'##0.00_-', // 0, 0.00, #,##0.00, #,##0.00_-, 0%, 0.00%, d/m/y, h:mm, [$EUR ]#,##0.00_-, etc.
),

// Personnaliser l'alignement dans la cellule
'alignment'=>array(
'wrap'=>true, // Passage automatique à la ligne
'horizontal'=> 'center', // general, left, right, center ou justify
'vertical'=> 'top' // bottom, top, 'center', ou justify
),

// Personnaliser les bordures
'borders'=>array( // top, bottom, left, right ou allborders
'top' =>array( 'style'=>'hair', // none, dashDot, dashDotDot, dashed, dotted, double, hair, medium, mediumDashDot, mediumDashDotDot, mediumDashed, slantDashDot, thick, thin
'color'=>array('rgb' => 'E9602C')),
'bottom' =>array( 'style'=>'hair',
'color'=>array('rgb' => '0E345B')),
'left' =>array( 'style'=>'double',
'color'=>array('rgb' => '0E345B')),
'right' =>array( 'style'=>'mediumDashed',
'color'=>array('rgb' => '0E345B'))
),

));
 

A noter que vous pouvez définir le style par défaut de toute votre feuille comme ceci :

$feuille->getDefaultStyle() ->applyFromArray( [Votre tableau comme vu précédemment] );
Si l'article vous a aidé, vous pouvez m'offrir un café !

A lire ensuite

Cela pourrait vous intéresser

Quelques contenus proches du sujet pour prolonger la lecture.

29 septembre 2017 Librairies

Installer le widget reCAPTCHA de Google

Un captcha (à vos souhaits !), aussi indispensable à l'éditeur d'un site que fastidieux à utiliser pour l'internaute permet de vérifier que la personne qui valide votre formulaire est bien un être humain et non un robot qui viendrait spammer votre site et votre adresse email. Indispensable donc, mais qui ne s'est jamais retrouvé bloqué devant un code à déchiffrer... indéchiffrable ? Doit-on respecter les majuscules ? Est-ce le chiffre 0 ou la lettre O ? Bloquer les robots sans passer par des système de captcha illisibles, longs et fastidieux à remplir, c'est maintenant possible avec Google et son ReCaptcha Invisible. Rapide à mettre en place, il ne nécessite aucun déchiffrage de la part de l'internaute, mais un simple clic.

Lire la suite

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Un café pour le blog ? Vous aimez ce que vous lisez ici ? Offrez-moi un café.