在 ASP.NET WebForms 中,透過 GridView.RenderControl 將資料直接輸出為 Excel 檔案(.xls)是常見做法。然而,若編碼設定不當,匯出的檔案在開啟時會出現亂碼,特別是中文字元。
根本原因在於 HTTP 回應的字元編碼與 Excel 檔案實際編碼不一致。瀏覽器根據 Response.Charset、Response.ContentEncoding 等標頭決定如何解碼位元組流;若這些設定與實際寫入的字串編碼(預設 UTF-8)不符,Excel 開啟時便會誤判編碼,導致亂碼。
protected void Excel_Click(object sender, EventArgs e)
{
Response.Charset = "UTF-8";
Response.ClearContent();
Response.Clear();
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.HeaderEncoding = System.Text.Encoding.UTF8;
Response.AddHeader("content-disposition", "attachment; filename=MyExpress.xls");
Response.ContentType = "application/vnd.ms-excel"; // 更標準的 MIME
using (System.IO.StringWriter sw = new System.IO.StringWriter())
{
HtmlTextWriter htw = new HtmlTextWriter(sw);
GridView1.AllowPaging = false;
DataBind(); // 重新繫結資料
GridView1.RenderControl(htw);
Response.Write(sw.ToString());
}
Response.End();
}
關鍵點:同時設定 Response.Charset、ContentEncoding、HeaderEncoding 為 UTF-8,確保標頭與內容編碼一致。
若目標環境為舊版中文 Excel(如 Excel 2003),可嘗試 GB2312:
Response.ClearContent();
Response.Clear();
Response.AddHeader("content-disposition", "attachment; filename=sumlate.xls");
Response.Charset = "GB2312";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
Response.ContentType = "application/vnd.ms-excel";
using (System.IO.StringWriter sw = new System.IO.StringWriter())
{
HtmlTextWriter htw = new HtmlTextWriter(sw);
if (GridView2.Rows.Count > 0)
GridView2.RenderControl(htw);
else
GridView1.RenderControl(htw);
Response.Write(sw.ToString());
}
Response.End();
注意:此法僅適用於舊版 Excel 相容性需求,現代環境建議優先使用 UTF-8。
上述做法本質上是輸出 HTML 表格並以 .xls 副檔名欺騙 Excel,實際上並非真正的二進位 Excel 格式,且無法支援樣式、公式等進階功能。建議改用 EPPlus 或 ClosedXML 程式庫,直接產生標準 .xlsx(OOXML)檔案,徹底避免編碼問題,並獲得完整的 Excel 功能支援。