IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Introduction à PHPExcel

Image non disponible


précédentsommairesuivant

Travailler avec l'existant

Suite à la publication de cet article, une des demandes était de savoir si on pouvait modifier un fichier Excel existant ?
La réponse est oui ! Et nous allons voir comment faire, pour lire le fichier, récupérer les données et en ajouter ou modifier.

Lire un fichier Excel

La première action à faire est de lire le fichier Excel.
Pour ce faire nous allons créer un environnement de travail correct pour les exemples.
PHPExcel respectant la convention de nommage de PEAR, cela va nous faciliter le travail, en effet je vais partir du principe que nous travaillons dans le répertoire 'Classes', fourni par l'archive de PHPExcel.
Au cœur de ce répertoire, nous allons créer un fichier 'read.php' avec le contenu suivant :

 
Sélectionnez
$path = './';
set_include_path(get_include_path() . PATH_SEPARATOR . $path);

function __autoload($classe)
{
  $fichier = str_replace
    (
     '_',      # Caractère à remplacer.
     DIRECTORY_SEPARATOR, # Caractère de remplacement.
     $classe       # Cible du remplacement.
    ) . '.php' ;
  require_once($fichier) ; # Chargement de la classe.
}



$objet = new PHPExcel_Reader_Excel5();

$excel = $objet->load('Exemple14.xls');

$writer = new PHPExcel_Writer_Excel5($excel);

$writer->save('autreFichier.xls');

Voici quelques explications de ce code. On précise d'abord où on travaille, la racine des classes.

 
Sélectionnez
$path = './';
set_include_path(get_include_path() . PATH_SEPARATOR . $path);

Ensuite, on met en place la fonction autoload standard de la SPL.
Cela nous évitera de mettre en place les require nécessaires.

 
Sélectionnez
function __autoload($classe)
{
  $fichier = str_replace
    (
     '_',      # Caractère à remplacer.
     DIRECTORY_SEPARATOR, # Caractère de remplacement.
     $classe       # Cible du remplacement.
    ) . '.php' ;
  require_once($fichier) ; # Chargement de la classe.
}

On instancie un objet de lecture de PHPExcel

 
Sélectionnez
$objet = new PHPExcel_Reader_Excel5();

Ici j'ai pris le pli de travailler avec un fichier Excel non XML (.xls), mais nous disposons des possibilités suivantes :

  • CSV ;
  • Excel2003(XML) ;
  • Excel2007 ;
  • Excel5 ;
  • SYLK ;
  • OoCalc.

Ensuite nous lisons le fichier Excel, pour les exemples, je me base sur un fichier (le 14) généré par les démos de PHPExcel.

 
Sélectionnez
$excel = $objet->load('Exemple14.xls');

Nous disposons donc d'un objet, possédant le contenu de notre fichier Excel.
À partir de ce moment, nous pouvons travailler sur le fichier Excel. Une fois le travail terminé nous l'enregistrons ou créons un nouveau document.

 
Sélectionnez
$writer = new PHPExcel_Writer_Excel5($excel);

$writer->save('autreFichier.xls')

Ici nous avons tout simplement enregistré le fichier sous un autre nom.
Pour faciliter le travail avec cette librairie, les développeurs de PHPExcel, ont mis en place un pattern factory.

 
Sélectionnez
$objet = PHPExcel_IOFactory::createReader('Excel5');

$excel = $objet->load('Exemple14.xls');

$writer = PHPExcel_IOFactory::createWriter($excel);
$writer->save('Exemple14.xls');

Écrire dans un fichier existant !

Un des aspects les plus intéressants est de pouvoir écrire dans un fichier existant.
Cela se fait très facilement, en fait de la même façon que de créer un document, il faut juste signaler à PHPExcel où l'on veut écrire !

 
Sélectionnez
$objet = PHPExcel_IOFactory::createReader('Excel5');

$excel = $objet->load('Exemple14.xls');

$sheet = $excel->getSheet(0);

$sheet->setCellValue('A50', 'MaitrePylos');

$writer = PHPExcel_IOFactory::createWriter($excel);
$writer->save('Exemple14.xls');

Ici nous devons donc savoir sur quelles feuilles travailler

 
Sélectionnez
$sheet = $excel->getSheet(0);

La méthode getSheet(), renvoie donc un sheet indexé, mais si nous connaissons son nom, il est également possible de la récupérer

 
Sélectionnez
$sheet = $excel->getSheetByName('Invoice');

Ensuite nous écrivons dedans

 
Sélectionnez
$sheet->setCellValue('A35', 'MaitrePylos');

Connaître son fichier

Dans la perspective où vous ne connaîtriez pas le fichier avec lequel vous travaillez, il est possible de récupérer une série d'information sur ce fichier.

Le nom des sheets

La méthode getSheetNames() retourne un tableau contenant le nom des sheets

 
Sélectionnez
$name_sheet = $excel->getSheetNames();

L'index des sheets

La méthode getSheetCount() retourne le nombre de sheets suivant son index

 
Sélectionnez
$count_sheet = $excel->getSheetCount();

Fusionner plusieurs fichiers Excel

Maintenant que nous savons lire un fichier Excel, rien ne nous empêche d'en fusionner plusieurs

 
Sélectionnez
$objet1 = new PHPExcel_Reader_Excel5();

$excel1 = $objet1->load('Exemple14.xls');

$objet2 = new PHPExcel_Reader_Excel5();

$excel2 = $objet2->load('autreFichier.xls');


$writer = new PHPExcel();
//insertion des sheets du premier fichier

for ($i=0;$i<$excel1->getSheetCount();$i++){
  $writer->addSheet($excel1->getSheet($i));
}
//insertion des sheets du second fichier
for ($i=0;$i<$excel2->getSheetCount();$i++){
  $writer->addSheet($excel2->getSheet($i));
}
//je modifie un sheet pour voir la différence
$sheet = $writer->getSheet(3);
$sheet->setCellValue('A50', 'MaitrePylos');


$save = new PHPExcel_Writer_Excel5($writer);
$save->save('Exemple_gg.xls');

Utiliser plusieurs fois le même sheet

On peut vouloir dupliquer le même sheet, dans ce cas il faut utiliser la méthode copy de l'objet Reader

 
Sélectionnez
          $objet1 = new PHPExcel_Reader_Excel5();

$excel1 = $objet1->load('Exemple14.xls');

$sheet1 = $excel1->getSheet(0);
$sheet2 = $sheet1->copy();
$sheet2->setTitle('Cloned Worksheet');

$writer = new PHPExcel();
$writer->addSheet($sheet1);
$writer->addSheet($sheet2);
$sheet2 = $writer->getSheet(2);
$sheet2->setCellValue('A2', 2);
$save = new PHPExcel_Writer_Excel5($writer);
$save->save('bugResult1.xls');

Nous avons ici copié deux fois le même sheet.
Une autre possibilité est d'utiliser la fonction Clone de PHP

 
Sélectionnez
$objet1 = new PHPExcel_Reader_Excel5();

$excel1 = $objet1->load('Exemple14.xls');

$sheet1 = $excel1->getSheet(0);
$sheet2 = clone $sheet1;
$sheet2->setTitle('Cloned Worksheet');

$writer = new PHPExcel();
$writer->addSheet($sheet1);
$writer->addSheet($sheet2);
$sheet2 = $writer->getSheet(2);
$sheet2->setCellValue('A2', 2);
$save = new PHPExcel_Writer_Excel5($writer);
$save->save('bugResult1.xls');

Mes essais concernant cette seconde méthode ne sont pas très concluants quand le sheet que l'on veut copier contient des images. En effet lors de la copie je perds toute trace des images.
Dans ce cas, je préfère réaliser une fusion de deux fichiers, en utilisant deux fois le même fichier d'origine. Je terminerai ici ce paragraphe sur la lecture des fichiers.


précédentsommairesuivant

Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.