这不是纯粹的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中打开文件,则字符“áéíóú”看起来不错。
答案 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');