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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[PHPExcel] Formule qui référence une autre feuille


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 36
    Points : 37
    Points
    37
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    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.

  3. #3
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 36
    Points : 37
    Points
    37
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    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.

  5. #5
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 36
    Points : 37
    Points
    37
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 Fichiers attachés

  6. #6
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 36
    Points : 37
    Points
    37
    Par défaut
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/01/2015, 13h37
  2. Réponses: 7
    Dernier message: 28/01/2014, 09h53
  3. [XL-2003] Userform qui contrôle une autre feuille
    Par patrick60 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 18/08/2009, 17h10
  4. Réponses: 2
    Dernier message: 20/05/2009, 12h45
  5. Réponses: 2
    Dernier message: 13/11/2008, 14h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo