IRONSOFTWAREHOME
USING IRONXL

將ASP.NET GridView資料匯出到Excel文件

Curtis Chau
Curtis Chau
Updated: 2026年6月28日

您可以透過在C#中安裝IronXL來將ASP.NET GridView匯出為Excel XLSX檔案,建立一個WorkBook,遍歷GridView行,將每個儲存格的值寫入對應的工作表位置,並將工作簿儲存到磁碟或HTTP回應流中。 此方法不需要在伺服器上安裝Microsoft Office,並且可以在.NET Framework、.NET Core及.NET 5到.NET 10的Web應用程式中可靠運行。

將GridView資料匯出到Excel是企業ASP.NET Web Forms專案中的標準要求。 使用者需要將表格式資料從瀏覽器中提取出來,並輸入至電子表格中以進行報告、離線分析和存檔。 挑戰在於在無需引入會在網頁伺服器環境中失效的Office Interop依賴項的情況下,搭建伺服器端.xlsx文件之間的橋樑。

本指南將指導您完成三個逐步豐富的匯出模式:最簡單的逐行匯出、包含自動調整欄位的表頭和資料匯出,以及完全繞過已渲染的HTML的DataTable驅動匯出。 每個範例都使用相容C#頂層語句的程式碼和IronXL API。

如何在ASP.NET專案中安裝IronXL?

在Visual Studio中打開套件管理器控制台並運行:

PM > Install-Package IronXL.Excel

或者,右鍵單擊方案總管中的專案,選擇管理NuGet套件,搜尋IronXL,並單擊安裝。 NuGet會自動解析所有傳遞依賴項。

套件安裝完成後,將以下using指令新增到您的後置程式碼檔中:

using System;
using System.Data;
using System.Web.UI;
using IronXL;

IronXL支持.NET Framework 4.6.2及更高版本,以及.NET Core 3.1和.NET 5到.NET 10。伺服器上無需Office安裝或COM註冊。 完整的API文件可在IronXL物件參考中找到。

應使用哪個NuGet Package ID?

正確的包ID是IronXL.Excel,後者是一個遺留別名)。 安裝後,將自動引用程式集IronXL.dll。 您可以通過檢查方案總管中的Packages節點或從專案目錄運行dotnet list package來驗證已安裝的版本。

IronXL能在ASP.NET Core Web應用程式中運行嗎?

是的。 同一API適用於ASP.NET Web Forms和ASP.NET Core(MVC或Razor Pages)專案。 在Core專案中,構建伺服器端檔案路徑時,將Path.Combine(Directory.GetCurrentDirectory(), "Exports")

如何將GridView匯出到Excel文件?

最簡單的匯出模式是遍歷GridView中的每一行,將每個儲存格的文字複製到對應的Excel工作表儲存格中。 在ASPX標記中,新增一個<asp:Button ID="btnExport" runat="server" Text="Export to Excel" OnClick="btnExport_Click" />按鈕。 runat="server"屬性使兩個控制元件在後置程式碼中可存取。

後置程式碼在首次載入時綁定範例資料,在按鍵點擊時匯出:

using System;
using System.Data;
using System.Web.UI;
using IronXL;

public partial class GridViewExport : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            BindGridView();
        }
    }

    private void BindGridView()
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("EmployeeID", typeof(int));
        dt.Columns.Add("Name", typeof(string));
        dt.Columns.Add("Department", typeof(string));
        dt.Columns.Add("Salary", typeof(decimal));

        dt.Rows.Add(1, "John Smith", "Engineering", 75000);
        dt.Rows.Add(2, "Sarah Johnson", "Marketing", 65000);
        dt.Rows.Add(3, "Michael Chen", "Finance", 70000);

        ViewState["EmployeeData"] = dt;
        gvEmployees.DataSource = dt;
        gvEmployees.DataBind();
    }

    protected void btnExport_Click(object sender, EventArgs e)
    {
        WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        WorkSheet worksheet = workbook.CreateWorkSheet("Employees");

        // Write header row
        for (int j = 0; j < gvEmployees.HeaderRow.Cells.Count; j++)
        {
            worksheet.SetCellValue(0, j, gvEmployees.HeaderRow.Cells[j].Text);
        }

        // Write data rows
        for (int i = 0; i < gvEmployees.Rows.Count; i++)
        {
            for (int j = 0; j < gvEmployees.Rows[i].Cells.Count; j++)
            {
                worksheet.SetCellValue(i + 1, j, gvEmployees.Rows[i].Cells[j].Text);
            }
        }

        string filePath = Server.MapPath("~/Exports/EmployeeData.xlsx");
        workbook.SaveAs(filePath);
    }
}

WorkBook.Create(ExcelFileFormat.XLSX)調用初始化一個針對現代Open XML格式的記憶體簿。 CreateWorkSheet("Employees")新增第一個頁籤。 外層迴圈(i)推進資料行; 內層迴圈(j)推進列。 行索引i + 1用於資料儲存格,以防止覆蓋在第0行的標題。

為何使用IronXL而非Excel Interop?

Excel Interop需要在伺服器上安裝有執照的Microsoft Excel,並建立必須顯式釋放的COM物件以避免記憶體洩漏。 IronXL直接讀寫.xlsx文件作為Open XML包——無需COM、無需Office、無需Marshal.ReleaseComObject板。 這使其在IIS、Azure App Service、Docker和其他無法使用Office的伺服器環境中可靠運行。

XLSX下載的正確MIME型別是什麼?

當您希望瀏覽器提示以下載而非內嵌提供位元組時,將回應內容型別設置為Content-Disposition: attachment標頭。

如何新增欄位標題和自動調整欄位?

基本範例會寫入從HeaderRow.Cells提取的標題,但生產環境匯出還應自動調整每列的欄位,以使資料在Excel中可無需手動調整即可閱讀:

protected void btnExport_Click(object sender, EventArgs e)
{
    WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
    WorkSheet worksheet = workbook.CreateWorkSheet("Employees");

    // Write column headers
    int colCount = gvEmployees.HeaderRow.Cells.Count;
    for (int i = 0; i < colCount; i++)
    {
        string header = gvEmployees.HeaderRow.Cells[i].Text;
        worksheet.SetCellValue(0, i, header);
    }

    // Write data rows
    for (int i = 0; i < gvEmployees.Rows.Count; i++)
    {
        for (int j = 0; j < gvEmployees.Rows[i].Cells.Count; j++)
        {
            worksheet.SetCellValue(i + 1, j, gvEmployees.Rows[i].Cells[j].Text);
        }
    }

    // Auto-size each column for readability
    for (int col = 0; col < colCount; col++)
    {
        worksheet.AutoSizeColumn(col);
    }

    string filePath = Server.MapPath("~/Exports/EmployeeReport.xlsx");
    workbook.SaveAs(filePath);
}

AutoSizeColumn(col)指示IronXL根據內容長度計算最佳欄位寬度,模仿Excel桌面應用中的格式 > 自動調整欄位寬度操作。 在寫入所有資料後在迴圈中調用此方法比在每行後調用更為有效,因為此時最終內容已確定。

有關其他樣式選項 - 粗體表頭、背景顏色、數字格式 - 請參閱IronXL單元格樣式教程。 您還可以合併單元格來建立跨多列的報告標題。

如何將粗體格式應用於表頭單元格?

使用IStyle物件(或範圍)。 在寫入值之前或之後設置Font.Bold = true - 樣式與單元格內容是分開的:

// Bold the entire header row (columns A through D)
var headerRange = worksheet["A1:D1"];
headerRange.Style.Font.Bold = true;
headerRange.Style.BackgroundColor = "#4472C4";
headerRange.Style.Font.FontColor = "#FFFFFF";

此模式可統一適用於任何尺寸的範圍。 有關樣式屬性的完整列表,請參閱IronXL樣式API參考

如何直接從DataTable匯出資料?

遍歷渲染的GridView行將匯出剛好與控制的當前視覺狀態聯繫起來,它可以受到分頁、排序和列可見性設置的影響。 從儲存在DataTable進行匯出會產生確定性結果,無論網格如何配置:

protected void btnExport_Click(object sender, EventArgs e)
{
    DataTable sourceData = ViewState["EmployeeData"] as DataTable;
    if (sourceData == null)
    {
        Response.Write("No data available to export.");
        return;
    }

    WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
    WorkSheet worksheet = workbook.CreateWorkSheet("Report");

    // Column headers from DataTable schema
    for (int i = 0; i < sourceData.Columns.Count; i++)
    {
        worksheet.SetCellValue(0, i, sourceData.Columns[i].ColumnName);
    }

    // Data rows from DataRow objects
    for (int i = 0; i < sourceData.Rows.Count; i++)
    {
        for (int j = 0; j < sourceData.Columns.Count; j++)
        {
            worksheet.SetCellValue(i + 1, j, sourceData.Rows[i][j].ToString());
        }
    }

    string filePath = Server.MapPath("~/Exports/DataExport.xlsx");
    workbook.SaveAs(filePath);
}

列名來自GridView模板中應用的任何顯示名稱覆蓋。 從SetCellValue

GridView使用分頁時,這個模式特別有價值 - 遍歷DataTable中讀取會匯出每個記錄。

當DataTable匯出量大時會發生什麼?

IronXL為大型Excel資料集高效地流式傳輸工作簿資料。 對於超過100,000行的匯出,考慮將SetCellValue調用分批進行,而不是在巢狀迴圈中設置單個單元格。在伺服器RAM中保留整個檔案。

如何在匯出過程中處理錯誤?

生產出口處理器應將IronXL操作包裝在catch塊中,當出現問題時向使用者返回描述性消息。 常見的失敗模式包括丟失ViewState為null:

protected void btnExport_Click(object sender, EventArgs e)
{
    try
    {
        DataTable sourceData = ViewState["EmployeeData"] as DataTable;
        if (sourceData == null)
            throw new InvalidOperationException("Session data has expired. Please reload the page.");

        WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        WorkSheet worksheet = workbook.CreateWorkSheet("Employees");

        for (int i = 0; i < sourceData.Columns.Count; i++)
            worksheet.SetCellValue(0, i, sourceData.Columns[i].ColumnName);

        for (int i = 0; i < sourceData.Rows.Count; i++)
            for (int j = 0; j < sourceData.Columns.Count; j++)
                worksheet.SetCellValue(i + 1, j, sourceData.Rows[i][j].ToString());

        string filePath = Server.MapPath("~/Exports/SafeExport.xlsx");
        workbook.SaveAs(filePath);

        lblStatus.Text = "Export successful. File saved to server.";
    }
    catch (Exception ex)
    {
        lblStatus.Text = $"Export failed: {ex.Message}";
    }
}

對於直接作為瀏覽器下載而非儲存到磁碟的Web應用程式,使用Response.OutputStream。 確保~/Exports/目錄存在並且IIS應用程式池身份具有寫入許可。

如何將XLSX文件作為瀏覽器下載發送?

workbook.SaveAs(filePath)替換為基於流的響應:

using System.IO;

// ... inside btnExport_Click after populating the worksheet ...

byte[] fileBytes;
using (MemoryStream ms = new MemoryStream())
{
    workbook.SaveAs(ms);
    fileBytes = ms.ToArray();
}

Response.Clear();
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("Content-Disposition", "attachment; filename=EmployeeData.xlsx");
Response.BinaryWrite(fileBytes);
Response.End();

該模式避免將臨時文件寫入磁碟。 byte[],並直接發送給客戶。 Response.End()調用刷新響應,防止額外的頁面標記附加在二進位資料之後。

如何匯出多個工作表或高級工作簿?

單一WorkBook可以包含多個工作表,當您需要將多個GridViews匯出到一個檔案 - 或對同一資料集以不同的細粒度 - 時非常有用。對每個標籤調用workbook.CreateWorkSheet(name)一次:

WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);

WorkSheet summary = workbook.CreateWorkSheet("Summary");
WorkSheet detail  = workbook.CreateWorkSheet("Detail");

// Populate summary sheet ...
// Populate detail sheet ...

workbook.SaveAs(Server.MapPath("~/Exports/FullReport.xlsx"));

IronXL還支持閱讀現有的Excel檔案,因此您可以載入帶有品牌和格式的預建模板,將資料注入到特定的單元格中,並儲存結果 - 保留模板中已存在的圖表、影像和樣式。

為了更豐富的輸出,IronXL提供Excel公式支持、條件格式化、圖表建立影像嵌入。 這些能力在IronXL教程部分中有記錄。

IronXL與EPPlus和ClosedXML的比較如何?

功能IronXLEPPlusClosedXML
需要安裝Office不需要不需要不需要
支持XLSX讀寫是的是的是的
支持XLS(遺留)是的不需要不需要
支持CSV/TSV匯出是的不需要部分支持
圖表建立API是的是的有限的支持
授權模式永久 + SaaSPolyform非商業MIT
支持.NET 10是的是的是的

EPPlus在版本5中轉換為商業授權,這使得IronXL成為已經投資於商業.NET程式庫生態系統的團隊的自然替代品。 ClosedXML仍然有MIT授權,但圖表支持有限。 正確的選擇取決於您的專案的授權限制、所需的Excel功能,以及是否需要支持舊的.xls格式。

IronXL支持哪些Excel格式?

IronXL讀寫.xlsx(Office Open XML)、.xls(legacy BIFF8)、.tsv格式。 您可以在Excel檔案格式之間轉換,只需透過更改傳遞給ExcelFileFormat列舉值或載入現有檔案並儲存在不同的格式中。

您接下來的步驟是什麼?

您現在有三種可以在生產環境中準備使用的模式,來透過IronXL將ASP.NET GridView資料匯出為Excel XLSX檔案:

  • 行迭代匯出 — 從綁定的GridView快速取得可用匯出功能
  • 表頭和格式化匯出 — 為具展示性的報告新增欄位自動調整和粗體標題
  • DataTable驅動匯出 — 完全繞過渲染控制以處理分頁或過濾的網格

接下來的邏輯步驟是:

  1. 使用Response.BinaryWrite新增一個瀏覽器下載回應,讓使用者立即接收檔案而無需伺服器端保存路徑。
  2. 應用單元格樣式 — 粗體標題、背景色塊填充和數字格式 - 使用IronXL格式API
  3. 探索多頁籤工作簿以便在單個檔案中結合概要和詳細資料,供有權關係者使用。
  4. 使用IronXL的讀取API將Excel文件讀取回DataTable物件中,以實現往返匯入/匯出工作流程。
  5. ironsoftware.com/csharp/excel/開始免費試用,以使用完整功能的試用授權來測試您專案中的所有功能。

對於正在建立文件生成管道的團隊,IronPDF可與IronXL整合,將工作表直接匯出到PDF。 Iron Suite將IronXL與IronPDF、IronOCR、IronBarcode和IronZIP以降低合併價格捆綁在一起。

Curtis Chau
技術作家

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

...
閱讀更多

相關文章

Key in blue circle

立即免費取得 30 天試用金鑰

Your trial license will be sent to your email address

無任何限制。100% 解鎖。無需信用卡。

bullet_checked無需信用卡或建立帳號無任何限制。100% 解鎖。無需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
預約您的免費即時演示
Booking Badge

全球數百萬工程師的信賴

Iron Software的客戶標誌
獲得無義務諮詢
填寫以下表格或電郵sales@ironsoftware.com
您的資料將始終保密。
全球數百萬工程師的信賴
Iron Software的客戶標誌
立即獲取您的30天試用金鑰
無需信用卡或帳戶建立