8795 sujets

Développement web côté serveur, CMS

Salut,

Je recherche à générer un tableau Excel intégrant des macros à partir de données sql (extension .xls). Pour cela j'utilise la librairie PHPExcel.

Dans un premier temps je formate mes cellules et je créé mes macros, puis une fois la structure du tableau finalisé je remplis les cellules concernées avec les données sql.

J'obtiens donc bien le tableau désiré, les données sont placées au bon endroit et les macros sont présentes mais non interprétées Smiley decu .
En gros pour que les macros soient interprétées (ici seulement des sommes) il semble qu'il faille remplir les cellules avant la création des macros.

Personnellement cela ne m'arrange pas du tout. J'ai donc cherché une fonction qui actualiserait toutes les cellules du tableau... et je cherche toujours Smiley lol

Je me tourne donc vers vous dans l'espoir qu'un de vous connaisse une telle fonction. Smiley murf
Modifié par Glopp (27 Apr 2009 - 08:46)
Finalement j'ai fais un test et ce n'est pas le fait de déclarer une fonction (fonction, macro? j'avoue ne pas trop savoir, je ne suis pas pro excel ^^) avant de remplir le tableau qui bloque.

Voila un code d'exemple:
<?php

include 'PHPExcel.php';
include 'PHPExcel/Writer/Excel5.php';


$format_hour = array(            
	'code' => '[h]:mm'
);

/** creation d'un tableau */
$workbook = new PHPExcel;

/** acces a la premiere page */
$sheet = $workbook->getActiveSheet();

/** formatage des cellules A1, A2, A3 de type [h]:mm */
$sheet->getStyle('A1')->getNumberFormat()->applyFromArray($format_hour);
$sheet->getStyle('A2')->getNumberFormat()->applyFromArray($format_hour);
$sheet->getStyle('A3')->getNumberFormat()->applyFromArray($format_hour);

/** on entre les données */
$sheet->setCellValue('A1','01:00');
$sheet->setCellValue('A2','2:00');
$sheet->setCellValue('A3','=SUM(A1:A2)');

/** on cree un fichier .xls en sortie */

$writer = new PHPExcel_Writer_Excel5($workbook);

header('Content-type: application/vnd.ms-excel');
header('Content-Disposition:inline;filename=test.xls ');

$writer->save('php://output');
                    
?>


Si vous testez ce .php, vous remarquerez que les cellules A1 et A2 ont bien été renseignées et la cellule A3 comporte bien la bonne fonction.
Seulement les cellules A1 et A2 se sont pas formatées(il faut sélectionner les cellules et taper entrer pour activer la fonction en A3)

Une idée?
A oui si vous supprimez le formatage et que vous mettez des entiers par exemple, plus de souci mais moi je dois travailler sur des heures Smiley sweatdrop
Effectivement c'est baloo ^^

<?php

include 'PHPExcel.php';
include 'PHPExcel/Writer/Excel5.php';


$format_hour = array(            
	'code' => '[h]:mm'
);

$workbook = new PHPExcel;

$sheet = $workbook->getActiveSheet();

$sheet->getStyle('A1')->getNumberFormat()->applyFromArray($format_hour);
$sheet->getStyle('A2')->getNumberFormat()->applyFromArray($format_hour);
$sheet->getStyle('A3')->getNumberFormat()->applyFromArray($format_hour);

$aa = date('i',strtotime('01:30'))+60*date('h',strtotime('01:30'));

$sheet->setCellValue('A1', $aa);
$sheet->setCellValue('A2', '02:00');
$sheet->setCellValue('A3','=SUM(A1:A2)');

$writer = new PHPExcel_Writer_Excel5($workbook);

header('Content-type: application/vnd.ms-excel');
header('Content-Disposition:inline;filename=test.xls ');

$writer->save('php://output');
                    
?>


Et bah moi j'en ai une Smiley lol

Alors je suis partis sur l'idée d'entrer un float ou int en paramètre de ma cellule pour que la fonction somme puisse être évaluée.
Je pense que c'est la solution mais j'ai encore un petit problème. Smiley smile En effet j'ai pas tout à fait 1:30 ou 01:30 dans ma cellule mais '613656:01' qui correspond à '01/01/1970 00:01:30'
Après quelques essais en tout genre je suis arrivé au bon résultat:

<?php

include 'PHPExcel.php';
include 'PHPExcel/Writer/Excel5.php';


$format_hour = array(            
	'code' => '[h]:mm'
);

$workbook = new PHPExcel;

$sheet = $workbook->getActiveSheet();

$sheet->getStyle('A1')->getNumberFormat()->applyFromArray($format_hour);
$sheet->getStyle('A2')->getNumberFormat()->applyFromArray($format_hour);
$sheet->getStyle('A3')->getNumberFormat()->applyFromArray($format_hour);

$heureA1 = (date('i',strtotime('01:30'))+60*date('h',strtotime('01:30')))/(24*60);
$heureA2 = (date('i',strtotime('01:30'))+60*date('h',strtotime('01:30')))/(24*60);

$sheet->setCellValue('A1', $heureA1);
$sheet->setCellValue('A2', $heureA2);
$sheet->setCellValue('A3','=SUM(A1:A2)');

$writer = new PHPExcel_Writer_Excel5($workbook);

header('Content-type: application/vnd.ms-excel');
header('Content-Disposition:inline;filename=test.xls ');

$writer->save('php://output');
                    
?>


Il faut diviser le résultat en minutes par 24*60, pourquoi? j'en sais trop rien mais si quelqu'un peut me l'expliquer je suis preneur.