Bonjour à tous,

Je cherche à améliorer une class php d’export de mysql vers excel.

Jusqu’à présent j’utilisais la class ci-dessous pour exporter le résultat de requête mysql vers excel sans problème. Migrant toute ma base de données en UTF-8 afin de gérer le chinois et le russe notamment, je n’arrive pas à exporter mes données correctement. Les caractères « exotiques » ne passent pas sous Excel.

Voici le code :
Dans la page php qui sert de déclencheur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
$reqExcel = "SELECT champ1, champ2, …, champ_n, …. FROM table" ;
$reqExcelCodee= urlencode($reqExcel);
echo "<br/><A HREF='ExportExcel.php?QueryExcel=$reqExcelCodee'>Export to excel</A>\n" ;
ExportExcel.php
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
 
require_once('include/sql2excel.class.php');
 
if (isSet($_GET['QueryExcel']))
{    
$query = stripSlashes($_GET['QueryExcel']);		
}
 
	//setup parameters for initiating Sql2Excel class instance
	//modify your mysql connection parameters & database name below:
 
	$db_host="localhost";
	$db_user=NOM;
	$db_pwd=PASSE;
	$db_dbname=BASE;
 
//initiating Sql2Excel class instance
	$excel=new Sql2Excel($db_host,$db_user,$db_pwd,$db_dbname);
	//Output excel file to user's browser
 
	$excel->ExcelOutput($query);
	echo"<h1>Exel Generate Completed!!</h1>";
sql2excel.class.php
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
 
<?
	/* 
	 * @version V1.0 2002/July/18 (c) Erh-Wen,Kuo (erhwenkuo@yahoo.com). All rights reserved.
	 * Released under both BSD license and Lesser GPL library license. 
	 * Whenever there is any discrepancy between the two licenses, 
	 * the BSD license will take precedence. 
	 *
	 * purpose: providing a easy method to write mysql sql content to excel file format and stream
	 *          the output to user's browser directly.
	 */
 
	include_once('include/excelgen.class.php');
	class Sql2Excel{
		var $db_host;
		var $db_user;
		var $db_pwd;
		var $db_name;
		var $db_query;
 
 
		/*Sql2Excel is class constructor
		  Return: None
		*/
		//function Sql2Excel($db_host,$db_user,$db_pwd,$db_name)
        function Sql2Excel($db_host="localhost",$db_user="",$db_pwd="",$db_name="")		
		{
			$this->db_host=$db_host;
			$this->db_user=$db_user;
			$this->db_pwd=$db_pwd;
			$this->db_name=$db_name;
 
			//connect mysql database
			$this->db_link=mysql_pconnect($this->db_host,$this->db_user,$this->db_pwd) or die("Mysql database connecion failed!");
		}//Sql2Excel() END
 
		/*ExcelOutput() is the key method to let this class works
		  This method won't work if you have not include "excelgen.class.php" well.
				  
		  Return: None
		*/
		function ExcelOutput($query="")
		{
			//connect mysql database
			mysql_select_db($this->db_name,$this->db_link);
 
			//get result
			$result=mysql_query($query);
			$numoffields=mysql_num_fields($result);
 
			// now we could construct Excel output
			$fieldstype=array();
 
			for($i=0;$i<$numoffields;$i++){
				$fieldstype[]=mysql_field_type($result,$i);
			}// for($i=0;...) END
 
			//create new instance of ExcelGen() class
			$excel = new ExcelGen("Sql2Excel");
 
			//initiate a counter for excel "ROW" counter
			$rowscounter=0;
 
			//write fields to excel
			for($i=0;$i<$numoffields;$i++){
				$fld=mysql_fetch_field($result,$i);
				$fldname=$fld->name;
				$excel->WriteText($rowscounter,$i,$fldname);
			}// for($i=0;...) END
 
			$rowscounter++;
 
			while($row=mysql_fetch_array($result)){
 
				//fetch each Cell($rowscounter,$colscounter) into Excel output stream
				for($colscounter=0;$colscounter<$numoffields;$colscounter++){
 
					//identify field type to descide how to write excel cell
					if(eregi("(int)",$fieldstype[$colscounter])){
						$excel->WriteNumber($rowscounter,$colscounter,$row[$colscounter]);
					}else{ 
						$excel->WriteText($rowscounter,$colscounter,$row[$colscounter]);
					}
				}//for($colscounter..) END
				$rowscounter++;
			}// while($row=mysql..) END
			$excel->SendFile();
			return;		
		}//ExcelOut() END		
	}//class Sql2Excel END
?>
excelgen.class.php
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
 
<?
	/* 
	 * @version V1.0 2002/July/18 (c) Erh-Wen,Kuo (erhwenkuo@yahoo.com). All rights reserved.
	 * Released under both BSD license and Lesser GPL library license. 
	 * Whenever there is any discrepancy between the two licenses, 
	 * the BSD license will take precedence. 
	 *
	 * purpose: This class is used to generate simple MS Excel file (xls) via
	 * PHP & stream to user's browser.
	 * Credits: This class is based on Erol Ozcan's psxlsgen
	 *          Excel library functions.
	 */
 
	class  ExcelGen {
	      var  $excel_data;      	// a buffer for store excel stream data
	      var  $excel_filename;     // excel filename
 
 
	     // Default constructor
	     function  ExcelGen($excel_filename='excelgen',$excel_wksheetname='david')
	     {
		$this->excel_data="";		             // a buffer for store excel stream data
		$this->excel_filename=$excel_filename;	     // excel filename
 
		$this->ExcelStart();
	     }
 
	     // start of the excel file
	     function ExcelStart()
	     {
	     	// start of excel file header
	     	$this->excel_data = pack( "vvvvvv", 0x809, 0x08, 0x00,0x10, 0x0, 0x0 );
     	     }
 
	     // end of the excel file
	     function ExcelEnd()
	     {
	       $this->excel_data .= pack( "vv", 0x0A, 0x00 );
	     }
 
	     // write a Number (double) into cell(row, col)
	     function WriteNumber( $row, $col, $value )
	     {
	        $this->excel_data .= pack( "vvvvv", 0x0203, 14, $row, $col, 0x00 );
	        $this->excel_data .= pack( "d", $value );
	     }
 
	     // write a text into cell(Row,Col)
	     function WriteText( $row, $col, $value )
	     {
	        $len = strlen( $value );
	        $this->excel_data .= pack( "v*", 0x0204, 8 + $len, $row, $col, 0x00, $len );
	        $this->excel_data .= $value;
	     }
 
	     // send generated xls as stream file
	     function SendFile()
	     {
	     	//Close Excel File         
	        $this->ExcelEnd();
	        header ( "Expires: Mon, 1 Apr 1974 05:00:00 GMT");
	        header ( "Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT" );
	        header ( "Pragma: no-cache" );
	        header ( "Content-type: application/octet-stream; name=$this->excel_filename.xls" );
	        header ( "Content-Disposition: attachment; filename=$this->excel_filename.xls"); 
	        header ( "Content-Description: PHP ExcelGen Class" );
	        print $this->excel_data;
	     }
 
	} // end of the class ExcelGen() class
?>

A partir du code initial, j'ai essayé de nombreuses modifications sans succès à savoir :
1) encoder tous les fichier en UTF-8
2) rajouter pour les requêtes sql de mysql_query("SET NAMES utf8");
3) modifier le header ( "Content-type: application/octet-stream; name=$this->excel_filename.xls" ); en précisant que c'était de l'utf8, que c'était du excel, etc...

Dans tous les cas, j'arrive à exporter vers excel, mais les catactères chinois ou russe voire les caractères accentués ne passe jamais correctement selon les modifications.

J'ai l'impression qu'excel s'attend à recevoir des data en iso classique en non pas en UTF-8.

Qui peut m'aider s'il vous plait ?

Par avance merci.

Tavar

Pour info : les datas sont enregistrées en caractères chinois, russe, ou autre (français !, anglais, ..) dans la base.