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 :
ExportExcel.php
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" ;
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 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>";
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
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 ?>
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.
Partager