跳至頁尾內容
USING IRONXL

如何使用 IronXL 在 C# 中將 GridView 匯出到 Excel XLSX

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

您可以透過在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中打開套件管理器控制台並運行:

Install-Package IronXL.Excel

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

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

using System;
using System.Data;
using System.Web.UI;
using IronXL;
using System;
using System.Data;
using System.Web.UI;
using IronXL;
Imports System
Imports System.Data
Imports System.Web.UI
Imports IronXL
$vbLabelText   $csharpLabel

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);
    }
}
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);
    }
}
Imports System
Imports System.Data
Imports System.Web.UI
Imports IronXL

Public Partial Class GridViewExport
    Inherits Page

    Protected Sub Page_Load(sender As Object, e As EventArgs)
        If Not IsPostBack Then
            BindGridView()
        End If
    End Sub

    Private Sub BindGridView()
        Dim dt As New DataTable()
        dt.Columns.Add("EmployeeID", GetType(Integer))
        dt.Columns.Add("Name", GetType(String))
        dt.Columns.Add("Department", GetType(String))
        dt.Columns.Add("Salary", GetType(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()
    End Sub

    Protected Sub btnExport_Click(sender As Object, e As EventArgs)
        Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
        Dim worksheet As WorkSheet = workbook.CreateWorkSheet("Employees")

        ' Write header row
        For j As Integer = 0 To gvEmployees.HeaderRow.Cells.Count - 1
            worksheet.SetCellValue(0, j, gvEmployees.HeaderRow.Cells(j).Text)
        Next

        ' Write data rows
        For i As Integer = 0 To gvEmployees.Rows.Count - 1
            For j As Integer = 0 To gvEmployees.Rows(i).Cells.Count - 1
                worksheet.SetCellValue(i + 1, j, gvEmployees.Rows(i).Cells(j).Text)
            Next
        Next

        Dim filePath As String = Server.MapPath("~/Exports/EmployeeData.xlsx")
        workbook.SaveAs(filePath)
    End Sub
End Class
$vbLabelText   $csharpLabel

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);
}
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);
}
Protected Sub btnExport_Click(sender As Object, e As EventArgs)
    Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
    Dim worksheet As WorkSheet = workbook.CreateWorkSheet("Employees")

    ' Write column headers
    Dim colCount As Integer = gvEmployees.HeaderRow.Cells.Count
    For i As Integer = 0 To colCount - 1
        Dim header As String = gvEmployees.HeaderRow.Cells(i).Text
        worksheet.SetCellValue(0, i, header)
    Next

    ' Write data rows
    For i As Integer = 0 To gvEmployees.Rows.Count - 1
        For j As Integer = 0 To gvEmployees.Rows(i).Cells.Count - 1
            worksheet.SetCellValue(i + 1, j, gvEmployees.Rows(i).Cells(j).Text)
        Next
    Next

    ' Auto-size each column for readability
    For col As Integer = 0 To colCount - 1
        worksheet.AutoSizeColumn(col)
    Next

    Dim filePath As String = Server.MapPath("~/Exports/EmployeeReport.xlsx")
    workbook.SaveAs(filePath)
End Sub
$vbLabelText   $csharpLabel

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";
// 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";
' Bold the entire header row (columns A through D)
Dim headerRange = worksheet("A1:D1")
headerRange.Style.Font.Bold = True
headerRange.Style.BackgroundColor = "#4472C4"
headerRange.Style.Font.FontColor = "#FFFFFF"
$vbLabelText   $csharpLabel

此模式可統一適用於任何尺寸的範圍。 有關樣式屬性的完整列表,請參閱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);
}
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);
}
Protected Sub btnExport_Click(sender As Object, e As EventArgs)
    Dim sourceData As DataTable = TryCast(ViewState("EmployeeData"), DataTable)
    If sourceData Is Nothing Then
        Response.Write("No data available to export.")
        Return
    End If

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

    ' Column headers from DataTable schema
    For i As Integer = 0 To sourceData.Columns.Count - 1
        worksheet.SetCellValue(0, i, sourceData.Columns(i).ColumnName)
    Next

    ' Data rows from DataRow objects
    For i As Integer = 0 To sourceData.Rows.Count - 1
        For j As Integer = 0 To sourceData.Columns.Count - 1
            worksheet.SetCellValue(i + 1, j, sourceData.Rows(i)(j).ToString())
        Next
    Next

    Dim filePath As String = Server.MapPath("~/Exports/DataExport.xlsx")
    workbook.SaveAs(filePath)
End Sub
$vbLabelText   $csharpLabel

列名來自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}";
    }
}
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}";
    }
}
Protected Sub btnExport_Click(sender As Object, e As EventArgs)
    Try
        Dim sourceData As DataTable = TryCast(ViewState("EmployeeData"), DataTable)
        If sourceData Is Nothing Then
            Throw New InvalidOperationException("Session data has expired. Please reload the page.")
        End If

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

        For i As Integer = 0 To sourceData.Columns.Count - 1
            worksheet.SetCellValue(0, i, sourceData.Columns(i).ColumnName)
        Next

        For i As Integer = 0 To sourceData.Rows.Count - 1
            For j As Integer = 0 To sourceData.Columns.Count - 1
                worksheet.SetCellValue(i + 1, j, sourceData.Rows(i)(j).ToString())
            Next
        Next

        Dim filePath As String = Server.MapPath("~/Exports/SafeExport.xlsx")
        workbook.SaveAs(filePath)

        lblStatus.Text = "Export successful. File saved to server."
    Catch ex As Exception
        lblStatus.Text = $"Export failed: {ex.Message}"
    End Try
End Sub
$vbLabelText   $csharpLabel

對於直接作為瀏覽器下載而非儲存到磁碟的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();
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();
Imports System.IO

' ... inside btnExport_Click after populating the worksheet ...

Dim fileBytes As Byte()
Using ms As New MemoryStream()
    workbook.SaveAs(ms)
    fileBytes = ms.ToArray()
End Using

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

該模式避免將臨時文件寫入磁碟。 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"));
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"));
Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)

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

' Populate summary sheet ...
' Populate detail sheet ...

workbook.SaveAs(Server.MapPath("~/Exports/FullReport.xlsx"))
$vbLabelText   $csharpLabel

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

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

IronXL與EPPlus和ClosedXML的比較如何?

功能 IronXL EPPlus ClosedXML
需要安裝Office 不需要 不需要 不需要
支持XLSX讀寫 是的 是的 是的
支持XLS(遺留) 是的 不需要 不需要
支持CSV/TSV匯出 是的 不需要 部分支持
圖表建立API 是的 是的 有限的支持
授權模式 永久 + SaaS Polyform非商業 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以降低合併價格捆綁在一起。

常見問題

使用IronXL將GridView匯出到Excel的主要目的是什麼?

IronXL主要用於促進將ASP.NET GridView中的資料匯出到Excel格式如XLSX中的過程,確保高性能且易於在C#應用中整合。

IronXL能夠在從GridView匯出時處理大型資料集嗎?

是的,IronXL經過優化,能夠在從GridView匯出的過程中高效處理大型資料集,保持速度和性能。

使用IronXL時可以自定義Excel輸出嗎?

使用IronXL,您可以自定義Excel輸出的各個方面,例如格式化、樣式以及在匯出文件中包含額外的資料或公式。

IronXL與其他匯出GridView到Excel的程式庫相比怎麼樣?

IronXL提供比某些其他程式庫更簡單和靈活的方法,支持現代Excel格式並與C#應用直接整合。

IronXL支持匯出到XLSX以外的格式嗎?

是的,IronXL支持匯出到多種Excel格式,包括XLS、CSV和TSV,為項目的不同需求提供多樣性。

在項目中使用IronXL的先決條件是什麼?

要使用IronXL,您需要一個.NET環境,並可以在您的C#項目中通過NuGet安裝IronXL。

IronXL可以異步匯出GridView資料嗎?

IronXL支持非同步操作,允許開發者將GridView資料匯出到Excel文件而不會阻塞主要應用程式執行緒。

如何開始使用IronXL將GridView匯出到Excel?

要開始,請參考IronXL的文件和範例,其中提供有關設置和執行GridView到Excel資料匯出的逐步指導。

Curtis Chau
技術作家

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

除了開發,Curtis對物聯網(IoT)有濃厚的興趣,探索創新的方法來整合硬體和軟體。在空閒時間,他喜歡玩遊戲和建立Discord機器人,結合他對技術的熱愛與創造力。

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話