Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > Bureautique
Bureautique Forum d'entraide sur la gestion dynamique de documents de bureautique (Word, Excel, OpenOffice...) avec PHP. Avant de poster -> Cours Excel, FAQ OpenXML, FAQ OpenDocument
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/04/2011, 17h32   #1
Membre à l'essai
 
Étudiant
Inscription : mai 2007
Messages : 36
Détails du profil
Informations personnelles :
Âge : 23
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2007
Messages : 36
Points : 21
Points : 21
Envoyer un message via MSN à DanTesS
Par défaut PHPExcel, formule qui référence une autre feuille

Bonjour à tous,

Je rencontre une difficulté concernant l'utilisation de la classe PHPExcel.

Je dois parser les données d'un fichier excel pour les rentrer dans une base de données, et ce fichier contient plusieurs feuilles.

Hors sur l'une des feuilles, une des colonnes contient des cellules dont la formule référence une autre feuille.

Quand j'utilise les méthodes de la classe pour afficher le contenu, par :

getValue, j'obtiens la formule en elle-même.
getCalculatedValue, utilisée normalement pour calculer le contenu des cellules avec une formule, j'obtiens une erreur.

Je pense avoir assez bien commenté le code pour que cela soit correctement compréhensible, donc le voila :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 
<?php 
	error_reporting(E_ALL);
	include 'PHPExcel/Classes/PHPExcel.php'; //Chargement de la librairie
	include 'PHPExcel/Classes/PHPExcel/Reader/Excel5.php'; //Chargement de la librairie de lecture
 
 
	$files = 'myfile.xls' ; //définit le fichier, il contient 9 feuilles
 
	$excel_reader = new PHPExcel_Reader_Excel5() ; //Nouvel objet de lecture
	$excel_reader->setReadDataOnly(true) ; //true or false, même résultat
 
 
	$sheets = array(1 => 'Sommaire', 2 => 'Serveurs', 3 => 'Applis') ; //on référence 3 des 9 feuilles
	//La feuille ou se situe la formule qui pose problème est "Serveur", la formule pointant vers la feuille "Sommaire", "Applis" est la pour des tests supplémentaires, et ne sera pas utilisée ici
 
	$excel_reader->setLoadSheetsOnly($sheets) ;
 
	$classeur = $excel_reader->load($files) ; //on charge le fichier
 
 
	$feuille = $classeur->getSheetByName($sheets[2]); //On choisit la feuille "Serveurs"
	$feuille->getDefaultColumnDimension()->setWidth(12); //avec ou sans, cela ne fonctionne pas
 
	//<==========================================================================================>
	//<==========================================================================================>
	//Dans mon fichier excel, la cellule V3 contient les données "01J / 11Z", et est calculée par cette formule :
		//=RECHERCHEV(STXT(U3;1;8);Sommaire!$B$32:$C$54;2;FAUX)
		//en Anglais : =VLOOKUP(MID(U3,1,8),Sommaire!$B$32:$C$54,2,FALSE)
	//comme on le voit dans la formule, il y a une référence vers "Sommaire"
	//<==========================================================================================>
	//<==========================================================================================>
 
	echo $feuille->getCell('V3')->getValue(); //avec ça, on obtient :
	//=VLOOKUP(MID(U3,1,8),Sommaire!$B$32:$C$54,2,FALSE)
	//cela affiche la formule, et ne la calcule pas
 
	echo $feuille->getCell('V3')->getCalculatedValue(); //et avec ça :
	//Fatal error: Call to a member function cellExists() on a non-object in <path>\Classes\PHPExcel\Calculation.php on line 3209
	//cela plante, au lieu de calculer
?>
Je ne peux pas vous fournir le fichier excel, celui-ci contenant des données sensibles et personnelles.

Si quelqu'un a une solution, cela m'arrangerait beaucoup

Je vous remercie par avance pour les réponses que vous pourriez m'apporter, et vous souhaite une bonne soirée.
DanTesS est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/04/2011, 14h28   #2
Rédacteur/Modérateur
 
Avatar de MaitrePylos
 
Homme Gérard Ernaelsten
DBA & Dev PHP
Inscription : juin 2005
Messages : 3 174
Détails du profil
Informations personnelles :
Nom : Homme Gérard Ernaelsten
Âge : 39
Localisation : Belgique

Informations professionnelles :
Activité : DBA & Dev PHP
Secteur : Service public

Informations forums :
Inscription : juin 2005
Messages : 3 174
Points : 6 460
Points : 6 460
Salut,

Je n'ai pas mon ordi ici, mais le message te dit que la méthode n'existe pas, en soit cela veut dire que tu as un souci d'instanciation.

Je dirai a première vue que le , fonctionne dans un writer et non un reader, peux-être qu'en instanciant les deux classes on pourrais y arriver (je sais c'est tordu, mais bon).

A toi de voir.
MaitrePylos est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/04/2011, 14h14   #3
Membre à l'essai
 
Étudiant
Inscription : mai 2007
Messages : 36
Détails du profil
Informations personnelles :
Âge : 23
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2007
Messages : 36
Points : 21
Points : 21
Envoyer un message via MSN à DanTesS
Bonjour,

Merci de votre réponse, mais hélas ce n'est pas ceci, voici pourquoi :

Une autre formule me posait exactement le même problème lors d'un calcul :

Code :
1
2
 
=SI(A6="AO-Hermann";"HPROD";SI(ESTERR(TROUVE("PPROD";U6));"PROD";"P_PROD"))
par un getValue() j'obtenais la formule en elle-même, et par un getCalculatedValue(), j'obtenais la même erreur.

Ne trouvant pas de solution, je me suis penché sur la formule en elle-même, et j'ai remarqué qu'elle n'était pas 100% "aux normes" définies par Excel.

Je l'ai alors modifié par celle-ci :
Code :
1
2
 
=SI(A6="AO-Hermann";"HPROD";SI(ESTERR((TROUVE("PPROD";L6)));"PROD";"P_PROD"))
C'est tout bête, j'ai juste rajouté une paire de parenthèse...mais ça marche !

Avec le getCalculatedValue(), j'obtiens bien la même valeur que dans mon fichier Excel, signe d'un bon calcul.

Je suis en train de réfléchir à une éventuelle autre manière de faire mes formules Excel, mais cela prouve que le getCalculatedValue() est bien instancié, et fonctionne quand il peut !

Une des 2 autres formulaires qui me pose problème (Il y en avait 3, plus que 2) est :
Code :
1
2
 
=RECHERCHEV(B3;Applis!A$2:V$381;3;FAUX)
Si quelqu'un voit une autre manière de le faire interpréter...

PS : J'ai beaucoup apprécié votre article sur PHPExcel, c'est grâce à lui que j'ai décidé de réaliser mon projet grâce à cette API, merci beaucoup
DanTesS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 14h19   #4
Rédacteur/Modérateur
 
Avatar de MaitrePylos
 
Homme Gérard Ernaelsten
DBA & Dev PHP
Inscription : juin 2005
Messages : 3 174
Détails du profil
Informations personnelles :
Nom : Homme Gérard Ernaelsten
Âge : 39
Localisation : Belgique

Informations professionnelles :
Activité : DBA & Dev PHP
Secteur : Service public

Informations forums :
Inscription : juin 2005
Messages : 3 174
Points : 6 460
Points : 6 460
Effectivement il y a ps mal de souci avec les quotes et doublesQuotes, essaye ta formule en anglais pour voir si il y a une différence.

De plus, peux-tu créer un fichier Excel, reprenant ta problématique avec des informations farfelues, que l'on puisse tester.

Merci.
MaitrePylos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 15h46   #5
Membre à l'essai
 
Étudiant
Inscription : mai 2007
Messages : 36
Détails du profil
Informations personnelles :
Âge : 23
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2007
Messages : 36
Points : 21
Points : 21
Envoyer un message via MSN à DanTesS
bon, j'ai identifié le problème, il vient de mon fichier Excel !
En effet, PHPExcel gère très bien les VLOOKUP avec une référence dans une autre feuille.

Pour le (et me le) prouver, j'ai créé ce bout de code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
 
<?php 
	error_reporting(E_ALL);
	include 'PHPExcel/Classes/PHPExcel.php'; //Chargement de la librairie
	include 'PHPExcel/Classes/PHPExcel/Reader/Excel5.php'; //Chargement de la librairie de lecture
	include 'PHPExcel/Classes/PHPExcel/Writer/Excel5.php'; //Chargement de la librairie de lecture
	PHPExcel_Calculation::getInstance()->writeDebugLog = true; 
 
 
	$files = 'testreference.xls' ; //définit le fichier, il contient 2 feuilles
 
	$excel_reader = new PHPExcel_Reader_Excel5() ; //Nouvel objet de lecture
	$excel_reader->setReadDataOnly(true) ; //true or false, même résultat
 
 
	$sheets = array(1 => 'Feuil1', 2 => 'Feuil2') ; //on référence les 2 feuilles
 
	$excel_reader->setLoadSheetsOnly($sheets) ;
 
	$classeur = $excel_reader->load($files) ; //on charge le fichier
 
 
	$feuille = $classeur->getSheetByName($sheets[2]); //On choisit la feuille "Serveurs"
	$feuille->getDefaultColumnDimension()->setWidth(12); //avec ou sans, cela ne fonctionne pas
 
	//<================================>
	//Simple Vlookup (recherchev) avec des valeurs présentes dans la même feuille
	echo $feuille->getCell('B4')->getValue(); //doit afficher =VLOOKUP(A4,$K$24:$M$27,2,FALSE), ok
	echo '<br />' ;
	echo $feuille->getCell('B4')->getCalculatedValue(); //doit afficher dd, ok
	echo '<br /><br />' ;
	//<================================>
 
	//<================================>
	//appel de valeur sur une autre feuille, sans aucune formule
	echo $feuille->getCell('B3')->getValue(); //doit afficher =Feuil1!B3, ok
	echo '<br />' ;
	echo $feuille->getCell('B3')->getCalculatedValue(); //doit afficher bb, ok
	echo '<br /><br />' ;
	//<================================>
 
	//<================================>
	//Ici c'est celle qui, avec mon fichier excel pose problème :
	//un VLOOKUP avec des réferences vers une autre feuille
	echo $feuille->getCell('B2')->getValue(); //doit afficher : =VLOOKUP(A2,Feuil1!$A$1:$C$4,2,FALSE), ok
	echo '<br />' ;
	echo $feuille->getCell('B2')->getCalculatedValue(); //doit afficher cc, ok aussi ! Donc j'en déduis que le soucis vient de mon fichier excel
	echo '<br /><br />' ;
	//<================================>
 
	var_dump(PHPExcel_Calculation::getInstance()->debugLog);
?>
Qui fonctionne avec le fichier excel basique mis en pièce-jointe, mais qui rassemble tout ce qui me posait problème.

Toutes les formules fonctionnent même celle :
Code :
1
2
 
=VLOOKUP(A2,Feuil1!$A$1:$C$4,2,FALSE)
qui, si cela avait été mon fichier, aurait planté.

Donc la faute à mon excel, maintenant il faut trouver d'où ça vient....
Fichiers attachés
Type de fichier : xls testreference.xls (13,5 Ko, 1 affichages)
DanTesS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 16h21   #6
Membre à l'essai
 
Étudiant
Inscription : mai 2007
Messages : 36
Détails du profil
Informations personnelles :
Âge : 23
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2007
Messages : 36
Points : 21
Points : 21
Envoyer un message via MSN à DanTesS
bon ben je passe le topic en résolu, car la classe PHPExcel n'y étais pour rien du tout, et mon code initial fonctionnait bien.

Tout venait de mes fichiers Excel qui étaient mal foutus, mais pour ma décharge, ce n'est pas moi qui les génère

quand même d'y avoir porté attention
DanTesS est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h18.


 
 
 
 
Partenaires

Hébergement Web