跳至页脚内容
与其他组件比较

ASP.NET导出到Excel: IronXL 、ClosedXML和EPPlus的对比

将数据导出到Excel是ASP.NET Core web应用程序中的标准要求。 无论您是生成销售报告、让用户下载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包,该包使用微软定义的Open XML格式构建真正的XLSX文件。 选项包括IronXL、ClosedXML和EPPlus。 这三者都可以生成无警告的有效Excel文件,支持单元格级格式,并适用于.NET Core。 官方.NET文件下载文档涵盖了所有这些方法使用的ASP.NET Core底层机制。

下表总结了关键差异:

Excel导出库比较:功能矩阵
特征 MIME类型/HTML ClosedXML EPPlus IronXL
真正的XLSX输出
CSV文件支持 手册 数量有限 数量有限 本地
无需Excel警告即可打开
公式支持
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许可页面。

传统的网格视图导出方法是如何工作的?

在旧版WebForms和一些较旧的MVC模式中,开发人员通过将GridView数据呈现为HTML并使用误导性的Content-Type头流式传输到浏览器来导出GridView数据。 应用程序调用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将Microsoft的Open XML SDK包装为一个可访问的API。 从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许可证概述。 EPPlus和ClosedXML都可以生成有效的Excel文件,但都不像IronXL那样提供本机CSV、JSON或XML导出功能。

下表比较了与生产ASP.NET Core应用程序相关的特定能力:

生产ASP.NET Core项目的详细能力比较
功能 IronXL ClosedXML EPPlus
CSV、JSON和XML导出 本地 不可用 不可用
DataTable集成
技术支持 包含在许可证中 仅限社区 付费层
Microsoft Office依赖
跨平台(.NET在Linux上)
许可证类型 商业的 MIT Polyform / 商业

如何为您的项目选择合适的库?

选择正确的Excel导出库取决于三个因素:所需的输出格式、项目的许可限制以及您是否需要专业支持。

在以下情况下选择IronXL:您的应用程序需要多种格式输出(XLSX、CSV、JSON、XML),当您正在构建需要保证支持渠道的商业产品,或当您需要高级Excel功能如公式评估、单元格样式或图表生成时。 IronXL的文档详细覆盖每个API接口,支持团队直接响应许可证持有者。 查看<IronXL博客了解其他模式和教程

在以下情况下选择ClosedXML:您的项目是开源或非商业项目且仅需XLSX输出。 MIT许可证对再分发没有限制,并且该API通过社区资源有很好的文档记录。

在以下情况下选择EPPlus:现有代码库已经使用EPPlus,转换到另一个库的成本超过购买商业许可证的成本。

对于正在评估IronXL及其替代方案的团队,IronXL试用许可证允许在购买前进行全功能测试。 在IronXL示例页面上可以找到其他用于读取和写入Excel文件的代码示例

您的下一步是什么?

现在您已经审阅了ASP.NET Core的可用Excel导出方法,您可以采取以下步骤继续前进:

  • 使用dotnet add package IronXl.Excel安装IronXL,并通过入门指南来创建您的第一个工作簿。
  • 通过查看<IronXL示例页面中与您的用例匹配的场景比较代码模式,如数据库导出、多工作表工作簿或样式化报告。
  • 通过访问<IronXL许可页面评估许可,了解开发、暂存和生产部署的选项。
  • 通过测试SaveAsXml方法,探索其他格式,如果您的应用程序需要从相同代码库中以多种格式导出数据。
  • 通过识别现有解决方案中的任何Response.ContentType = "application/vnd.ms-excel"模式并用IronXL工作簿创建替换它们以迁移遗留代码,消除用户的格式警告。

对于生产部署,购买许可证以解锁专业支持并确保符合IronXL许可证条款。

立即开始使用 IronXL。
green arrow pointer

常见问题解答

IronXL 在 ASP.NET Core 中导出到 Excel 的主要功能是什么?

IronXL无需 Microsoft Office 即可生成真正的 XLSX、CSV、JSON 和 XML 文件。它提供了一个直观的 API,用于工作簿和工作表管理、单元格级样式设置、公式计算和数据表集成,所有这些都集成在标准的.NET托管代码中。

IronXL 与用于 ASP.NET Core 项目的 ClosedXML 相比有何优势?

IronXL支持多种导出格式(XLSX、CSV、JSON、XML),并提供商业许可的专业支持。ClosedXML 生成符合 MIT 许可证的有效 XLSX 文件,非常适合只需要电子表格输出的开源项目。

IronXL 是否适合在 ASP.NET 中从数据库创建 Excel 报告?

是的。IronXL 直接处理 DataTable 对象和.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 自动化。它可在 Windows、Linux 和 macOS 等所有支持.NET 的平台上运行。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。

Iron Support Team

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