Créer des fichiers Excel avec des caractères Chinois en Java

Créer des fichiers Excel avec des caractères Chinois

Dans la lignée du post précédent, pourquoi ne pas continuer à parler de la Chine et aborder le sujet des exports de fichiers au format Excel.

Je vais aborder ici l’utilisation de POI et les problèmes que vous pourriez rencontrer avec des jeux de caractères exotiques.

 

Sur l’application sur laquelle je travaillais nous avions un module de transformation de fichiers CSV vers Excel.

L’implémentation de transformation repose sur POI, c’est une librairie assez simple et bien foutu pour créer des fichiers Excel.

L’algo est simple, je parcours la liste des valeurs et je crée des cellules au fur et à mesure en se basant sur un code de ce type (ici il s’agit d’une cellule au format texte) :

// row est une ligne excel créé précédemment, indexCol l'indice de colonne sur la ligne
HSSFCell cell = row.createCell(indexCol);
HSSFCellStyle textCellStyle = workbook.createCellStyle();
textCellStyle.setDataFormat(format.getFormat("General"));
cell.setCellStyle(textCellStyle);
cell.setCellValue(_value);

Seulement voila, avec cet algo on obtient un résultat un peu étrange lorsque nos données sont en Chinois :

exportbadchinese

Et je vous garantis, ce n’est pas du Chinois (même si l’un dans l’autre, je ne comprends aucun des deux…).

Solution

En fait il est nécessaire de rajouter cette petite indication à POI pour que ça se passe bien :

cell.setEncoding(HSSFCell.ENCODING_UTF_16);

Cette fois on obtient bien du Chinois dans notre fichier :

excelok

 

Astuce

J’en profite pour une petite astuce qui mérite d’être noté pour la partie purement CSV. Vous le savez sans doute, si vous utilisez un fichier csv avec l’extension xls vous pouvez aussi l’ouvrir dans Excel et celui-ci s’occupe de tout pour l’afficher comme un document « classique ».
Si vous utilisez un encodage ISO-latin1 pour vos fichiers textes sur vos postes Windows avec des caractères qui correspondent à ce charset, aucun souci, vous obtiendrez le résultat voulu.
Là où ça se corse, c’est quand vous passez en encodage UTF-8 avec des caractères Chinois. Pour le coup Excel ne sera plus capable de reconnaitre correctement votre encodage (pour l’anecdote, OpenOffice y arrive lui).

En fait il faut penser à rajouter un BOM en début de fichier pour qu’Excel ouvre correctement le fichier.

Pour cela, il suffit d’insérer le BOM en début de flux :

OutputStreamWriter osw = new OutputStreamWriter( new FileOutputStream(csv), FILE_ENCODING);
osw.write(0xFEFF);
....

 

 

Java : Travailller sur des ResourceBundle en Chinois

Travailller sur des ResourceBundle en Chinois

Au hasard de mes visites sur developpez.com je suis tombé sur le lien suivant :

http://blog.developpez.com/wichtounet/p8236/programmation/spring/utiliser-des-fichiers-utf-8-pour-l-inter/

Je viens récemment de travailler sur le portage de notre application en Chinois et bosser sur des fichiers de traduction en conservant les encodages a justement été un de nos problèmes et nous n’avons pas choisi la même solution. Du coup je fais partager ^^

Effectivement la solution de witchounet fonctionne, elle consiste à utiliser des ResourceBundle en UTF-8 directement. Il reste cependant la problématique de l’édition de ces fichiers, de l’échappement des caractères etc… Du coup pour les ResourceBundle Java on s’est plutôt orienté vers un plugin Eclipse : http://sourceforge.net/projects/eclipse-rbe/

Comment ça marche ?

Il s’agit ni plus ni moins d’un éditeur de ResourceBundle permettant d’afficher les clés du bundle associés aux traductions dans les différentes langues. Ses atouts majeurs :

  • échappement des caractères
  • encodage en unicode  (exemple : u8FDEu63A5u6D88u606Fu670Du52A1u5668u5931u8D25)
  • mise en évidence des traductions manquantes
  • création assistée d’un nouveau bundle avec les bons codes ISO pour la langue et le pays
  • vue en arbre ou vue plate

overview nouveau

Astuce

Allez quand même, pour la forme, une petite astuce qui nous a bien servi en début de projet lorsque les fichiers nous arrivaient dans des encodages exotiques.
Java est plutot bien fourni en utilitaire et il propose notamment un outils de conversion vers ascii : native2ascii

Petit exemple :

native2ascii -encoding GB2312 ResourceBundleHelper_zh.properties ResourceBundleHelper_zh.properties-NEW

Ca vous permet de retransformer vos fichiers envoyés par vos collègues Chinois en ascii. Et c’est bien pratique.