Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/01/2011, 00h32   #1
Membre du Club
 
Avatar de tavarlindar
 
Inscription : janvier 2007
Messages : 238
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 238
Points : 57
Points : 57
Par défaut UTF-8 : export de MYSQL vers EXCEL via php ?

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 :
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 :
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 :
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 :
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.
__________________
Mieux vaut penser avant d'agir que d'agir en rêvant.
tavarlindar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2012, 20h04   #2
Membre du Club
 
Avatar de tavarlindar
 
Inscription : janvier 2007
Messages : 238
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 238
Points : 57
Points : 57
Par défaut tout code fera l'affaire ! export vers excel

Bonjour,

Après avoir passé des jours et des jours à chercher et tester, je n'ai malheureusement trouver aucune solution à ce besoin pourtant simple : exporter le résultat d'une requête (mysql utf-8) vers excel.

J'ai testé PHPExcel, sans succès. Avec PHPExcel, je suis limité par l'exportation de petits fichiers. J'ai besoin d'exporter un résultat de 60000 lignes environ et de 20 colonnes.

Je n'ai pas accès à PEAR.

Bref, je suis preneur de toute solution.

Avec PHPExcel : voici où j'en suis (ce code fonctionne pour de petites extractions)
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
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
 
/** PHPExcel */
 
require_once 'ClassesPHPExcel/PHPExcel.php';
 
require_once ("include/ParametresConnexion.php");
$db = mysql_connect(SERVEUR, NOM,PASSE) or die(mysql_error());
mysql_select_db(BASE,$db) or die(mysql_error());
mysql_query("SET NAMES utf8");
 
$reqExcel = "SELECT * FROM maTable"; 
$resultat = mysql_query($reqExcel); 
 
$numoffields=mysql_num_fields($resultat);
$entete_champs =1;
 
function col2chr($a){
 
        $a=$a+1; 
		if($a<27){
            return strtoupper(chr($a+96));   
        }else{
            while($a > 26){
                $b++;
                $a = $a-26;               
            }                  
            $b = strtoupper(chr($b+96));   
            $a = strtoupper(chr($a+96));               
            return $b.$a;
        }
    } 
 
// Create new PHPExcel object
$objPHPExcel = new PHPExcel();
 
 
//$cacheMethod = PHPExcel_CachedObjectStorageFactory:: cache_to_phpTemp;
//$cacheSettings = array( ' memoryCacheSize ' => '4GB');
//PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
 
 
// Set properties
$objPHPExcel->getProperties()->setCreator("TOTO")
							 ->setLastModifiedBy("TOTO")
							 ->setTitle("Office 2007 XLSX Test Document")
							 ->setSubject("Office 2007 XLSX Test Document")
							 ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.")
							 ->setKeywords("office 2007 openxml php")
							 ->setCategory("Test result file");
 
 
//Entête de colonne
 
for ($entete_champs=0; $entete_champs<$numoffields;$entete_champs++){
	$objPHPExcel->setActiveSheetIndex(0)->setCellValueByColumnAndRow($entete_champs,1, mysql_field_name($resultat,$entete_champs));
	$lettre_colonne = col2chr($entete_champs).'1';
	$lettre_colonne = $entete_champs.'1';
}
 
$i = 2; // on démarre à la ligne 2, car ligne 1 correspond au entete de colonne 
while($row = mysql_fetch_array($resultat))
{
  for ($j=0; $j<$numoffields;$j++){
   $objPHPExcel->setActiveSheetIndex(0)->setCellValueByColumnAndRow($j,$i, $row[$j]);   
   }$i++;
}
 
// Rename sheet
$objPHPExcel->getActiveSheet()->setTitle('Simple');
 
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);
 
 
// Redirect output to a client’s web browser (Excel5)
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="01simple.xls"');
header('Cache-Control: max-age=0');
 
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
exit;
__________________
Mieux vaut penser avant d'agir que d'agir en rêvant.
tavarlindar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2012, 20h40   #3
Membre expérimenté
 
Avatar de buggen25
 
Inscription : août 2008
Messages : 510
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 510
Points : 595
Points : 595
Bonjour,
Je pense que PHPExcel code en iso effectivement, donc pour le traitement des accents faut utiliser quelquechose qui ressemble a ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
$index = 1;
while($row = mysql_fetch_array($result))
 {
 $objPHPExcel->setActiveSheetIndex(0)
			 ->setCellValue('A'.(string)$index, iconv("ISO-8859-1//TRANSLIT","UTF-8",$row['Colonne1']))
			 ->setCellValue('B'.(string)$index, iconv("ISO-8859-1//TRANSLIT","UTF-8",$row['Colonne2']))
			 ->setCellValue('C'.(string)$index, iconv("ISO-8859-1//TRANSLIT","UTF-8",$row['Colonne3']))
			 ->setCellValue('D'.(string)$index, iconv("ISO-8859-1//TRANSLIT","UTF-8",$row['Colonne4']))
			 ->setCellValue('E'.(string)$index, iconv("ISO-8859-1//TRANSLIT","UTF-8",$row['Rue']))
			 ->setCellValue('F'.(string)$index, iconv("ISO-8859-1//TRANSLIT","UTF-8",$row['Colonne5']));
			 $index = $index + 1;
 }
__________________
If you type Google into Google, you Can break the internet" - The IT Crowd
buggen25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2012, 20h54   #4
Membre du Club
 
Avatar de tavarlindar
 
Inscription : janvier 2007
Messages : 238
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 238
Points : 57
Points : 57
Tout d'abord, merci à vous buggen25 pour votre réponse. Je me sens moins seul !

Le problème (à priori) n'est pas que PHPExcel http://www.phpexcel.net code ou non en iso, c'est qu'on se retrouve vite avec de problèmes de mémoire côté serveur. J'arrive parfaitement à exporter du chinois, russe et autres langues.

Il y a plein de post à ce sujet sur le site consacrée à cette class. Malheureusement (pour moi) c'est tout en anglais et cela dépasse mes compétences techniques.
A priori, beaucoup de personnes ont rencontré le même problème que moi.
Après que je code mal et que je n’optimise pas l'usage ce cette class, c'est certainement possible.
Là où je suis désespéré, c'est qu'avec mon premier exemple http://www.phpclasses.org/package/64...to-Excel-.html, j'arrive à exporter n'importe quoi, pas de limitation au niveau de la taille de la requête, mais cette class ne gère pas l'utf-8.
PHPExcel gère l'utf-8 mais ne permet pas d'exporter n'importe quelle requête (taille)
__________________
Mieux vaut penser avant d'agir que d'agir en rêvant.
tavarlindar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2012, 21h52   #5
Membre du Club
 
Avatar de tavarlindar
 
Inscription : janvier 2007
Messages : 238
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 238
Points : 57
Points : 57
Par défaut quelles solution pour vos exports ?

Up !

Avant de capituler, je pose une dernière fois la question à la communauté française :

Comment faites vous pour exporter vers excel un requête impliquant une base en utf-8 et un résultat conséquent (60000 lignes au moins).

Je n'ai rien trouvé à ce jour sur la toile ... Il doit bien avoir une solution.

Par avance mille merci à celui ou ceux qui pourront m'aider.
__________________
Mieux vaut penser avant d'agir que d'agir en rêvant.
tavarlindar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2012, 13h12   #6
Membre actif
 
Homme Glen Rhodes
Étudiant
Inscription : novembre 2009
Messages : 134
Détails du profil
Informations personnelles :
Nom : Homme Glen Rhodes
Âge : 24
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : novembre 2009
Messages : 134
Points : 166
Points : 166
Bonjour,

Je n'ai pas eu ce problème personnellement car j'utilises PHPExcel avec des petits fichiers (moins de 1000 lignes), mais de ce que j'ai pu lire dans les formus le problème avec PHPExcel est le dépassement mémoire.
Ce lien donne de bonnes infos sur la consommation mémoire : http://phpexcel.codeplex.com/discuss...tName=phpexcel
Donc il existe quatres solutions:
- augmenter la limite mémoire de php (dans le php.ini sachant qu'elle est à 128 MB de base je crois et que ils ont l'air d'être dépassés pour 80000 cellules)
-il est possible de réduire l'utilisation de la mémoire en utilisant un principe de cache
Code :
1
2
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_discISAM;
PHPExcel_Settings::setCacheStorageMethod($cacheMethod);
-une combinaison des deux précédentes
-la méthode qui permet de traiter n'importe quelle taille de fichier mais qui prend un temps considérable, tout est expliqué ici : http://phpexcel.codeplex.com/discuss...tName=phpexcel
glen1789 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2012, 22h15   #7
Membre du Club
 
Avatar de tavarlindar
 
Inscription : janvier 2007
Messages : 238
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 238
Points : 57
Points : 57
Bonjour glen1789,
Tout d'abord merci pour votre réponse.

Je ne réponds qu'aujourd'hui, mais il arrive parfois de rencontrer d'autres préoccupations plus graves que des lignes de codes à gérer ...
Bref, J'ai testé votre code. En réduisant la taille des requêtes, cela améliore les choses, néanmoins impossible d'exporter de gros fichiers.

Après avoir cherché et cherché, j'ai trouvé une issue satisfaisante en partant de cette solution
http://www.phpclasses.org/package/20...cel-files.html.
Il n'y a qu'à lire le forum associé à cette class, pour comprendre qu'il y a un problème. Néanmoins en cherchant un peu et en modifiant le code, j'ai réussi à obtenir une solution qui me permet d'exporter une requête SQL à partir d'une base en UTF-8. Je n'ai à ce jour pas rencontré de problème de taille de fichier. Il faut juste penser à donner les droits en écriture.

Voici donc le code pour ceux qui sont confronté au même soucis :

fichier basique de test :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
<?
        define ('NOM',"UUUUU");//nom utilisateur
	define ('PASSE', "XXXXX");//mot de passe
	define ('SERVEUR', "YYYYY");//nom du serveur
	define ('BASE', "ZZZZZZ");//nom de la base de donnees
 
	include("include/mysql_excel.inc.php");
 
	$import=new HarImport();
	$import->openDatabase(SERVEUR,NOM,PASSE,BASE);
 
	$reqExcel = "SELECT * FROM vos tables";
 
$import->ImportData($reqExcel,"Test_export.xls",true);
?>
fichier mysql_excel.inc.php
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
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
 
<?
	require("include/db.inc.php");
	require("include/excelwriter.inc.php");
 
	Class HarImport
	{
		var $db=null;
		var $error=""; //String
 
		function HarImport()
		{
 
		}
 
		/*
		* @Params
		* 		$host : Host name of mysql database
		* 		$user : User
		* 		$pwd  : Password
		* 		$databse : database name
		*/
 
		function openDatabase($host,$user,$pwd,$database)
		{
			$this->db=new DB();
			$this->db->open($host,$user,$pwd,$database);
			mysql_query("SET NAMES utf8;");
 
			if(!$this->db)
			{
				$this->error=$this->db->error();
				return false;
			}
		}
 
		/*
		* @Params 
		* 		$tnlName=Name of table from the data is imported to excel file
		* 		$fileName=Name of the file wants to save as.On leaving balnk it takes the table name as file name
		* 		$download=Boolean value whether you wants to save on disk or you want to force to download the file.
		*/ 
		function ImportDataFromTable($tblName,$fileName="",$download=false)
		{
			if(empty($fileName))
				$fileName=$tblName.".xls";
			$sql="SELECT * FROM $tblName";
			return $this->ImportData($sql,$fileName,$download);
		}
		/*
		* @Params 
		* 		$sql=A valid SQL query.
		* 		$fileName=Name of the file wants to save as.On leaving balnk it takes the table name as file name
		* 		$download=Boolean value whether you wants to save on disk or you want to force to download the file.
		*/ 
		function ImportData($sql,$fileName="har_excel.xls",$download=false)
		{
			$excel=new ExcelWriter($fileName);
			if($excel==false)
			{
				$this->error=$excel->error;
				return false;		
			}
 
			$this->db->query($sql);
			if($this->db->numRows()==0)			
			{
				$this->error="No data found in the table";
				return false;
			}
			if($row=$this->db->fetchAssoc())
			{
				for($i=0;$i<count($row);$i++)
				{
					$fields[]=$this->db->fieldName($i);
				}
				$excel->writeLine($fields);
 
				do
				{
					$excel->writeLine($row);
				}while($row=$this->db->fetchAssoc());
			}
			$excel->close();
			$this->db->close();
			if($download)
			{
				if(!headers_sent())
					$this->download_file($fileName,true);
				else
				{
					$this->error="Error :Headers already Sent.Can't Download file.";
				}
			}
			return;
		}
 
		function download_file($filename,$isDel=false)
		{
			$file=basename($filename);
 
			if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE"))
			{
				$file = preg_replace('/\./', '%2e', $file, substr_count($file, '.') - 1);
			}
 
			// make sure the file exists before sending headers
			if(!$fdl=@fopen($filename,'r'))
			{
			   die("<br>Cannot Open File!<br>");
			}
			else
			{
			  //header("Cache-Control: ");// leave blank to avoid IE errors
			  header("Cache-Control: no-cache, must-revalidate"); 
			  //header("Pragma: ");// leave blank to avoid IE errors
			  header("Pragma: no-cache"); 
			 // header("Content-type: application/octet-stream");
			  header("Content-type: application/vnd.ms-excel");
			  header("Content-Disposition: attachment; filename=\"$file\"");
			  header("Content-length:".(string)(filesize($filename)));
			   sleep(1);
			  fpassthru($fdl);
			}
			if($isDel)
			{
				@unlink($filename);
			}
		}
 
	}
 
?>
fichier include/db.inc.php
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
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
 
<?
     class DB
     {
        ///Declaration of variables
 
        var $host = '';
        var $user = '';
        var $password = '';
        var $database = '';
        var $persistent = false;
 
        var $conn=NULL;
        var $result=false;
        var $fields;
        var $check_fields;
        var $tbname;
        var $addNewFlag=false;
        ///End
 
        function DB($host="",$user="",$password="",$dbname="",$open=false)
        {
         if($host!="")
            $this->host=$host;
         if($user!="")
            $this->user=$user;
         if($password!="")
            $this->password=$password;
         if($dbname!="")
            $this->database=$dbname;
 
         if($open)
           $this->open();
        }
        function open($host="",$user="",$password="",$dbname="") //
        {
         if($host!="")
            $this->host=$host;
         if($user!="")
            $this->user=$user;
         if($password!="")
            $this->password=$password;
         if($dbname!="")
            $this->database=$dbname;
 
         if($this->connect()===false) return false;
         if($this->select_db()===false) return false;
         return $this->conn;
        }
        function set_host($host,$user,$password,$dbname)
        {
         $this->host=$host;
         $this->user=$user;
         $this->password=$password;
         $this->database=$dbname;
        }
        function affectedRows() //-- Get number of affected rows in previous operation
        {
         return @mysql_affected_rows($this->conn);
        }
        function close()//Close a connection to a  Server
        {
         return @mysql_close($this->conn);
        }
        function connect() //Open a connection to a Server
        {
          if(is_resource($this->conn))
            return true;
          // Choose the appropriate connect function
          //if ($this->persist)
              //$this->conn = @mysql_pconnect($this->host, $this->user, $this->password);
         // else
              $this->conn = @mysql_connect($this->host, $this->user, $this->password);
 
          // Connect to the database server
          if(!is_resource($this->conn))
             return false;
          else
              return true;
 
        }
        function select_db($dbname="") //Select a databse
        {
          if($dbname=="")
             $dbname=$this->database;
            return  @mysql_select_db($dbname,$this->conn);
        }
        function create_db($dbname="") //Create a database
        {
          if($dbname=="")
             $dbname=$this->database;
          return $this->query("CREATE DATABASE ".$dbname);
        }
        //function drop_db($dbname="") //Drop a database
        //{
         // if($dbname=="")
         //    $dbname=$this->database;
         // return $this->query("DROP DATABASE ".$dbname);
        //}
        function error() //Get last error
        {
            return (mysql_error());
        }
        function errorno() //Get error number
        {
            return mysql_errno();
        }
        function query($sql = '') //Execute the sql query
        {
            $this->result = @mysql_query($sql, $this->conn);
            return $this->result;
        }
        function numRows($result=null) //Return number of rows in selected table
        {
            if(!is_resource($result))
                $result = $this->result;
            return (@mysql_num_rows($result));
        }
        function fieldName($field, $result=null)
        {
            if(!is_resource($result))
                $result = $this->result;
           return (@mysql_field_name($result,$field));
        }
        function insertID()
        {
            return (@mysql_insert_id($this->conn));
        }
 
        function data_seek($arg1,$row=0) ///Move internal result pointer
        {
            if(is_resource($arg1))
                $result = $arg1;
            else
                $result = $this->result;
 
            if(!is_resource($arg1) && !is_null($arg1))
                $row = $arg1;
 
            return mysql_data_seek($result,$row);
        }
 
        function fetchRow($result=null)
        {
            if(!is_resource($result))
                $result = $this->result;
            return (@mysql_fetch_row($result));
        }
 
        function fetchObject($result=null)
        {
            if(!is_resource($result))
                $result = $this->result;
            return (@mysql_fetch_object($result));
        }
        function fetchArray($arg1=null,$mode=MYSQL_BOTH)
        {
            if(is_resource($arg1))
                $result = $arg1;
            else
                $result = $this->result;
 
            if(!is_resource($arg1) && !is_null($arg1))
                $mode = $arg1;
 
            return (@mysql_fetch_array($result,$mode));
        }
        function fetchAssoc($result=null)
        {
            if(!is_resource($result))
                $result = $this->result;
            return (@mysql_fetch_assoc($result));
        }
        function freeResult($result=null)
        {
            if(!is_resource($result))
                $result = $this->result;
            return (@mysql_free_result($result));
        }
        function getSingleResult($sql)
        {
            $result = $this->query($sql);
            $row = $this->fetchArray($result,MYSQL_NUM);
            $return=$row[0];
            return $return;
        }
 
        function addNew($table_name)
        {
           $this->fields=array();
           $this->addNewFlag=true;
           $this->tbname=$table_name;
        }
 
        function edit($table_name)
        {
           $this->fields=array();
           $this->check_fields=array();
           $this->addNewFlag=false;
           $this->tbname=$table_name;
        }
 
        function update()
        {
         foreach($this->fields as $field_name=>$value)
         {
           if($value=='--DATE--')
               $qry.=$field_name."=now(),";
           else if(strtolower(trim($value))=='now()')
               $qry.=$field_name."=now(),";
           else
               $qry.=$field_name."='".$value."',";
         }
         $qry=substr($qry,0,strlen($qry)-1);
 
          if($this->addNewFlag)
            $qry="INSERT INTO ".$this->tbname." SET ".$qry;
          else
          {
           $qry="UPDATE ".$this->tbname." SET ".$qry;
           if(count($this->check_fields)>0 && is_array($this->check_fields))
           {
               $qry.=" WHERE ";
               foreach($this->check_fields as $field_name=>$value)
                   $qry.=$field_name."='".$value."' AND ";
               $qry=substr($qry,0,strlen($qry)-5);
           }
           else if(!empty($this->check_fields))
           {
               $qry.=" WHERE ".$this->check_fields." ";
           }
 
          }
         return $this->query($qry);
        }        
     }
?>
fichier excelwriter.inc.php
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
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
 
<?
/*
     * Class is used for save the data into microsoft excel format.
     * It takes data into array or you can write data column vise.
     */
 
 
    Class ExcelWriter
    {
 
        var $fp=null;
        var $error;
        var $state="CLOSED";
        var $newRow=false;
 
        /*
        * @Params : $file  : file name of excel file to be created.
        * @Return : On Success Valid File Pointer to file
        *             On Failure return false     
        */
 
        function ExcelWriter($file="")
        {
            return $this->open($file);
        }
 
        /*
        * @Params : $file  : file name of excel file to be created.
        *             if you are using file name with directory i.e. test/myFile.xls
        *             then the directory must be existed on the system and have permissioned properly
        *             to write the file.
        * @Return : On Success Valid File Pointer to file
        *             On Failure return false     
        */
        function open($file)
        {
            if($this->state!="CLOSED")
            {
                $this->error="Error : Another file is opend .Close it to save the file";
                return false;
            }    
 
            if(!empty($file))
            {
                $this->fp=@fopen($file,"w+");
            }
            else
            {
                $this->error="Usage : New ExcelWriter('fileName')";
                return false;
            }    
            if($this->fp==false)
            {
                $this->error="Error: Unable to open/create File.You may not have permmsion to write the file.";
                return false;
            }
            $this->state="OPENED";
            fwrite($this->fp,$this->GetHeader());
            return $this->fp;
        }
 
        function close()
        {
            if($this->state!="OPENED")
            {
                $this->error="Error : Please open the file.";
                return false;
            }    
            if($this->newRow)
            {
                fwrite($this->fp,"</tr>");
                $this->newRow=false;
            }
 
            fwrite($this->fp,$this->GetFooter());
            fclose($this->fp);
            $this->state="CLOSED";
            return ;
        }
        /* @Params : Void
        *  @return : Void
        * This function write the header of Excel file.
        */
 
        function GetHeader()
        {
            $header = <<<EOH
                <html xmlns:o="urn:schemas-microsoft-com:office:office"
                xmlns:x="urn:schemas-microsoft-com:office:excel"
                xmlns="http://www.w3.org/TR/REC-html40">
 
                <head>
                <meta http-equiv=Content-Type content="text/html; charset=utf-8">
                <meta name=ProgId content=Excel.Sheet>
                <!--[if gte mso 9]><xml>
                 <o:DocumentProperties>
                  <o:LastAuthor>Sriram</o:LastAuthor>
                  <o:LastSaved>2005-01-02T07:46:23Z</o:LastSaved>
                  <o:Version>10.2625</o:Version>
                 </o:DocumentProperties>
                 <o:OfficeDocumentSettings>
                  <o:DownloadComponents/>
                 </o:OfficeDocumentSettings>
                </xml><![endif]-->
                <style>
                <!--table
                    {mso-displayed-decimal-separator:"\.";
                    mso-displayed-thousand-separator:"\,";}
                @page
                    {margin:1.0in .75in 1.0in .75in;
                    mso-header-margin:.5in;
                    mso-footer-margin:.5in;}
                tr
                    {mso-height-source:auto;}
                col
                    {mso-width-source:auto;}
                br
                    {mso-data-placement:same-cell;}
                .style0
                    {mso-number-format:General;
                    text-align:general;
                    vertical-align:bottom;
                    white-space:nowrap;
                    mso-rotate:0;
                    mso-background-source:auto;
                    mso-pattern:auto;
                    color:windowtext;
                    font-size:10.0pt;
                    font-weight:400;
                    font-style:normal;
                    text-decoration:none;
                    font-family:Arial;
                    mso-generic-font-family:auto;
                    mso-font-charset:0;
                    border:none;
                    mso-protection:locked visible;
                    mso-style-name:Normal;
                    mso-style-id:0;}
                td
                    {mso-style-parent:style0;
                    padding-top:1px;
                    padding-right:1px;
                    padding-left:1px;
                    mso-ignore:padding;
                    color:windowtext;
                    font-size:10.0pt;
                    font-weight:400;
                    font-style:normal;
                    text-decoration:none;
                    font-family:Arial;
                    mso-generic-font-family:auto;
                    mso-font-charset:0;
                    mso-number-format:General;
                    text-align:general;
                    vertical-align:bottom;
                    border:none;
                    mso-background-source:auto;
                    mso-pattern:auto;
                    mso-protection:locked visible;
                    white-space:nowrap;
                    mso-rotate:0;}
                .xl24
                    {mso-style-parent:style0;
                    white-space:normal;}
                -->
                </style>
                <!--[if gte mso 9]><xml>
                 <x:ExcelWorkbook>
                  <x:ExcelWorksheets>
                   <x:ExcelWorksheet>
                    <x:Name>srirmam</x:Name>
                    <x:WorksheetOptions>
                     <x:Selected/>
                     <x:ProtectContents>False</x:ProtectContents>
                     <x:ProtectObjects>False</x:ProtectObjects>
                     <x:ProtectScenarios>False</x:ProtectScenarios>
                    </x:WorksheetOptions>
                   </x:ExcelWorksheet>
                  </x:ExcelWorksheets>
                  <x:WindowHeight>10005</x:WindowHeight>
                  <x:WindowWidth>10005</x:WindowWidth>
                  <x:WindowTopX>120</x:WindowTopX>
                  <x:WindowTopY>135</x:WindowTopY>
                  <x:ProtectStructure>False</x:ProtectStructure>
                  <x:ProtectWindows>False</x:ProtectWindows>
                 </x:ExcelWorkbook>
                </xml><![endif]-->
                </head>
 
                <body link=blue vlink=purple>
                <table x:str border=0 cellpadding=0 cellspacing=0 style='border-collapse: collapse;table-layout:fixed;'>
EOH;
            return $header;
        }
 
        function GetFooter()
        {
            return "</table></body></html>";
        }
 
        /*
        * @Params : $line_arr: An valid array 
        * @Return : Void
        */
 
        function writeLine($line_arr)
        {
            if($this->state!="OPENED")
            {
                $this->error="Error : Please open the file.";
                return false;
            }    
            if(!is_array($line_arr))
            {
                $this->error="Error : Argument is not valid. Supply an valid Array.";
                return false;
            }
            fwrite($this->fp,"<tr>");
            foreach($line_arr as $col)
                fwrite($this->fp,"<td class=xl24 width=64 >$col</td>");
            fwrite($this->fp,"</tr>");
        }
 
        /*
        * @Params : Void
        * @Return : Void
        */
        function writeRow()
        {
            if($this->state!="OPENED")
            {
                $this->error="Error : Please open the file.";
                return false;
            }    
            if($this->newRow==false)
                fwrite($this->fp,"<tr>");
            else
                fwrite($this->fp,"</tr><tr>");
            $this->newRow=true;    
        }
 
        /*
        * @Params : $value : Coloumn Value
        * @Return : Void
        */
        function writeCol($value)
        {
            if($this->state!="OPENED")
            {
                $this->error="Error : Please open the file.";
                return false;
            }    
            fwrite($this->fp,"<td class=xl24 width=64 >$value</td>");
        }
    }
?>
Voili voilou. Le code d'origine d'un certain Harish Chauhan date un peu (2004), mais cela fonctionne. Sans doute, un codeur chevronné trouvera tout ceci nul à ch..., mais cela m'a bien aidé. Je suis à l'écoute de toute amélioration.

Pour info, je n'ai pas eu de réponse satisfaisante sur le forum de PHPExcel.

En espérant que ces lignes serviront à d'autres et en vous remerciant aussi pour vos posts qui m'ont aidé,
Bien à vous tous,

Tavarlindar
__________________
Mieux vaut penser avant d'agir que d'agir en rêvant.
tavarlindar est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h15.


 
 
 
 
Partenaires

Hébergement Web