首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET 使用 GridView 與 DataGrid 匯出 Excel 兩種實作方式

     編輯:ASP.NET 基礎

前言

「匯出 Excel」是企業級應用的高頻需求。ASP.NET 早期常利用 GridView 或 DataGrid 的 RenderControl 將 HTML 表格直接輸出為 .xls 檔案,雖非標準 Office Open XML 格式,但相容性極佳、實作簡單,至今仍被廣泛採用。本文提供兩個可直接複製使用的靜態方法:DataTable1Excel(GridView 版)與 DataTable2Excel(DataGrid 版)。

方法一:GridView 版 DataTable1Excel

public 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();
}

方法二:DataGrid 版 DataTable2Excel

public 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 相容)
適用場景現代專案、需支援中文欄位名舊版專案、相容性優先

常見坑點與解法

  1. 分頁資料遺失:必須 new 一個無分頁的控制項實例重新繫結,而非直接使用頁面上已分頁的控制項。
  2. VerifyRenderingInServerForm 錯誤:若在 .aspx 中直接呼叫,需覆寫 VerifyRenderingInServerForm 回傳 void;本範例因在獨立類別中建立控制項實例,故不受此限。
  3. 大數據量記憶體壓力:StringWriter 會將整份 HTML 存在記憶體。超過 5 萬列建議改用 EPPlus、ClosedXML 或 NPOI 產生真正的 .xlsx 串流輸出。
  4. Excel 開啟警告:瀏覽器下載的是 HTML 偽裝的 .xls,Excel 會提示「檔案格式與副檔名不符」,屬正常現象,使用者點「是」即可開啟。

現代化替代方案

新專案建議直接採用 EPPlus(商業授權)或 ClosedXML(MIT)等程式庫,產生標準 .xlsx,支援樣式、公式、資料驗證、大數據串流寫入,且無需 System.Web.UI 依賴,可在 .NET Core / 5+ / 6+ / 8+ 跨平台運行。

總結

GridView/DataGrid 渲染匯出法雖屬「經典技巧」,但在維護舊系統、快速原型、內部工具等場景依然實用。掌握其原理與限制,並視專案需求平滑遷移至現代程式庫,是務實開發者的必修課。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved