2010-06-03 46 views
0

这不是一个纯Java的问题,也可以到HTML问题编码基于Java> XLS

我写了一个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(); 

非英语字符显示为垃圾(AEIOU)

而且我试图从字符串

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

但我还是让垃圾转换成字节,我能做些什么? 谢谢

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

+0

你试图输出CSV还是XLS? 如果您尝试输出CVS,请使用: response.setContentType(“text/csv; charset = CP1252”); – Eduardo 2010-06-06 10:41:04

回答

0

当你将结果打印到标准输出时,你会得到“垃圾”吗? response.setContentType("application/vnd.ms-excel; charset=UTF-8")

+0

只在excel(2003) – Xerg 2010-06-03 19:35:48

+0

你的java代码看起来不错。我认为这个问题可能就是你声明编码的方式,以及Excel '03希望看到它的方式。请尝试执行response.setContentType(“application/vnd.ms-excel; charset = UTF-8”)。 – invaderkay 2010-06-03 20:24:12

+0

事实上,文件被保存为“没有bom的UTF-8”,但如果用notepad ++更改为“UTF-8”,它在excel中看起来不错。 – Xerg 2010-06-03 20:32:19

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

我没有使用任何库...只是带有“\ t”的文本, “\ n”和内容类型应用程序/ vnd.ms-excel – Xerg 2010-06-03 19:37:21

+0

好吧,但是你有没有试过在Excel中打开你的.xls?它听起来不像一个真正的Excel文件,也许是制表符分隔的CSV文件? (Excel将查看此文件。) – mdma 2010-06-03 20:14:22

+0

我只在打开Excel 2003中的文件时遇到了问题。我看到“áéíóú”字符的垃圾.. – Xerg 2010-06-03 20:19:52

0

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

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

它不工作:( – Xerg 2010-06-03 20:26:05

0

我有同样的问题..我使用print()代替write()来修复它

outputStream.print('\ufeff');