Juste en passant, j'ai pas vérifier, mais j'aurais tendance à tester ceci, suivant ton exemple
Code:
1
2
3 $celulle = ($col -5).$lig; $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($col, $lig, '=+SI('.$celulle.'="";0;$E2)');
Version imprimable
Juste en passant, j'ai pas vérifier, mais j'aurais tendance à tester ceci, suivant ton exemple
Code:
1
2
3 $celulle = ($col -5).$lig; $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($col, $lig, '=+SI('.$celulle.'="";0;$E2)');
Bjr,
J'avais envisagé ce genre de montage, le soucis c'est que dans ce cas la variable $celulle est égale à 410 par exemple à la 4eme colonne de la ligne 10.
410, dans la formule, ca ne passe pas (apache se plante) puisque la formule attend une coordonée comme D10, mais en écrivant cette réponse je me rends compte que la colonne de référence ne varie pas et je peux donc redéfinir les variables $celulle comme cela :
Et là Bingo !, merci pour la reflexion MaitrePylos.Code:
1
2
3
4 $celulle = "G".$lig; $celulle2="E".$lig; $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow("$col", "$lig", '=IF(('.$celulle.')="";0;'.$celulle2.')');
Au passage, j'avais lû dans une doc que PhpExcel ne comprenait que l'anglais dans les formules, j'ai testé avec IF et avec SI, cela passe dans les deux cas.
@+
Didier
Pour les fonction cela dépend de la version Excel installer, l'anglais fonctionnera partout :)
Et puisque je sais qu'un jour tu en auras besoin, voici une petite fonction sympathique ;)
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 function remplaceColonne ($num) { $remplace = array( 0 => 'A' , 1 => 'B' , 2=> 'C' , 3=> 'D' , 4 => 'E' , 5 => 'F' , 6 => 'G' , 7 => 'H' , 8=> 'I' , 9 => 'J' , 10 => 'K' , 11 => 'L' , 12=> 'M' , 13 => 'N' , 14 => 'O' , 15 => 'P' , 16 => 'Q' , 17 => 'R' , 18 => 'S' , 19 => 'T' , 20=> 'U' , 21 => 'V' , 22=> 'W' , 23=> 'X' , 24=> 'Y' , 25 => 'Z' ); $retour = strtr($num, $remplace); return $retour; }
Code:
1
2 $celulle = remplaceColonne(($col -5)).$lig;
Alors là MaitrePylos, t'es vraiment au-dessus de la pyramide ! :ccool:
Merci :ccool:
Didier
Bonjour à tous !
PHPExcel est vraiment très bien (j'utilisais auparavant PEAR), mais... qu'est-ce qu'il est lent ! Un fichier que PEAR me générait en 5 secondes, je l'obtiens avec PHPExcel en une bonne trentaine de secondes !!!
J'espère vraiment qu'ils vont améliorer ça, parce que là, pour l'utiliser en prod sur des gros fichiers...
Je dois bien avouer, que j'ai plusieurs génération prenant au moins 6 minutes, mais c'est de très gros fichier
En passant, mis à part PHPExcel, qu'est-ce qui existe d'autre qui ait des fonctionnalités assez avancées et qui soit encore un projet actif niveau développement (pas comme Spreadsheet Excel Writer) ? Et si possible plus rapide que PHPExcel...
Hello,
Probleme avec les formules.
Pour résumer, dès que je veux faire une somme de cellules qui contiennent elles-memes des formules, ca plante.
Explication :
J'ai une celulle en colonne J sur la ligne "x" qui affiche la valeur de la colonne G de la ligne "x" si la colonne H de la ligne "x" contient quelque chose, soit :
Ca fonctionne très bien.Code:
1
2
3
4
5
6 //ecriture de la celulle CusP $datepaycustom = "G".$lig; $montantinvoice="E".$lig; $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow("$col","$lig",'=if('.$datepaycustom.'="";0;'.$montantinvoice.')'); $col=$col+1;
En revanche dès je que veux calculer la somme de la colonne J, soit :
J'obtiens cette erreur :Code:
1
2
3
4
5
6
7
8
9
10
11 $dernligne=$lig;// recupere le numero de la derniere ligne de la liste ... Affichage des colonnes ... $lig=$dernligne+4; // emplacement de l'affichage de la somme $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(0, "$lig", 'Total Customer Payment');// titre de la colonne $celullefin = "J".$dernligne;//determine la celulle de fin de la somme $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(1, "$lig", '=SUM(J2:'.$celullefin.')');
_raiseFormulaError message is Formula Error: An unexpected error occured
Fatal error: Uncaught exception 'Exception' with message 'Formula Error: An unexpected error occured' in C:\Program Files\EasyPHP 3.0\www\Alterego\Classes\PHPExcel\Calculation.php:3032 Stack trace: #0 C:\Program Files\EasyPHP 3.0\www\Alterego\Classes\PHPExcel\Calculation.php(2483): PHPExcel_Calculation->_raiseFormulaError('Formula Error: ...') #1 C:\Program Files\EasyPHP 3.0\www\Alterego\Classes\PHPExcel\Calculation.php(1935): PHPExcel_Calculation->_parseFormula('if(G2="";0;E2)') #2 C:\Program Files\EasyPHP 3.0\www\Alterego\Classes\PHPExcel\Calculation.php(1802): PHPExcel_Calculation->_calculateFormulaValue('=if(G2="";0;E2)', 'J2', Object(PHPExcel_Cell)) #3 C:\Program Files\EasyPHP 3.0\www\Alterego\Classes\PHPExcel\Cell.php(301): PHPExcel_Calculation->calculateCellValue(Object(PHPExcel_Cell), false) #4 C:\Program Files\EasyPHP 3.0\www\Alterego\Classes\PHPExcel\Calculation.php(2726): PHPExcel_Cell->getCalculatedValue(false) #5 C:\Program Files\EasyPHP 3.0\www\Alterego\Classes\PHPExcel\Calculation.php(1935): PHPExcel_Calcul in C:\Program Files\EasyPHP 3.0\www\Alterego\Classes\PHPExcel\Calculation.php on line 3032
Il trouve une erreur dans la formule qui remplit la colonne si je lui demande de calculer la somme de ces formules alors que si je ne lui demande pas de faire cette somme, cela focntionne.
Dans ce même fichier j'obtiens sans soucis des sommes de colonnes diverses qui ne sont que des celulles sans formules, c'est pourquoi je m'oriente vers un probleme de calcul de somme de celulles contenant des formules.
Là je suis perdu après avoir essayer pas mal de variantes et j'implore de l'aide.
Didier
essaye ceci :
Code:
1
2
3
4
5 $lig=$dernligne+4; // emplacement de l'affichage de la somme $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(0, $lig, 'Total Customer Payment');// titre de la colonne $celullefin = "J".$dernligne;//determine la celulle de fin de la somme $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(1, $lig, '=SUM(J2:'."'$celullefin'".')');
slt,
j'ai essayé, j'obtiens ce message :
_raiseFormulaError message is Formula Error: An unexpected error occured
Fatal error: Uncaught exception 'Exception' with message 'Formula Error: An unexpected error occured' in C:\Program Files\EasyPHP 3.0\www\Alterego\Classes\PHPExcel\Calculation.php:3032 Stack trace: #0 C:\Program Files\EasyPHP 3.0\www\Alterego\Classes\PHPExcel\Calculation.php(2483): PHPExcel_Calculation->_raiseFormulaError('Formula Error: ...') #1 C:\Program Files\EasyPHP 3.0\www\Alterego\Classes\PHPExcel\Calculation.php(1935): PHPExcel_Calculation->_parseFormula('SUM(J2:'J9')') #2 C:\Program Files\EasyPHP 3.0\www\Alterego\Classes\PHPExcel\Calculation.php(1802): PHPExcel_Calculation->_calculateFormulaValue('=SUM(J2:'J9')', 'B13', Object(PHPExcel_Cell)) #3 C:\Program Files\EasyPHP 3.0\www\Alterego\Classes\PHPExcel\Cell.php(301): PHPExcel_Calculation->calculateCellValue(Object(PHPExcel_Cell), true) #4 C:\Program Files\EasyPHP 3.0\www\Alterego\Classes\PHPExcel\Worksheet.php(621): PHPExcel_Cell->getCalculatedValue() #5 C:\Program Files\EasyPHP 3.0\www\Alterego\Classes\PHPExcel\Writer\Excel5\Worksheet.php(385): PHPExcel_Workshe in C:\Program Files\EasyPHP 3.0\www\Alterego\Classes\PHPExcel\Calculation.php on line 3032
J'ai essayé sans les apostrophes, j'obtiens le premier message d'erreur.
J'ai également essayé en utilisant les fonctions "getcell --> getValue()" ou encore "getcell--> getCalculatedValue()", cela fonctionne très bien sur des celulles sans formule mais dès que l'on tape sur une celulle avec formule j'obtiens le message d'erreur. Il doit bien y avoir une moyen de faire des calculs sur des celulles contenant des formules !?!? :roll:
Didier
ceci ne fonctionne pas donc ?
Code:
1
2
3
4 $valA = $objPHPExcel->getActiveSheet()->getCell('J2')->getCalculatedValue(); $valB = $objPHPExcel->getActiveSheet()->getCell("'$celullefin'")->getCalculatedValue(); $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(1, $lig, '=('.$valA.'+'.$valB.')');
J'obtiens tjrs :
J9_raiseFormulaError message is Formula Error: An unexpected error occured
Fatal error: Uncaught exception 'Exception' with message 'Formula Error: An unexpected error occured' in C:\Program Files\EasyPHP 3.0\www\Alterego\Classes\PHPExcel\Calculation.php:3032 Stack trace: #0 C:\Program Files\EasyPHP 3.0\www\Alterego\Classes\PHPExcel\Calculation.php(2483): PHPExcel_Calculation->_raiseFormulaError('Formula Error: ...') #1 C:\Program Files\EasyPHP 3.0\www\Alterego\Classes\PHPExcel\Calculation.php(1935): PHPExcel_Calculation->_parseFormula('if(G2="";0;E2)') #2 C:\Program Files\EasyPHP 3.0\www\Alterego\Classes\PHPExcel\Calculation.php(1802): PHPExcel_Calculation->_calculateFormulaValue('=if(G2="";0;E2)', 'J2', Object(PHPExcel_Cell)) #3 C:\Program Files\EasyPHP 3.0\www\Alterego\Classes\PHPExcel\Cell.php(301): PHPExcel_Calculation->calculateCellValue(Object(PHPExcel_Cell), true) #4 C:\Program Files\EasyPHP 3.0\www\Alterego\admin\commandelist.php(199): PHPExcel_Cell->getCalculatedValue() #5 {main} thrown in C:\Program Files\EasyPHP 3.0\www\Alterego\Classes\PHPExcel\Calculation.php on line 3032
avec ce code :
J'ai ajouté des "echo" pour tracer et $valA n'apparait pas, seule $celullefin s'affiche.Code:
1
2
3
4
5 $celullefin = "J".$dernligne; echo $celullefin; $valA = $objPHPExcel->getActiveSheet()->getCell('J2')->getCalculatedValue();echo " ";echo $valA; $valB = $objPHPExcel->getActiveSheet()->getCell("'$celullefin'")->getCalculatedValue(); $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(1, $lig, '=('.$valA.'+'.$valB.')');
Pour info, cette technique est ok sur une colonne de celulle sans formules, bien qu'elle ne me donne que l'addition de la premiere celulle + la derniere celulle, on peut au moins en recuperer les valeurs.
Dans ta formule ici
Il ne manque pas un '$' ?Code:
1
2 ('=if(G2="";0;E2)'
Code:
1
2 ('=if(G2="";0;$E2)'
J'avais déjà essayé avec le $ devant la colonne, même avec un $ devant la ligne également car j'ai mon excel de base qui fonctionne avec : =+SI(F62="";0;$C$62).
Le $ devant la colonne permet d'avoir une valeur absolue par rapport à la celulle affichant le résultat. Dans mon cas, je n'ai besoin que d'une valeur relative à la celulle de résultat.
PHPExcel_Calculation->_parseFormula('if(G2="";0;$E$2...')
Dans les deux cas j'ai :
_raiseFormulaError message is Formula Error: An unexpected error occured
Fatal error: Uncaught exception 'Exception' with message 'Formula Error: An unexpected error occured' in C:\Program Files\EasyPHP 3.0\www\Alterego\Classes\PHPExcel\Calculation.php:3032 Stack trace: #0 C:\Program Files\EasyPHP 3.0\www\Alterego\Classes\PHPExcel\Calculation.php(2483): PHPExcel_Calculation->_raiseFormulaError('Formula Error: ...') #1 C:\Program Files\EasyPHP 3.0\www\Alterego\Classes\PHPExcel\Calculation.php(1935): PHPExcel_Calculation->_parseFormula('if(G2="";0;$E$2...') #2 C:\Program Files\EasyPHP 3.0\www\Alterego\Classes\PHPExcel\Calculation.php(1802): PHPExcel_Calculation->_calculateFormulaValue('=if(G2="";0;$E$...', 'J2', Object(PHPExcel_Cell)) #3 C:\Program Files\EasyPHP 3.0\www\Alterego\Classes\PHPExcel\Cell.php(301): PHPExcel_Calculation->calculateCellValue(Object(PHPExcel_Cell), true) #4 C:\Program Files\EasyPHP 3.0\www\Alterego\admin\commandelist.php(200): PHPExcel_Cell->getCalculatedValue() #5 {main} thrown in C:\Program Files\EasyPHP 3.0\www\Alterego\Classes\PHPExcel\Calculation.php on line 3032
Je pourrais m'en sortir en faisant faire les calculs par php et en ne faisant afficher que des valeurs par PhpExcel mais dans cela rend toute modification utlerieure de la feuille Excel impossible puisque aucune formule ne sera présente sur la feuille.
J'ai parcouru tous les fichiers exemples du dossier test du pack PhpExcel, il est evident que l'on peut effectuer des calculs sur des celulles contenant des formules, mais je n'ai pas trouvé d'exemple avec IF. Cette fonction est pourtant présente dans le fichier calculation.php ([145] => IF).
En parcourant calculation.php je me retrouve sur le fichier functions.php et j'y ai trouvé ceci :
Ca ne ressemble pas à la syntaxe d'Excel... là je me rends compte que ce sont des virgules qui séparent les arguments dans la fonction !!! Alors que ce sont des points-virgules dans Excel --> le Piège :calim2:Code:public static function STATEMENT_IF($condition = true, $returnIfTrue = 0, $returnIfFalse = False)
Ca marche nickel avec :
puis pour l'affichage de la somme :Code:$objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow("$col","$lig",'=IF('.$datepaycustom.'="",0,'.$montantinvoice.')');
Code:
1
2
3
4
5 $lig=$dernligne+5;//montant total des factures payées au prestataire $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(0, "$lig", 'Total Contractor Payment'); $celullefin = "K".$dernligne; echo $celullefin; $celulleresultat="B".$lig;echo " ";echo $celulleresultat; $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(1, $lig, '=SUM(K2:'.$celullefin.')');
Merci de ton aide MaitrePylos:ccool:, Rdv au prochain piège !:mouarf:
Didier
Et bien voilà, on devrais peut-être reprendre tout les exemples et compléter le tuto ;)
:lol: Libre à toi d'utiliser mon code pour faire une petite page d'exemple de conditions.
Je peux à l'occasion te la faire.
@+
Didier
Bonjour,
Pouvons-nous voir ce que vous avez déjà réalisé, afin de mieux se rendre compte de votre problème ?
Bonjour,
Alors pour être compris, quand vous mettez du code mettez le entre balise code le bouton #, c'est plus clair pour tout le monde.
Je viens de tester votre code il fonctionne parfaitement, je vous le remet au cas ou
Le seule souci est que vous l'enregister et l'envoyer au navigateur (c'est peut-être fait exprès !).Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 require_once '../Classes/PHPExcel.php'; require_once '../Classes/PHPExcel/Writer/Excel5.php'; $workbook = new PHPExcel(); $sheet = $workbook->getActiveSheet(); $sheet->setCellValue('A1','fichier'); $writer = new PHPExcel_Writer_Excel5($workbook); $records = 'fichier.xls'; $writer->save($records); unset($workbook); ob_clean(); header('Content-type: application/vnd.ms-excel'); header('Content-Disposition:inline;filename=Fichier.xls '); $writer->save('php://output');
Maintenant vous nous dite que avant vous mettiez du code HTML dans ce fichier, donnez- nous un exemple de code html (on verra le SQL après).
Dernière question de ma part, le code HTML que vous allez nous fournir, doit-il être également afficher sur le navigateur ?
Un fichier Excel avec phpExcel se construit à la ligne et c'est là toute la puissance de phpExcel, ce que je vous propose c'est d'afficher le fichier HTML, ensuiite de créer une classe qui créera le fichier Excel!