2011年9月20日 星期二

處理 ASP.NET 匯出 Excel 時,檔名或內容出現亂碼



匯出 Excel 最讓人頭疼的事,就是出現亂碼,尤其是中文字的處理,還分簡體與繁體。如果碰上 big-5 沒定義的字,例如「炁」,又要開始掉頭髮了。為了讓大家擁有豐厚的髮量,路上不被人叫阿伯,整理了目前測試後有效的解決方式,早晚服用,三日見效,7天後讓你在夜市從街頭逛到巷尾都被攤販老闆喊「帥哥」!


    StringBuilder sb = new StringBuilder();
    protected void Page_Load(object sender, EventArgs e)
    {
        BindData();

        //匯出至 excel format.
        Response.Clear();
        
        string strFileName = "导出后";
        
        if(Request.Browser.Browser=="IE")
            strFileName = Server.UrlEncode(strFileName);

        Response.AddHeader("Content-Disposition", "attachment;filename="+strFileName+".xls");
        Response.ContentType = "application/vnd.ms-excel";

        Response.Write(sb.ToString());

        Response.Flush();
        Response.End();

    }

    private void BindData()
    {
        sb.Append("<html>");
        sb.Append("<head>");
        sb.Append("<style type='text/css'>");
        //將所有td的欄位格式改為"文字"
        sb.Append("td{mso-number-format:\"\\@\";}"); 
        sb.Append("</style>");
        sb.Append("</head>");
        sb.Append("<body>");
        //避免內容出現亂碼
        sb.Append("<meta http-equiv=Content-Type content=text/html; charset=utf-8>"); 
        //此處可撰寫迴圈讀取資料--開始
        sb.Append("<table>");
        sb.Append("<tr><td>炁</td></tr>");
        sb.Append("</table>");
        //此處可撰寫迴圈讀取資料--結束
        sb.Append("</body>");
        sb.Append("</html>");

    }
下載 Excel 檔名的部分,參考了保哥的建議,只針對 IE 瀏覽器進行 Server.UrlEncode()。而內容的部分,則是增加一行:

<meta http-equiv=Content-Type content=text/html; charset=utf-8>

將所有內容都以 utf-8 編碼,不再出現有些中文字無法顯示的情況。

此外,提供了 style 設定,讓匯出的 Excel 都能夠以「文字」的格式呈現,這對於有數字的欄位很有幫助。


參考:
01:ASP.NET 如何設定強制下載檔案並正確處理中文檔名的問題
02:檔案下載或開啟時出現亂碼檔名(不支援簡體)

沒有留言:

張貼留言