2010-08-12 15 views
2
include_once 'mysqlconn.php'; 
include_once "functions.php"; 
$filename = $_GET['par'].".xls"; 
header("Content-type: application/x-msexcel"); 
header('Content-Disposition: attachment; filename="'.basename($filename).'"'); 
if ($_GET['i'] == "par1") { 
    func1(); 
} else if ($_GET['i'] == "par2") { 
    echo "şşşıııİİİ"; 
    func2(); 
} else if ($_GET['i'] == "par3") { 
    echo "şşşıııİİİ"; 
    func3(); 
} 

c'est mon fichier export2excel.php et func1,2,3 sont dans le fichier functions.php et produit la sortie de la table tout fonctionne bien sauf le codage des caractères d'une manière étrange. J'utilise l'encodage utf-8 pour tous mes fichiers. 2ème sinon si l'instruction ci-dessus produit une sortie encodée saine mais reste 2 encode ma sortie avec des caractères étranges comme "BÃœTࢠఠ °". c'est "BÜTÇE İÇİ" en turc.sortie exportation php Excel

en abrégé. mêmes fichiers, même encodage, même base de données mais résultats différents.

une idée?

+2

Utilisez les balises « code » autour de votre code de sorte qu'il est réellement lisible ! –

Répondre

19

Excel utilise UTF-16LE + BOM comme codage Unicode par défaut.
Vous devez donc convertir votre sortie en UTF-16LE et ajouter le préfixe UTF-16LE-BOM "\xFF\xFE".

quelques informations supplémentaires:

Au lieu de cela je voudrais utiliser l'une des bibliothèques existantes

Edit:
code qui pourrait aider si vous avez vraiment pas voulez utiliser une bibliothèque existante

<?php 
$output = <<<EOT 
<table> 
    <tr> 
     <td>Foo</td> 
     <td>IñtërnâtiônàlizætiøöäÄn</td> 
    </tr> 
    <tr> 
     <td>Bar</td> 
     <td>Перевод русского текста в транслит</td> 
    </tr> 
</table> 
EOT; 

// Convert to UTF-16LE 
$output = mb_convert_encoding($output, 'UTF-16LE', 'UTF-8'); 

// Prepend BOM 
$output = "\xFF\xFE" . $output; 

header('Pragma: public'); 
header("Content-type: application/x-msexcel"); 
header('Content-Disposition: attachment; filename="utf8_bom.xls"'); 

echo $output; 
+0

merci, c'est exactement ce que je veux. – edib

+0

Dans Windows tout fonctionne bien, mais dans la ligne redhat linux fwrite ($ fh, b "\ xFF \ xFE"); produit une erreur: "Erreur PHP Parse: erreur de syntaxe, inattendu T_CONSTANT_ENCAPSED_STRING dans/var/www/...." pourquoi est-ce le cas? – edib

+0

quand je change le code comme ça ça a marché. $ fh = fopen ('foo.xls', "wb"); // Ajouter un préfixe à la nomenclature fwrite ($ fh, "\ xFF \ xFE"); – edib

0

Excel utilise UTF-16LE comme codage par défaut. Vous devriez donc convertir vous-même UTF-8 en UTF-16LE ou utiliser l'une des librairies Excel Excel éprouvées au lieu d'essayer de réinventer la roue. Je recommande d'utiliser PHPExcel ...

+0

J'ai seulement 8 pages pour convertir Excel. et comme je l'ai lu dans docs, les classes phpexcel ne peuvent convertir que les conversions cellule par cellule mais pas les sorties raw php html. donc je vais devoir recoder toutes les choses pour phpexcel et la taille des classes est de 7 mB. Je pense que c'est déraisonnable. – edib

+0

Je ne sais pas exactement ce que vous essayez de faire, mais PHPExcel peut générer une sortie html "brute" ... quant à la taille de la bibliothèque, j'ai commenté cela ailleurs sur SO .. Notez que 4,5 Mo de cette 7MB est la bibliothèque de tcpdf que PHPExcel inclut pour soutenir l'exportation au format PDF ... si vous n'avez pas besoin de PDF, alors supprimez-le, et l'empreinte de disque est inférieure à 3MB –

1

si quelqu'un essaie d'utiliser l'excel_writer dans moodle et obtient des problèmes d'encodage avec la sortie - disons si vous développez un rapport qui a une URL comme données i champ na - alors dans ce cas simplement résoudre ce problème, j'enveloppai les données entre guillemets il au moins ouvert dans Excel, voici mon exemple:

// Moodles using the PEAR excel_writer export 

$table->setup(); 

$ex=new table_excel_export_format($table); 

$ex->start_document({string}); 
$ex->start_table({string}); 

// heading on the spreadsheet 
$title = array('Report Title'=>'Report 1'); 
$ex->add_data($title); 
// end heading 

$ex->output_headers(array_keys($table->columns)); 

**foreach($data as $row){ 

     $string="'".trim($row->resname,"'")."'"; 
     $row->resname=$string; 
     $ex->add_data($table->get_row_from_keyed($row)); 
}** 

$ex->finish_table(); 
$ex->finish_document();