iT邦幫忙

0

web 匯出EXCEL亂碼,因為沒有BOM

bom
  • 分享至 

  • xImage
  •  

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/

加上stream後的程式碼如下(DataGrid)

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 亂碼

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言