「匯出 Excel」是企業級應用的高頻需求。ASP.NET 早期常利用 GridView 或 DataGrid 的 RenderControl 將 HTML 表格直接輸出為 .xls 檔案,雖非標準 Office Open XML 格式,但相容性極佳、實作簡單,至今仍被廣泛採用。本文提供兩個可直接複製使用的靜態方法:DataTable1Excel(GridView 版)與 DataTable2Excel(DataGrid 版)。
DataTable1Excelpublic static void DataTable1Excel(System.Data.DataTable dtData)
{
if (dtData == null) return;
var gvExport = new System.Web.UI.WebControls.GridView();
var curContext = System.Web.HttpContext.Current;
var strWriter = new System.IO.StringWriter();
var htmlWriter = new System.Web.UI.HtmlTextWriter(strWriter);
// 設定回應標頭:強制下載、編碼
curContext.Response.ContentType = "application/vnd.ms-excel";
curContext.Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
curContext.Response.Charset = "utf-8";
// 解決分頁問題:建立新 GridView、關閉分頁、繫結完整資料
gvExport.DataSource = dtData.DefaultView;
gvExport.AllowPaging = false;
gvExport.DataBind();
// 渲染至 StringWriter 再寫入回應
gvExport.RenderControl(htmlWriter);
curContext.Response.Write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\" />" + strWriter.ToString());
curContext.Response.End();
}
DataTable2Excelpublic static void DataTable2Excel(System.Data.DataTable dtData)
{
if (dtData == null) return;
var dgExport = new System.Web.UI.WebControls.DataGrid();
var curContext = System.Web.HttpContext.Current;
var strWriter = new System.IO.StringWriter();
var htmlWriter = new System.Web.UI.HtmlTextWriter(strWriter);
curContext.Response.ContentType = "application/vnd.ms-excel";
curContext.Response.ContentEncoding = System.Text.Encoding.UTF8;
curContext.Response.Charset = "";
dgExport.DataSource = dtData.DefaultView;
dgExport.AllowPaging = false;
dgExport.DataBind();
dgExport.RenderControl(htmlWriter);
curContext.Response.Write(strWriter.ToString());
curContext.Response.End();
}
| 項目 | GridView 版 | DataGrid 版 |
|---|---|---|
| 編碼 | gb2312 + meta 標籤雙重保險 | UTF-8 |
| 控制項 | GridView (ASP.NET 2.0+) | DataGrid (1.x 相容) |
| 適用場景 | 現代專案、需支援中文欄位名 | 舊版專案、相容性優先 |
new 一個無分頁的控制項實例重新繫結,而非直接使用頁面上已分頁的控制項。VerifyRenderingInServerForm 回傳 void;本範例因在獨立類別中建立控制項實例,故不受此限。StringWriter 會將整份 HTML 存在記憶體。超過 5 萬列建議改用 EPPlus、ClosedXML 或 NPOI 產生真正的 .xlsx 串流輸出。新專案建議直接採用 EPPlus(商業授權)或 ClosedXML(MIT)等程式庫,產生標準 .xlsx,支援樣式、公式、資料驗證、大數據串流寫入,且無需 System.Web.UI 依賴,可在 .NET Core / 5+ / 6+ / 8+ 跨平台運行。
GridView/DataGrid 渲染匯出法雖屬「經典技巧」,但在維護舊系統、快速原型、內部工具等場景依然實用。掌握其原理與限制,並視專案需求平滑遷移至現代程式庫,是務實開發者的必修課。