Page 1 sur 1

Mysql vers Excel

Posté : 20 mai 2005, 22:20
par rami
J'ai dû coder pour le boulot une petite moulinette pour générer un fichier Excel à partir d'informations contenues dans une base MySQL...
Je me suis dit que ça pourrait éventuellement servir à quelques personnes.
Je me suis servi de php_writeexcel

Voila le code:
<?php
/***********************************************************\
 * 															*
 * 	GENERATION D'UN FICHIER EXCEL							*
 * 		A PARTIR D'UNE REQUETE PASSEE DS L'URL				*
 * 															*
 \															*
  **********************************************************/

/***********************************************************
 * 
 * En entrée:
 * 	- strReq : chaine de la requete SQL encodée avec urlencode()
 *  - filename: nom du fichier généré
 * 
 ***********************************************************/
dateMysqlToVf($date){
//convertit une date au format Mysql vers le format français
   $l=explode('-',$date);
   $c='/';
   return $l[2].$c.$l[1].$c.$l[0];
}

set_time_limit(10);

require_once "../excel/class.writeexcel_workbook.inc.php";
require_once "../excel/class.writeexcel_worksheet.inc.php";
require_once("gestion_fns.php3");

/*connexion à votre base ici*/
// recuperation de la requete à executer ds l'url
$query= stripslashes(urldecode($_GET['strReq']));
//recuperation du nom de fichier à générer
if(empty($filename)) $filename='gestion.xls';
//$query="SELECT * FROM affaire WHERE datecreation >= '2005-01-01'";  
$res=mysql_query($query) or die('ERREUR SQL:<br>'.mysql_error());
if(mysql_num_rows($res))
{
	$fname = tempnam("/tmp", "liste_affaire.xls");
	$workbook = &new writeexcel_workbook($fname);
	$worksheet =& $workbook->addworksheet();
	
		
	# Format pour l'en-tête du tableau
	$header =& $workbook->addformat();
	$header->set_bold();
	$header->set_size(10);	
	$header->set_align('center');
	
	/* Format pour les cellules contenant des valeurs
        de longueurs inférieures à 50 */
	$formatCell =& $workbook->addformat();
	$formatCell->set_align('center');

	/* Format pour les cellules contenant des valeurs
        de longueurs supérieures à 50 */
	$formatCellLong =& $workbook->addformat();
	$formatCellLong->set_align('left');
	
	/* en-tete du tableau */
	$nb_chps = mysql_num_fields($res);
	//tableau contenant le type des champs (utilisés pour formater les dates
	$typecol = array();
	
	//tableau contenant la taille des champs
	$taille =array();
	
	for($i=0;$i < $nb_chps;$i++){
		$lib_chp = mysql_field_name($res,$i);
		$worksheet->write(0,$i, ucwords($lib_chp),$header);
		$meta = mysql_fetch_field($res,$i);
		$taille[$i] = $meta->max_length; 
		($taille[$i] > 4)? $worksheet->set_column($i,$i,$taille[$i]+4): $worksheet->set_column($i,$i,strlen($lib_chp)+2);
		$typecol[]= $meta->type;
	}
	/****************************/
	
	//on replace le pointeur au début car on a fetché le résultat pour
	//avoir des infos sur les champs
	mysql_data_seek($res,0);
	/* construction du tableau excel */
	$ligne=1;
	while($row = mysql_fetch_array($res))
	{
		for($colonne=0;$colonne<$nb_chps;$colonne++){
			if($typecol[$colonne]== 'date' && !empty($row[$colonne])) 
				//formatage des dates au format français
				$row[$colonne] = dateMysqlToVf($row[$colonne]);
			if($taille[$colonne] >=50) $format = $$formatCellLong;
			else $format = $formatCell;
			$row[$colonne]= str_replace('\\n\\r',' ',$row[$colonne]);
			$worksheet->write($ligne,$colonne,$row[$colonne],$format);
		}
		$ligne++;
	}
	
	$workbook->close();
	
	header("Content-Type: application/x-msexcel");
	header('Content-Disposition: attachment; filename="'.$filename.'"');
	$fh=fopen($fname, "rb");
	fpassthru($fh);
	unlink($fname);
}
else 
	echo '<br /><br /><br /><b> Aucun résultat trouvé!</b>';
?>

Soyez indulgent, j'ai fait cela en quelques heures! (et puis y'avait la secrétaire qui n'arrêtait pas de s'engueuler avec la comptable!).

Toute remarque est la bienvenue!
En espérant que ça puisse servir à d'autres! ;)