2010-06-03 14 views
0

Ce n'est pas une pure question java et peut également être lié à HTMLProblème encodage java-> xls

J'ai écrit un servlet java qui interroge une table de base de données et affiche le résultat comme une table html. L'utilisateur peut aussi demander à recevoir le résultat sous la forme sur une feuille Excel. Je crée la feuille Excel en imprimant la même table html, mais avec le type de contenu "application/vnd.ms-excel". Le fichier Excel est bien créé. Le problème est que les tables peuvent contenir des données non anglaises, donc je veux d'utiliser un encodage UTF-8.

PrintWriter out = response.getWriter(); 
response.setContentType("application/vnd.ms-excel:ISO-8859-1"); 
//response.setContentType("application/vnd.ms-excel:UTF-8"); 
response.setHeader("cache-control", "no-cache"); 
response.setHeader("Content-Disposition", "attachment; filename=file.xls"); 
out.print(src); 
out.flush(); 

Aussi j'essayé de convertir en octets de chaîne

byte[] arrByte = src.getBytes("ISO-8859-1"); 
String result = new String(arrByte, "UTF-8"); 

Mais je reçois toujours des ordures, les caractères non-anglais apparaissent comme des déchets (AEIOU) Que puis-je faire ?. MISE À JOUR: si j'ouvre le fichier Excel dans le bloc-notes + + le type d'encodage de fichier est "UTF-8 sans nomenclature", si je change l'encodage en "UTF-8" puis j'ouvre le fichier dans Excel , les caractères "áéíóú" semblent bons.

+0

Etes-vous en train d'envoyer un fichier CSV ou XLS? Si vous essayez de générer CVS, utilisez: response.setContentType ("text/csv; charset = CP1252"); – Eduardo

Répondre

0

Est-ce que vous obtenez "garbage" lorsque vous imprimez le résultat à la sortie standard?

Modifier (code dans les balises de code du commentaire ci-dessous): response.setContentType("application/vnd.ms-excel; charset=UTF-8")

+0

Seulement dans Excel (2003) – Xerg

+0

Votre code Java semble bien. Je pense que le problème pourrait être la façon dont vous déclarez l'encodage et la façon dont Excel '03 s'attend à le voir. Essayez de faire response.setContentType ("application/vnd.ms-excel; jeu de caractères = UTF-8") à la place. – invaderkay

+0

En effet, le fichier est sauvegardé en "UTF-8 sans nom" mais si vous changez en "UTF-8" avec notepad ++, il semble bon dans Excel. – Xerg

1

Excel est un format binaire, pas un format de texte, de sorte que vous ne devriez pas besoin de mettre tout codage, car il ne suffit pas applicable . Quel que soit le système que vous utilisez pour créer le fichier Excel (par exemple, Apache Poi), il prendra en charge l'encodage du texte dans le fichier Excel.

Vous ne devriez pas essayer de convertir les octets reçus en une chaîne, il suffit de les stocker dans un tableau d'octets ou de les écrire dans un fichier.

EDIT: à partir du commentaire, il ne semble pas que vous utilisiez un "vrai" fichier binaire Excel, mais un fichier texte délimité par des tabulations (CSV). Dans ce cas, assurez-vous d'utiliser un codage cohérent, par exemple UTF-8.

En outre, avant d'appeler response.getWriter(), appelez d'abord setContentType.

Voir HttpServletResponse.getPrintWriter()

EDIT: Vous pouvez essayer d'écrire la nomenclature. Ce n'est normalement pas nécessaire, mais la gestion du format de fichier dans Office est loin d'être normale ...

Java n'a pas vraiment de support pour la nomenclature. Tu vas devoir faire semblant. Cela signifie que vous devez utiliser la réponse outputStream plutôt qu'écrivain, car vous devez écrire des octets bruts (la nomenclature). Donc, vous changez votre code à ceci:

response.setContentType("application/vnd.ms-excel:UTF-8"); 
// set other headers also, "cache-control" etc.. 
OutputStream outputStream = response.getOutputStream(); 
outputStream.write(0xEF); // 1st byte of BOM 
outputStream.write(0xBB); 
outputStream.write(0xBF); // last byte of BOM 
// now get a PrintWriter to stream the chars. 
PrintWriter out = new PrintWriter(new OutputStreamWriter(outputStream,"UTF-8")); 
out.print(src); 
+0

Je n'utilise aucune bibliothèque ... juste du texte avec "\ t", "\ n" et type de contenu application/vnd.ms-excel – Xerg

+0

Ok, mais as-tu essayé d'ouvrir .xls dans Excel? Cela ne ressemble pas à un vrai fichier Excel, peut-être un fichier CSV délimité par des tabulations? (Excel affichera ce fichier.) – mdma

+0

J'ai eu le problème seulement quand j'ouvre le dossier dans excel 2003. Je vois la poubelle dans les caractères comme "áéíóú" .. – Xerg

0

Essayez d'utiliser la méthode ServletResponse.setCharacterEncoding(java.lang.String charset).

response.setCharacterEncoding("UTF-8"); 
+1

Ça ne marche pas :( – Xerg

0

J'ai eu le même problème ..Je l'ai corrigé en utilisant print() au lieu de write()

outputStream.print('\ufeff');