问题编码java-> xls

时间:2010-06-03 17:15:42

标签: java excel encoding export

这不是纯粹的java问题,也可能与HTML

有关

我编写了一个java servlet来查询数据库表并显示 结果作为一个HTML表。用户也可以要求接收结果 Excel表格。 我通过打印相同的html表创建Excel工作表,但使用 “application / vnd.ms-excel”的内容类型。 Excel文件是 创造了很好。 问题是表格可能包含我想要的非英语数据 使用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();

非英语字符显示为垃圾(áéíóú)

我也尝试从String

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

但我还在垃圾,我该怎么办? 感谢

更新:如果我在记事本中打开excel文件+ +文件编码类型为“UTF-8无BOM”,如果我将编码更改为“UTF-8”然后在Excel中打开文件,则字符“áéíóú”看起来不错。

4 个答案:

答案 0 :(得分:1)

Excel是二进制格式,而不是文本格式,因此您不需要设置任何编码,因为它根本不适用。无论您使用什么系统来构建excel文件(例如Apache Poi),都会处理excel文件中的文本编码。

您不应该尝试将收到的字节转换为字符串,只需将它们存储在字节数组中或将它们写入文件。

编辑:从评论中,它听起来好像您使用的是“真正的”二进制excel文件,而是一个制表符分隔的文本文件(CSV)。在这种情况下,请确保使用一致的编码,例如UTF-8。

此外,在致电response.getWriter()之前,请先致电setContentType

请参阅HttpServletResponse.getPrintWriter()

编辑:您可以尝试编写BOM。通常不需要,但Office中的文件格式处理远非正常......

Java并不真正支持BOM。你必须假装它。这意味着您需要使用响应outputStream而不是writer,因为您需要编写原始字节(BOM)。所以你将代码更改为:

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);

答案 1 :(得分:0)

将结果打印到标准输出时,您会得到“垃圾”吗?

编辑(来自以下评论的代码标签中的代码): response.setContentType("application/vnd.ms-excel; charset=UTF-8")

答案 2 :(得分:0)

尝试使用ServletResponse.setCharacterEncoding(java.lang.String charset)方法。

response.setCharacterEncoding("UTF-8");

答案 3 :(得分:0)

我有同样的问题..我使用print()而不是write()

修复它
outputStream.print('\ufeff');