web匯出的EXCEL亂碼
問題描述
匯出的EXCEL檔案,如果很多筆,OK.
但若匯出的資料只有一筆,就會有中文亂碼的情況
而EXCEL亂碼的檔案,如果用記事本打開中文能正常顯示.用記事本開,查看它的編碼為utf8.
-- | ----
用記事本開| 正常顯示
用EXCEL開| 亂碼
查看記事本編碼| utf-8
原因
因為沒有BOM,但為什麼一筆沒有BOM,多筆就有BOM,不得而知.
解決方法
所以我們就要讓它有BOM.
怎麼讓它有BOM,我們可以用stream,stream指定UTF8的話,就會自動加上BOM了.
ref
https://blog.darkthread.net/blog/csv-encoding-again/
Response.ClearContent();
Response.Clear();
Response.Buffer=true;
Response.Charset ="UTF-8"; //設定字集
Response.ContentEncoding = System.Text.Encoding.UTF8;//表格內容新增編碼格式string sFilename = HttpUtility.UrlEncode("中文", System.Text.Encoding.UTF8);//處理中文檔名亂碼 Response.AppendHeader("Content-Disposition","attachment;filename="+sFilename+".xls"); Response.ContentType = "application/ms-excel "; //內容型態設為Excel this.EnableViewState = false; //把ViewState給關了 System.IO.StringWriter objStringWriter = new System.IO.StringWriter(); System.Web.UI.HtmlTextWriter objHtmlTextWriter = new System.Web.UI.HtmlTextWriter(objStringWriter); this.DataGrid1.RenderControl(objHtmlTextWriter); //get畫面上的資料 System.IO.StreamWriter sw = new System.IO.StreamWriter( Response.OutputStream,System.Text.Encoding.UTF8);//這樣一筆的時侯,就不會亂碼了 sw.Write(objStringWriter.ToString()); sw.Close(); Response.End();
目前已知2種function可以加上BOM,File.WriteAllText 和 StreamWriter.
使用方式大概有2種,一種指定字碼,一種不指定.
指定字碼,也可設定不產生BOM.
狀態 | File.WriteAllText | StreamWriter | memo |
---|---|---|---|
沒指定 | 沒BOM | 沒BOM | File.WriteAllText("B:\F1.csv", '中文'); |
指定但不想有BOM | -- | -- | new StreamWriter (strPath,false,utf8); |
指定 | 有BOM | 有BOM | File.WriteAllText("B:\F1.csv", '中文', Encoding.UTF8); |
*StreamReader 預設會先自動判斷檔案編碼,無法確認才會使用設定的編碼。
所以如果不需要BOM的話,不指定也沒關係.
ref
https://blog.darkthread.net/blog/write-utf8-file-with-bom/
而Stream加上BOM,writer和reader之間,是怎麼運行的呢?
class | about BOM | about Encoding |
---|---|---|
StreamWriter | 寫的時侯, 會把BOM加進來 | 預設會先自動判斷檔案編碼,無法確認才會使用設定的編碼 |
StreamReader | 讀的時侯, 會把BOM自動濾掉 | |
stream指定的編碼錯誤,卻可以正常寫入,怎麼回事,快點我,知道更多 |
----以下是坑.讀者請自行略過
用它開 | BOM | 沒BOM |
---|---|---|
記事本 | OK | OK |
EXCEL | OK | 亂碼 |