台灣最大程式設計社群網站
線上人數
545
 
會員總數:245123
討論主題:189032
歡迎您免費加入會員
討論區列表 >> C# >> 匯出EXCEL,內容變成亂碼
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
匯出EXCEL,內容變成亂碼
價值 : 20 QP  點閱數:28510 回應數:11

樓主

芋頭
初學者
247 455
3074 452
發送站內信

請問各位依個匯出EXCEL檔案編碼的問題
1.整個WEB專案編碼是UTF-8
2.匯出時的程式為
string strBody="<table><tr><td>匯出測試</td>..............</tr></table>";
Response.ContentEncoding=System.Text.Encoding.GetEncoding(950);
Response.AddHeader("Accept-Language", "zh-tw");
Response.AddHeader("content-disposition", "attachment; filename=" + (char) 34 + System.Web.HttpUtility.UrlEncode(strFileName, System.Text.Encoding.UTF8) + (char) 34);
Response.ContentType = "Application/octet-stream";
Response.Write(strBody);
Response.End();
3.目前匯出程式正常,沒問題
我的問題是
1.專案的編碼是utf-8,為何匯出時要指定成GetEncoding(950)勒??-->這樣不是繁體中文的編碼ㄇ??
2.承上個問題,我有把上方程式中的GetEncoding(950)改成GetEncoding("utf-8") ,想說跟專案統一,
可是匯出的中文資料就變成亂碼了,可以請懂編碼的高手敎一下ㄇ?
謝謝指導

本篇文章發表於2011-01-12 11:35
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

小羊窒息
捐贈 VP 給 缺氧的羊:窒息 檢舉此回應
匯出之後,用記事本開啟你的那個檔案...
(分別匯出 950 跟 utf8 2種)
基本上你一定可以看到中文字,(因為記事本有自行判識的功能)


但是,Excel預設是以 ASCII 的編碼方式開啟(在繁體中文系統... ASCII = Big5)
如果要用Excel開啟網頁格式的資料,而且網頁內容又是utf8,
就一定得在輸出的資料中,加上 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

這樣Excel才會知道現在所開啟的檔案是utf8的文字內容...
本篇文章回覆於2011-01-12 13:19
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

芋頭
檢舉此回應
首先謝謝大大的回答

但是我直接把程式改成
Response.ContentEncoding=System.Text.Encoding.GetEncoding("utf-8");
應該也是把他指定成UTF-8的編碼方式,為何匯出成EXCEL還是亂碼哩??
謝謝
本篇文章回覆於2011-01-12 13:44
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

hunterpo
捐贈 VP 給 hunterpo 檢舉此回應
可以加上:


這一篇可以看看:
Asp.net 中 Response.Charset 与 Response.ContentEncoding 区别
本篇文章回覆於2011-01-12 15:30
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

小羊窒息
捐贈 VP 給 缺氧的羊:窒息 檢舉此回應
參考這個...

http://www.blueshop.com.tw/board/FUM20041006161839LRJ/BRD200506231219373H0/1.html

本篇文章回覆於2011-01-12 17:46
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

阿恢
捐贈 VP 給 阿恢 檢舉此回應
用這個方式就不會變亂碼了,我之前也是用你的方式去匯,不過突然有一天,之後寫的程式,匯出來都是亂碼,只要資料裡有中文字的話。

而且我還拿以前ok的程式,用copy-paste的方式,還是亂碼...@@

本篇文章回覆於2011-01-13 10:21
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

小羊窒息
捐贈 VP 給 缺氧的羊:窒息 檢舉此回應
to 阿恢,

如果你對 Excel 另存為html格式 感興趣的話,


先撇開dotNet匯出資料的問題

(因為不管是dotNet, ASP, Jsp, Php...
都可以輸出 非標準的Excel格式...
也就是所謂的Html相容格式)


因此,想要讓自己的程式產生Excel可以讀取的〔Html文字檔〕,
就得先從Excel建立資料,再另存新檔,儲存為html或mht

實際在進行時,只要裡面有中文或日文或簡體字,或韓文等等...
它們最後呈現的文字,都是HTML的符號,例如:峄 會變成 &#23748;
然後它預設的格式是 big5

如果使用記事本把這個文字檔另存為utf8(含bom字元),
再用Excel開啟..........Excel會正常(因為它一開始就讀到bom,確定是utf8了)



如果用EditPlus或是Studio.net等工具,
把這個文字檔另存為utf8(不含bom)
那時就是在考驗Excel了...

當文字檔本身是utf8的格式, 但是卻不含bom字元的情況下,
如果在任何一個中文字之前, 有<meta http-equiv=Content-Type content="text/html; charset=utf-8">
就可以告訴Excel, 這是utf8的文件...


如果沒有...<meta http-equiv=Content-Type content="text/html; charset=utf-8">
而文件又不含bom字元,
然後文件內容又偏偏是utf8的文字格式......
那麼, 只會顯示亂碼(除非你遇到字數非常少的檔案, 那時Excel就有可能會從頭檢測到尾, 然後以正確的格式來顯示...)



實際從Excel另存為html之後輸出的格式 來進行修改及測試,
然後記錄不同狀況下所產生的結果,
再來比對你的程式寫法,
你就會知道為什麼有些人可以用的程式, 在別人的環境會不能用了
(Excel的版本也有差哦...不同版本的最大相容程度也有差)

以現今來說, 最好的Excel輸出, 就是用NPOI輸出標準的Excel,
而不是繼續用我們以前的 html 輸出方式...
本篇文章回覆於2011-01-13 12:56
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

阿恢
捐贈 VP 給 阿恢 檢舉此回應
這點我曉得,不過常常遇到使用者會要求,匯出excel後,一開啟就會出現他們想要的格式,所以目前看起來也只能用老方法...
之前的寫法是直接把DataTable轉成excel格式,不過後來就不行了,會變亂碼,而且都是在同一個專案裡。
這是之前的方式,不知可否幫我看一下,為什麼一開始用的時候,都正常。
後來再使用時,就不行了。


更早之前的方式是用OWC...

後來因為使用者都想要excel匯出來就美美的,只好用html的方式囉...
本篇文章回覆於2011-01-14 09:49
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

小羊窒息
捐贈 VP 給 缺氧的羊:窒息 檢舉此回應
程式碼看不出什麼問題


應該說有些因素在程式碼裡面看不到...例如使用者的Excel的版本,
還有你輸出之後的檔案是否有包含 【BOM】,
原始資料來源的編碼為何,
以及page本身的編碼設定為何,
web.config的編碼設定為何...


我遇到問題時都是直接用記事本開啟有問題的檔案,
如果記事本開啟後, 看得到中文, 那就是bom, utf8標籤的問題, 造成Excel誤判
如果記事本開啟後, 就已經是亂碼了..., 那就是資料來源有問題了...
本篇文章回覆於2011-01-14 12:12
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
回應

阿恢
捐贈 VP 給 阿恢 檢舉此回應
感謝你,大概知道要怎麼去找錯誤了。
本篇文章回覆於2011-01-14 14:42
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
回應

Fun
捐贈 VP 給 Fun 檢舉此回應
遇到類似的問題
在chrome上沒有問題
但在IE上,
如果資料只有一筆,就會內容亂碼.
如果資料是多筆,就會正常顯示.
後來是參考以下文章解決的,提供給日後的人參考.
https://blog.darkthread.net/blog/csv-encoding-again/
本篇文章回覆於2019-09-26 14:06
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
回應

Josh
檢舉此回應
HttpContext.Current.Response.BinaryWrite(new byte[] { 0xEF, 0xBB, 0xBF }); 拿去試試
本篇文章回覆於2019-10-17 16:45
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.