Software is like sex... It's better when it's free.

Blog - Encodage UTF-8 avec Excel

Encodage UTF-8 avec Excel

Si vous avez essayé mainte fois de produire un export excel de données issues d'une base en UTF-8 par PHP, vous êtes sans doute arrivés à des résultats surprenants.

Notre cher ami Microsoft utilise en fait l'encodage UTF-16le.

Ainsi, pour former un document excel (ici une liste d'utilisateurs), il vous "suffit" de faire :

<?php
header("Content-Type: application/vnd.ms-excel; charset=UTF-16LE");
header("Content-Disposition: attachment; filename=\"Export Excel\"");
mysql_connect("localhost","root","");
mysql_select_db("fake");
$sql = "SELECT * FROM users ORDER BY user_name";
$req = mysql_query($sql);
?>
<html><head></head><body>
  <table>
    <tr>
      <td>Nom</td>
      <td>Prénom</td>
      <td>Email</td>
    </tr>
<?
while ($row = @mysql_fetch_assoc($req))
{
?>
    <tr>
      <td><?=substr(chr(255).chr(254).mb_convert_encoding($row['user_sname'], "UTF-16LE", "UTF-8"),2)?></td>
      <td><?=substr(chr(255).chr(254).mb_convert_encoding($row['user_fname'], "UTF-16LE", "UTF-8"),2)?></td>
      <td><?=substr(chr(255).chr(254).mb_convert_encoding($row['user_email'], "UTF-16LE", "UTF-8"),2)?></td>
    </tr>
<?
}
?>
  </table>
</body></html>
Tags:  charsetmicrosoftmysqlphp.
Posté le Mardi 28 avril 2009 18:23:05

Commentaires :

Baltos, le mardi 16 février 2010 19:02:26
Merci beaucoup très utile...
@+
LBIE, le vendredi 06 novembre 2009 13:07:25
Salut Sébastien, mon article ne porte "que" sur la formation d'un document Excel à partir de PHP dans l'optique de convertir l'encodage UTF-8 de PHP vers un pseudo encodage similaire Excel ; le tout sans exploser les caractères.

Si j'ai bien compris, ton problème est autre, tu souhaites exporter un fichier Excel en UTF-8 non ?

Si tel est le cas, c'est une m...e sans nom, j'ai été amené à vouloir récupérer des données Excel et de les convertir en UTF-8 pour les utiliser dans des applications tierces (en l'occurrence MySQL) et là, ce n'est pas une partie de plaisir...

Sous Excel 2003, même un export en CSV me pétait l'encodage ; le seul moyen que j'ai trouvé et qui est crade et fastidieux est le suivant :
  • Sous Excel, éxecuter une macro pour concaténer un ";" à la fin de chaque case de chaque colonne de manière à simuler un CSV.
    Ex tableur de 3 colonnes:
    tototatatiti
    Produira:
    toto;tata;titi;
  • Sous Excel, faire un export Web (File -> Save as Web Page -> Tools -> Web Options -> Onglet "Encoding" -> Save this document as "Unicode UTF-8")
  • Sous Firefox, ouvrir le fichier HTML généré, normalement il est "convertit" par Excel en UTF-8 et afficher le code source.
  • Sous Firefox, dans le code source, copier la partie HTML correspondante à toutes tes lignes (1er <tr> jusqu'au dernier </tr>) et coller le tout dans un éditeur texte paramétré en UTF-8 (NotePad++ -> Format -> Encoder en UTF-8).
  • Sous NotePad, enregistrer le fichier en UTF-8 en excel.csv
  • Enfin, en php, éxecuter un script qui supprime les balises HTML de manière à ne préserver que la partie CSV.
    Ex:
    <?php
    $str = file_get_contents("excel.csv")
    file_put_contents("excel.csv",strip_tags($str));
    ?>
  • Tu as enfin un fichier CSV propre encodé en UTF-8 que tu peux aisément réimporter dans N applications tierces.

Gloire à Microsoft...
Sebastien, le vendredi 06 novembre 2009 10:51:51
En fait... nan cet encodage ne fonctionne pas dans mon cas...
Export UTF8 vers Office 2008 Mac ne reconnait pas non plus UTF-16LE
Sebastien, le vendredi 06 novembre 2009 10:42:48
Merci article qui m'a été bien utile, je cherchai justement le type d'encodage pour ne pas avoir mes données exportées en utf-8 sur 2 octets dans Excel... avec accents qui n'en étaient plus :)

Laisser un commentaire :

  
Captcha 
Ok