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.
8. 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 la travail, en effet je vais partir du principe que nous travaillons
dans le répertoire 'Classes', fourni par l'archive de PHPExcel.
Au coeur de ce répertoire nous allons créer un fichier 'read.php' avec le contenu suivant:
$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.
$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's nécessaire.
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
$objet
=
new PHPExcel_Reader_Excel5();
Ici j'ai pris le plis de travailler avec un fichier Excel non XML (.xls), mais nous disposons des possiblitées 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
$excel
=
$objet
->
load('
Exemple14.xls
'
);
Nous disposons donc d'un objet, possédant le contenu de notre fichier Excel.
A 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.
Ici nous avons tous simplement enregistrer 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.
8.1. Ecrire dans un fichier existant !▲
Un des aspects les plus intéressant 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 !
$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
$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
$sheet
=
$excel
->
getSheetByName('
Invoice
'
);
Ensuite nous écrivons dedans
$sheet
->
setCellValue('
A35
'
,
'
MaitrePylos
'
);
8.2. Connaître son fichier.▲
Dans la perspective où vous ne connaîtriez pas le fichier avec lesquel vous travaillez, il est possible de récupèrer une serie d'information sur ce fichier.
8.2.1. Le nom des sheets▲
La méthode getSheetNames() retourne un tableau contenant le nom des sheet
$name_sheet
=
$excel
->
getSheetNames();
8.2.2. L'index des sheets▲
La méthode getSheetCount() retourne le nombre de sheet suivant son index
$count_sheet
=
$excel
->
getSheetCount();
8.3. Fusionner plusieurs fichiers Excel▲
Maintenant que nous savons lire un fichier Excel, rien ne nous empêche d'en fusionner plusieurs
$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 sheet du premier fichier
for ($i
=
0
;
$i
<
$excel1
->
getSheetCount();
$i
++
){
$writer
->
addSheet($excel1
->
getSheet($i
));
}
//insertion des sheet 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
'
);
8.3.1. 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
$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 possiblité est d'utiliser la fonction Clone de PHP
$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 perd 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.