跳過到頁腳內容
與其他組件的比較

ASP.NET匯出至Excel:IronXL vs ClosedXML vs EPPlus比較

在ASP.NET Core網路應用程式中,將資料匯出到Excel是標準需求。 無論您是在生成銷售報告、允許用戶下載GridView內容,還是從資料庫查詢生成CSV檔案,所選的方法決定了結果檔案是能在Microsoft Excel中清晰開啟還是觸發格式警告。 本文比較C#開發人員可用的最常見的Excel匯出方法——傳統的基於HTML流式技術和現代程式庫解決方案,包括IronXL、ClosedXML和EPPlus,以便您能選擇適合您專案的工具。

開始免費試用 ,看看IronXL如何在ASP.NET Core應用程式中處理Excel檔案生成。

在ASP.NET Core中將資料匯出到Excel的常見方法是什麼?

ASP.NET Core開發人員在添加Excel匯出功能時有幾個途徑可用。 每種方法在輸出檔案質量、實現所需的努力和商業專案的授權影響中各有不同。

傳統MIME類型流式技術是最古老的技術。 伺服器將響應的Content-Type頭設置為application/vnd.ms-excel,並將HTML表格寫入到輸出流。 瀏覽器將此解讀為Excel下載,但檔案包含HTML標記而非真正的試算表數據。 Microsoft Excel檢測到了不匹配,並在打開檔案之前顯示格式警告。此方法無法支援公式、類型化列或正確的儲存格格式。

基於程式庫的解決方案添加了一個NuGet包,使用Microsoft定義的Open XML格式構建真正的XLSX檔案。 選項包括IronXL、ClosedXML和EPPlus。 這三種方式都能生成有效的Excel檔案,可以無警告地開啟、支援儲存格級別格式化,並可以與.NET Core一起運行。 .NET檔案下載的官方文檔涵蓋了所有這些方法所使用的基礎ASP.NET Core機制。

下表總結了主要差異:

Excel匯出程式庫比較:功能矩陣
功能 MIME類型/HTML ClosedXML EPPlus IronXL
真正的XLSX輸出 不支持 支持 支持 支持
CSV檔案支援 手動 有限 有限 原生支援
無格式警告地開啟 不支持 支持 支持 支持
公式支援 不支持 支持 支持 支持
JSON和XML匯出 不支持 不支持 不支持 支持
商業授權 不適用 MIT Polyform 商業
.NET Core支援 支持 支持 支持 支持

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

在寫任何匯出代碼之前,通過NuGet包管理器或.NET CLI將IronXL添加到您的專案中。 IronXL不依賴於Microsoft Office或COM互操作,因此在任何.NET支持的操作系統上的安裝都是簡單的。

dotnet add package IronXl.Excel
dotnet add package IronXl.Excel
SHELL

或者,您可以在Visual Studio中使用包管理器控制台:

Install-Package IronXl.Excel
Install-Package IronXl.Excel
SHELL

安裝包後,將using IronXL;添加到任何需要生成Excel檔案的控制器或服務類中。 基本匯出場景不需要額外的配置。 有關授權和部署選項,請訪問IronXL授權頁面。

傳統的GridView匯出方法如何工作?

在舊版WebForms和一些較舊的MVC模式中,開發人員通過將GridView數據渲染為HTML並使用誤導性的Content-Type頭將其流式傳輸到瀏覽器以進行匯出。 應用程序調用Response.AddHeader設置文件名並直接寫入HTML輸出。

// Traditional approach -- exports HTML disguised as Excel
public void ExportToExcel(object sender, EventArgs e)
{
    Response.Clear();
    Response.Buffer = true;
    Response.ContentType = "application/vnd.ms-excel";
    Response.AddHeader("content-disposition", "attachment;filename=Report.xls");
    StringWriter stringWriter = new StringWriter();
    HtmlTextWriter htmlTextWriter = new HtmlTextWriter(stringWriter);
    // Render grid content as HTML
    DataGrid1.RenderControl(htmlTextWriter);
    Response.Write(stringWriter.ToString());
    Response.End();
}

public override void VerifyRenderingInServerForm(Control control)
{
    // Required to prevent server form rendering errors
}
// Traditional approach -- exports HTML disguised as Excel
public void ExportToExcel(object sender, EventArgs e)
{
    Response.Clear();
    Response.Buffer = true;
    Response.ContentType = "application/vnd.ms-excel";
    Response.AddHeader("content-disposition", "attachment;filename=Report.xls");
    StringWriter stringWriter = new StringWriter();
    HtmlTextWriter htmlTextWriter = new HtmlTextWriter(stringWriter);
    // Render grid content as HTML
    DataGrid1.RenderControl(htmlTextWriter);
    Response.Write(stringWriter.ToString());
    Response.End();
}

public override void VerifyRenderingInServerForm(Control control)
{
    // Required to prevent server form rendering errors
}
$vbLabelText   $csharpLabel

傳統輸出

ASP.NET 匯出到 Excel: C# 開發人員的最佳工具比較:圖1 - 傳統Excel匯出輸出

此方法需要覆蓋VerifyRenderingInServerForm以繞過伺服器端驗證。 生成的檔案包含HTML而非真正的試算表數據,因此當用戶打開它時,Microsoft Excel會顯示格式警告。 輸出不能支援工作表公式、類型化數據列或儲存格級別格式化。 對於任何新的ASP.NET Core開發,應避免此模式,應選擇適當的Excel程式庫。

IronXL如何簡化ASP.NET Core中的Excel檔案生成?

IronXL提供了一個API,用於創建真正的XLSX檔案而不需要Microsoft Office或COM互操作。該程式庫完全在托管代碼中構建工作簿對象,因此它可以在Linux、macOS和Windows上運行,無需額外的依賴項。

下面的示例創建了一個工作簿,填充了銷售數據的工作表,對標題行應用了粗體格式,並將檔案流式傳輸到瀏覽器:

using IronXL;
using Microsoft.AspNetCore.Mvc;

public class ExportController : Controller
{
    [HttpPost]
    public IActionResult ExportReport()
    {
        // Create workbook and worksheet
        WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        WorkSheet worksheet = workbook.CreateWorkSheet("Sales Data");

        // Add header row
        worksheet["A1"].Value = "Product";
        worksheet["B1"].Value = "Quantity";
        worksheet["C1"].Value = "Revenue";

        // Populate data rows
        worksheet["A2"].Value = "Widget A";
        worksheet["B2"].Value = 150;
        worksheet["C2"].Value = 4500.00;
        worksheet["A3"].Value = "Widget B";
        worksheet["B3"].Value = 230;
        worksheet["C3"].Value = 6900.00;

        // Apply bold formatting to headers
        var headerRange = worksheet["A1:C1"];
        headerRange.Style.Font.Bold = true;

        // Stream file to browser
        byte[] fileBytes = workbook.ToByteArray();
        string filename = $"SalesReport_{DateTime.不支持w:yyyyMMdd}.xlsx";
        return File(fileBytes,
            "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
            filename);
    }
}
using IronXL;
using Microsoft.AspNetCore.Mvc;

public class ExportController : Controller
{
    [HttpPost]
    public IActionResult ExportReport()
    {
        // Create workbook and worksheet
        WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        WorkSheet worksheet = workbook.CreateWorkSheet("Sales Data");

        // Add header row
        worksheet["A1"].Value = "Product";
        worksheet["B1"].Value = "Quantity";
        worksheet["C1"].Value = "Revenue";

        // Populate data rows
        worksheet["A2"].Value = "Widget A";
        worksheet["B2"].Value = 150;
        worksheet["C2"].Value = 4500.00;
        worksheet["A3"].Value = "Widget B";
        worksheet["B3"].Value = 230;
        worksheet["C3"].Value = 6900.00;

        // Apply bold formatting to headers
        var headerRange = worksheet["A1:C1"];
        headerRange.Style.Font.Bold = true;

        // Stream file to browser
        byte[] fileBytes = workbook.ToByteArray();
        string filename = $"SalesReport_{DateTime.不支持w:yyyyMMdd}.xlsx";
        return File(fileBytes,
            "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
            filename);
    }
}
$vbLabelText   $csharpLabel

IronXL輸出

ASP.NET 匯出到 Excel: C# 開發人員的最佳工具比較:圖2 - IronXL匯出到Excel輸出

WorkBook.Create在內存中構建了一個新的Excel文件。 CreateWorkSheet添加了一個用戶可以在Excel窗口底部看到的命名標籤。 使用Excel風格的範圍標記分配儲存格值("A1", "B2"),大多數C#開發人員覺得這樣便於閱讀和維護。

ToByteArray()方法將完成的工作簿轉換為字節數組,然後由ASP.NET Core File()響應方法以正確的MIME類型和內容處理標頭直接流式傳輸到用戶的瀏覽器。 下載的檔案在Excel中開啟時沒有任何格式警告。

IronXL還支援通過SaveAsCsv方法匯出到CSV格式:

// Export as CSV instead of XLSX
workbook.SaveAsCsv("output.csv");
// Export as CSV instead of XLSX
workbook.SaveAsCsv("output.csv");
$vbLabelText   $csharpLabel

對於需要以JSON或XML格式匯出工作表數據的場景,IronXL提供了SaveAsXml方法——这是ClosedXML或EPPlus所不具备的功能。 您可以在IronXL代碼範例API參考中找到更多範例。

IronXL如何處理DataTable和資料庫整合?

許多ASP.NET Core應用程式在匯出之前會從SQL Server或其他關聯式資料庫中提取數據。 IronXL提供了一流的支援,將DataTable直接加載到工作表中,消除了手動迭代行的需要。

下面的示例使用ADO.NET查詢資料庫並從結果DataTable填充Excel工作表:

using IronXL;
using System.Data;
using System.Data.SqlClient;
using Microsoft.AspNetCore.Mvc;

public class ReportController : Controller
{
    private readonly string _connectionString;

    public ReportController(IConfiguration config)
    {
        _connectionString = config.GetConnectionString("DefaultConnection");
    }

    [HttpGet]
    public IActionResult DownloadReport()
    {
        DataTable table = new DataTable();

        using (SqlConnection connection = new SqlConnection(_connectionString))
        {
            string query = "SELECT OrderId, CustomerName, Total, OrderDate FROM Orders";
            using SqlDataAdapter adapter = new SqlDataAdapter(query, connection);
            adapter.Fill(table);
        }

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

        // Write column headers from DataTable schema
        for (int col = 0; col < table.Columns.Count; col++)
        {
            worksheet[0, col].Value = table.Columns[col].ColumnName;
        }

        // Write data rows
        for (int row = 0; row < table.Rows.Count; row++)
        {
            for (int col = 0; col < table.Columns.Count; col++)
            {
                worksheet[row + 1, col].Value = table.Rows[row][col].ToString();
            }
        }

        byte[] fileBytes = workbook.ToByteArray();
        return File(fileBytes,
            "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
            "Orders.xlsx");
    }
}
using IronXL;
using System.Data;
using System.Data.SqlClient;
using Microsoft.AspNetCore.Mvc;

public class ReportController : Controller
{
    private readonly string _connectionString;

    public ReportController(IConfiguration config)
    {
        _connectionString = config.GetConnectionString("DefaultConnection");
    }

    [HttpGet]
    public IActionResult DownloadReport()
    {
        DataTable table = new DataTable();

        using (SqlConnection connection = new SqlConnection(_connectionString))
        {
            string query = "SELECT OrderId, CustomerName, Total, OrderDate FROM Orders";
            using SqlDataAdapter adapter = new SqlDataAdapter(query, connection);
            adapter.Fill(table);
        }

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

        // Write column headers from DataTable schema
        for (int col = 0; col < table.Columns.Count; col++)
        {
            worksheet[0, col].Value = table.Columns[col].ColumnName;
        }

        // Write data rows
        for (int row = 0; row < table.Rows.Count; row++)
        {
            for (int col = 0; col < table.Columns.Count; col++)
            {
                worksheet[row + 1, col].Value = table.Rows[row][col].ToString();
            }
        }

        byte[] fileBytes = workbook.ToByteArray();
        return File(fileBytes,
            "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
            "Orders.xlsx");
    }
}
$vbLabelText   $csharpLabel

此模式使控制器保持精簡且可測試。 資料庫查詢和工作簿構建明確分離,這使得替換數據源或為摘要數據添加額外的工作表變得簡單明瞭。 有關將現有Excel檔案讀入DataTable的指導,請參閱<IronXL如何讀取Excel文件指南>。

ClosedXML和EPPlus如何比較?

ClosedXML使用易於訪問的API封裝了Microsoft的Open XML SDK。 從NuGet安裝它:

Install-Package ClosedXML
Install-Package ClosedXML
SHELL

以下示例顯示了一個典型的ClosedXML匯出操作:

using ClosedXML.Excel;
using Microsoft.AspNetCore.Mvc;

public class ExportController : Controller
{
    [HttpGet]
    public IActionResult ExportWithClosedXML()
    {
        using var workbook = new XLWorkbook();
        var worksheet = workbook.AddWorksheet("Data");
        worksheet.Cell(1, 1).Value = "Name";
        worksheet.Cell(1, 2).Value = "Amount";
        worksheet.Cell(2, 1).Value = "Alpha";
        worksheet.Cell(2, 2).Value = 1200;

        using var stream = new MemoryStream();
        workbook.SaveAs(stream);
        return File(stream.ToArray(),
            "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
            "export.xlsx");
    }
}
using ClosedXML.Excel;
using Microsoft.AspNetCore.Mvc;

public class ExportController : Controller
{
    [HttpGet]
    public IActionResult ExportWithClosedXML()
    {
        using var workbook = new XLWorkbook();
        var worksheet = workbook.AddWorksheet("Data");
        worksheet.Cell(1, 1).Value = "Name";
        worksheet.Cell(1, 2).Value = "Amount";
        worksheet.Cell(2, 1).Value = "Alpha";
        worksheet.Cell(2, 2).Value = 1200;

        using var stream = new MemoryStream();
        workbook.SaveAs(stream);
        return File(stream.ToArray(),
            "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
            "export.xlsx");
    }
}
$vbLabelText   $csharpLabel

ClosedXML輸出

ASP.NET 匯出到 Excel: C# 開發人員的最佳工具比較:圖3 - ClosedXML匯出到Excel輸出

ClosedXML使用基於整數的儲存格定位(Cell(row, col)),而非IronXL所使用的範圍字串標記。 這兩種方法都能生成有效的XLSX檔案。 ClosedXML在MIT授權下發布,這使得它適用於無商業授權顧慮的開放源碼專案。 ClosedXML GitHub存儲庫提供問題跟踪和社區貢獻的範例。

EPPlus在其Polyform非商業授權下提供類似的功能,用於非商業用途,生產部署需要商業授權。 在將其用於商業產品之前,請查看EPPlus授權概述。 EPPlus和ClosedXML都能生成有效的Excel檔案,但兩者都不提供IronXL所提供的原生CSV、JSON或XML匯出。

下表比較了生產ASP.NET Core應用程式所需的特定能力:

生產ASP.NET Core專案的詳細功能比較
功能 IronXL ClosedXML EPPlus
CSV、JSON和XML匯出 原生支援 不可用 不可用
DataTable整合 支持 支持 支持
技術支援 包括在授權中 僅限社區 有償級別
Microsoft Office依賴
跨平台(.NET on Linux) 支持 支持 支持
授權類型 商業 MIT Polyform / 商業

如何選擇適合您專案的程式庫?

選擇正確的Excel匯出程序庫取決於三個因素:所需的輸出格式、專案的授權限制以及您是否需要專業支援。

選擇IronXL當您的應用程序需要多格式輸出(XLSX、CSV、JSON、XML)、當您正在構建需要保證支援渠道的商業產品或需要高級Excel功能如公式評估、儲存格樣式化或圖表生成時。 IronXL的文檔詳細介紹了每個API表面,並且支援團隊直接回覆授權持有者。 瀏覽<IronXL博客>以獲取更多模式和教程。

選擇ClosedXML當您的專案是開放源碼或非商業且只需要XLSX輸出時。 MIT授權對再分發沒有任何限制,並且API通過社區資源得到了良好的文檔化。

選擇EPPlus當現有代碼庫已經使用EPPlus且遷移到其他程式庫的代價比購買商業授權更高時。

對於評估IronXL及其替代方案的團隊,IronXL試用授權允許在購買前進行全功能測試。 更多讀寫Excel文件的代碼示例可在IronXL示例頁面獲得。

接下來您該怎麼做?

您現在已經了解了可用的ASP.NET Core的Excel匯出方法,您可以採取以下步驟來推進:

  • 安裝IronXL 使用dotnet add package IronXl.Excel並通過入門指南創建您的第一個工作簿。
  • 比較代碼模式通過查閱<IronXL 示例頁>來查看與您的使用情況匹配的場景,如資料庫匯出、多表工作簿或樣式報告。
  • 評估授權參觀<IronXL 授權頁>來了解開發、準備環境和生產部署的選項。
  • 探索其他格式如果您的應用程序需要從相同的代碼庫中以多種格式匯出數據,請測試SaveAsXml方法。
  • 從遺留代碼中遷移通過識別解決方案中的任何現有Response.ContentType = "application/vnd.ms-excel"模式並將其替換為IronXL工作簿創建,消除用戶的格式警告。

對於生產部署,購買授權以解鎖專業支援並確保符合IronXL授權條款。

現在開始使用 IronXL。
green arrow pointer

常見問題解答

IronXL for .NET Core 匯出至 Excel 的主要功能為何?

IronXL生成真實的XLSX, CSV, JSON和XML文件,無需Microsoft Office。它提供了一個直觀的API來管理工作簿和工作表、單元格級別樣式、公式評估以及DataTable整合,所有這些都在標準.NET管理代碼中。

IronXL 與用於 ASP.NET Core 專案的 ClosedXML 相比如何?

IronXL支持多種匯出格式(XLSX, CSV, JSON, XML),並提供商業授權的專業支持。ClosedXML在MIT授權下生成有效的XLSX文件,非常適合需要僅限試算表輸出的開源專案。

IronXL 是否適合在 ASP.NET 中從資料庫建立 Excel 報表?

是的。IronXL可以直接與DataTable對象和ADO.NET查詢結果一起使用,使得從SQL Server或其他關聯資料庫進行工作表的填充變得簡單,並將生成的文件串流至瀏覽器。

使用 IronXL 相較於 EPPlus 有什麼優勢?

IronXL本身支援CSV, JSON和XML匯出,每個商業授權都包含專業支持,並且沒有非商業限制。EPPlus需要單獨的商業授權來供生產使用,並且不提供原生的多格式匯出。

IronXL 可以有效地處理大型數據集嗎?

IronXL設計用于伺服器端工作負載,能處理大型數據集而無需Microsoft Excel或COM互操作。對於非常大的匯出,直接通過ASP.NET Core File()響應串流字節陣列可以避免整個文件在內存中的緩衝。

IronXL 是否需要安裝 Microsoft Office 才能匯出至 Excel?

不。IronXL完全在管理的.NET代碼中運行,無需依賴於Microsoft Office、COM互操作或Office自動化。它可在.NET支持的Windows、Linux和macOS上運行。

Jordi Bardia
軟體工程師
Jordi 在 Python、C# 和 C++ 上最得心應手,當他不在 Iron Software 展現技術時,便在做遊戲編程。在分担產品测测试,產品開發和研究的责任時,Jordi 為持续的產品改進增值。他说这种多样化的经验使他受到挑战并保持参与, 而这也是他与 Iron Software 中工作一大乐趣。Jordi 在佛罗里达州迈阿密长大,曾在佛罗里达大学学习计算机科学和统计学。

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me