Este no es un puro java pregunta y también puede estar relacionado con HTML

He escrito una java servlet que consulta una tabla de base de datos y muestra la
resultado como una tabla html. El usuario también puede solicitar recibir el resultado como
una hoja de Excel.
Im creación de la hoja de Excel mediante la impresión de la misma tabla html, pero con
el tipo de contenido de «application/vnd.ms-excel». El archivo de Excel se
creado bien.
El problema es que las tablas pueden contener no-inglés datos de forma que quiero
el uso de una codificación 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();

Los caracteres no ingleses, aparecen como basura (áéíóú)

También he tratado de convertir a los bytes de la Cadena

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

Pero me Sigue recibiendo la basura, ¿Qué puedo hacer?.
Gracias

ACTUALIZACIÓN: si puedo abrir el archivo de excel en el bloc de notas + + el tipo de codificación del archivo es «UTF-8 sin BOM», si puedo cambiar la codificación a «UTF-8» y, a continuación, abra el archivo en Excel, los caracteres «áéíóú» buen aspecto.

  • Estás tratando de salida CSV o XLS? Si usted está tratando de salida de CVS uso: respuesta.setContentType(«text/csv; charset=CP1252»);
InformationsquelleAutor Xerg | 2010-06-03

4 Comentarios

  1. 1

    Excel es un formato binario, no un formato de texto, por lo que no es necesario establecer ninguna codificación, ya que simplemente no se aplica. Sea cual sea el sistema que están utilizando para construir el archivo de excel (por ejemplo, Apache Poi) se hará cargo de la codificación de texto dentro del archivo de excel.

    Usted no debe intentar convertir el recibido bytes en una cadena, simplemente almacenarlos en una matriz de bytes o escribir a un archivo.

    EDIT: desde el comentario, no suena como si usted está utilizando una «real» binario archivo de excel, pero una pestaña archivo de texto delimitado (CSV). En ese caso, asegúrese de que el uso consistente de codificación, e.g UTF-8 en todo.

    También, antes de llamar a response.getWriter(), llamada setContentType primera.

    Ver HttpServletResponse.getPrintWriter()

    EDICIÓN: Usted puede tratar de escribir la lista de materiales. Normalmente no es necesario, pero el formato de archivo manejo de Office está lejos de ser normal…

    Java en realidad no tiene soporte para la lista de materiales. Tendrás que fingir. Esto significa que usted necesita para utilizar la respuesta outputStream en lugar de escritor, ya que se necesita para escribir raw de bytes (BOM). Para cambiar el código para esto:

    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);
    • Yo no soy de usar cualquier biblioteca… sólo texto con «\t», «\n» y el tipo de contenido application/vnd.ms-excel
    • Ok, pero ¿has probado la apertura de su .xls en excel? No suena como un verdadero archivo de excel para mí, quizás un delimitados por tabuladores archivo CSV? (Excel ver este archivo.)
    • Tengo el problema cuando abro el archivo en excel 2003. Veo basura en personajes como «áéíóú»..
    • He actualizado mi respuesta, ya que usted menciona la lista de materiales. La creación de la lista de materiales en java no es del todo sencillo, así que he publicado el código para hacer eso.
  2. 0

    Sacas de «basura» al imprimir el resultado en la salida estándar?

    Editar (código en las etiquetas de código a partir de los comentarios más abajo):
    response.setContentType("application/vnd.ms-excel; charset=UTF-8")

    • Sólo en excel (2003)
    • El código de java parece bien. Creo que el problema puede ser la manera en que se puede declarar la codificación y la forma en que Excel ’03 está a la espera de ver. Trate de hacer de respuesta.setContentType(«application/vnd.ms-excel; charset=UTF-8») en su lugar.
    • De hecho, el archivo se guarda como «UTF-8 sin bom», pero si se cambia a «UTF-8» con el notepad ++, que se ve bien en excel.
    • parece que Windows hace un uso intensivo de BOM…que podría deshacerse de Excel si recibe un archivo sin ella. Tal vez si se agrega la lista de materiales caracteres a la respuesta que va a trabajar: en.wikipedia.org/wiki/Byte_order_mark#UTF-8
  3. 0

    Trate de usar el ServletResponse.setCharacterEncoding(java.lang.String charset) método.

    response.setCharacterEncoding("UTF-8");
    • No funciona 🙁

Dejar respuesta

Please enter your comment!
Please enter your name here