2010-06-03 57 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');