IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

UTF-8 : export de MYSQL vers EXCEL via php ? [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier Avatar de tavarlindar
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 262
    Points : 97
    Points
    97
    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 : 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.
    Mieux vaut penser avant d'agir que d'agir en rêvant.

  2. #2
    Membre régulier Avatar de tavarlindar
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 262
    Points : 97
    Points
    97
    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 : 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
     
    /** 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.

  3. #3
    Membre éclairé
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Points : 709
    Points
    709
    Par défaut
    Bonjour,
    Je pense que PHPExcel code en iso effectivement, donc pour le traitement des accents faut utiliser quelquechose qui ressemble a ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Membre régulier Avatar de tavarlindar
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 262
    Points : 97
    Points
    97
    Par défaut
    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.

  5. #5
    Membre régulier Avatar de tavarlindar
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 262
    Points : 97
    Points
    97
    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.

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Novembre 2009
    Messages : 141
    Points : 194
    Points
    194
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  7. #7
    Membre régulier Avatar de tavarlindar
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 262
    Points : 97
    Points
    97
    Par défaut
    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 : 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
     
    <?
            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 : 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
    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 : 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
    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 : 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
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Exporter table MySQL vers Excel 2007
    Par spamitovic dans le forum VB.NET
    Réponses: 3
    Dernier message: 18/01/2011, 19h14
  2. [MySQL] Remplacer "." par "," dans export table mysql vers excel
    Par leeloo35 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/02/2008, 11h18
  3. [Excel] Exporter table MySQL vers Excel
    Par Manuxy dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 06/07/2007, 20h50
  4. [Excel] Exportation d'une requête vers Excel via PHP
    Par Foudébois dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 17/05/2006, 16h46
  5. Export de données Oracle vers Excel via PHP
    Par Yanos dans le forum Oracle
    Réponses: 1
    Dernier message: 11/01/2006, 18h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo