跳至页脚内容
使用 IRONXL

在.NET C# 中下载 Excel 文件:将数据导出为 XLSX、CSV 等格式

对于企业级 Web 应用程序而言,实现电子表格导出功能是一个常见的需求,然而手动生成和交付这些文件的过程往往会引入相当大的技术复杂性。 开发人员必须经常了解 MemoryStream 管理的细微差别,并配置精确的 HTTP 内容处置标头,以确保浏览器行为的一致性并防止数据损坏。

本文将介绍如何使用IronXL库在.NET C# MVC 控制器中创建和下载 Excel 文件。 我们将介绍如何将数据导出为 XLSX 格式的 Excel 文件、如何流式传输 CSV 文件、如何转换上传文件以便重新导出,以及如何将下载的文件返回到浏览器,所有这些操作都无需安装 Microsoft Office 或依赖 Excel Interop。安装IronXL NuGet包开始免费试用,即可跟随源代码示例进行学习。

NuGet 使用 NuGet 安装

PM >  Install-Package IronXl.Excel

IronXL 上查看 NuGet 快速安装。超过 1000 万次下载,它正以 C# 改变 PDF 开发。 您也可以下载 DLL

如何从控制器创建和下载 Excel 文件?

在ASP.NET Core场景中,任何下载 Excel 文件的核心模式都包含三个步骤:创建工作簿、将其写入流,并将流作为文件响应返回。 以下代码展示了一个完整的 MVC 控制器操作,该操作从头开始构建 XLSX 文件并将其推送到浏览器。

using IronXL;
using Microsoft.AspNetCore.Mvc;
public class ReportController : Controller
{
    // Export employee data as a downloadable Excel file
    public IActionResult DownloadExcel()
    {
        // Create a new workbook and worksheet
        var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        var worksheet = workbook.CreateWorkSheet("Employees");
        // Add header row with column names
        worksheet["A1"].Value = "Name";
        worksheet["B1"].Value = "Department";
        worksheet["C1"].Value = "Salary";
        // Populate cells with data values
        worksheet["A2"].Value = "Alice Torres";
        worksheet["B2"].Value = "Engineering";
        worksheet["C2"].Value = 95000;
        worksheet["A3"].Value = "James Park";
        worksheet["B3"].Value = "Marketing";
        worksheet["C3"].Value = 78000;
        // Export workbook to a MemoryStream for download
        var stream = workbook.ToStream();
        string filename = "Employees.xlsx";
        var content = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        // Return file to the browser with content disposition attachment
        return File(stream, content, filename);
    }
}
using IronXL;
using Microsoft.AspNetCore.Mvc;
public class ReportController : Controller
{
    // Export employee data as a downloadable Excel file
    public IActionResult DownloadExcel()
    {
        // Create a new workbook and worksheet
        var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        var worksheet = workbook.CreateWorkSheet("Employees");
        // Add header row with column names
        worksheet["A1"].Value = "Name";
        worksheet["B1"].Value = "Department";
        worksheet["C1"].Value = "Salary";
        // Populate cells with data values
        worksheet["A2"].Value = "Alice Torres";
        worksheet["B2"].Value = "Engineering";
        worksheet["C2"].Value = 95000;
        worksheet["A3"].Value = "James Park";
        worksheet["B3"].Value = "Marketing";
        worksheet["C3"].Value = 78000;
        // Export workbook to a MemoryStream for download
        var stream = workbook.ToStream();
        string filename = "Employees.xlsx";
        var content = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        // Return file to the browser with content disposition attachment
        return File(stream, content, filename);
    }
}
$vbLabelText   $csharpLabel

输出 Excel 文件

在.NET C# 中下载 Excel 文件:将数据导出为 XLSX、CSV 等格式:图 1 - .NET C# 下载 Excel 文件的示例输出

WorkBook.Create 方法生成一个新的 Excel 文档,而 CreateWorkSheet 方法向其中添加第一个工作表。 在用值填充单元格后, ToStream方法会将整个工作簿转换为 MemoryStream,不会在磁盘上创建临时文件。 控制器上的 File() 返回方法会将内容处置标头设置为 attachment,这告诉浏览器下载文件而不是尝试渲染它。 第三个参数控制文件名在用户下载对话框中的显示方式。

这种公共 IActionResult 模式在.NET Framework和ASP.NET Core项目中都适用,因此对于需要将数据导出到 Excel 的Web 应用程序来说,它是首选方法。

如何将数据库数据导出为可下载的电子表格?

大多数实际应用场景都涉及从数据库表中导出数据,而不是硬编码的值。 流程相同:查询数据、填充工作表、返回文件。以下示例模拟从数据库中提取记录并将其写入 Excel 文档。

using IronXL;
using Microsoft.AspNetCore.Mvc;
public class DataExportController : Controller
{
    // Export database records to an xlsx file for download
    public IActionResult ExportDatabaseReport()
    {
        // Simulate a database query returning order records
        var orders = new[]
        {
            new { OrderId = 1001, Customer = "Acme Corp", Total = 4500.00m },
            new { OrderId = 1002, Customer = "Globex Inc", Total = 12300.50m },
            new { OrderId = 1003, Customer = "Initech LLC", Total = 890.75m },
        };
        var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        var worksheet = workbook.CreateWorkSheet("Orders");
        // Write headers
        worksheet["A1"].Value = "Order ID";
        worksheet["B1"].Value = "Customer";
        worksheet["C1"].Value = "Total";
        // Write each row of data from the query results
        for (int i = 0; i < orders.Length; i++)
        {
            int row = i + 2;
            worksheet[$"A{row}"].Value = orders[i].OrderId;
            worksheet[$"B{row}"].Value = orders[i].Customer;
            worksheet[$"C{row}"].Value = orders[i].Total;
        }
        var stream = workbook.ToStream();
        string filename = $"OrderReport-{DateTime.Now:yyyyMMdd}.xlsx";
        return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", filename);
    }
}
using IronXL;
using Microsoft.AspNetCore.Mvc;
public class DataExportController : Controller
{
    // Export database records to an xlsx file for download
    public IActionResult ExportDatabaseReport()
    {
        // Simulate a database query returning order records
        var orders = new[]
        {
            new { OrderId = 1001, Customer = "Acme Corp", Total = 4500.00m },
            new { OrderId = 1002, Customer = "Globex Inc", Total = 12300.50m },
            new { OrderId = 1003, Customer = "Initech LLC", Total = 890.75m },
        };
        var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        var worksheet = workbook.CreateWorkSheet("Orders");
        // Write headers
        worksheet["A1"].Value = "Order ID";
        worksheet["B1"].Value = "Customer";
        worksheet["C1"].Value = "Total";
        // Write each row of data from the query results
        for (int i = 0; i < orders.Length; i++)
        {
            int row = i + 2;
            worksheet[$"A{row}"].Value = orders[i].OrderId;
            worksheet[$"B{row}"].Value = orders[i].Customer;
            worksheet[$"C{row}"].Value = orders[i].Total;
        }
        var stream = workbook.ToStream();
        string filename = $"OrderReport-{DateTime.Now:yyyyMMdd}.xlsx";
        return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", filename);
    }
}
$vbLabelText   $csharpLabel

输出

在.NET C# 中下载 Excel 文件:将数据导出为 XLSX、CSV 等格式:图 2 - 将数据库数据导出到 Excel 文件的输出

在生产环境中,订单数组将来自 Entity Framework Core 查询、 Dapper调用或任何通过连接字符串连接到数据库的数据访问层。 循环遍历结果,并将每个值写入工作表中的正确单元格。 请注意字符串文件名中包含日期戳,这个小细节可以避免用户重复下载文件时出现麻烦。

IronXL 的单元格寻址系统(worksheet[$"A{row}"])保持了内容的可读性,而WorkBook API则在内部处理了构建有效 XLSX 文件的所有繁重工作。 对于涉及公式、样式或多工作表工作簿的更复杂场景,同样的方法也能很好地扩展。

如何将数据下载为 CSV 文件而不是 XLSX 文件?

有时,轻量级的 CSV 文件是更好的选择,尤其是在将数据导入其他系统、数据库或工具时,这些系统、数据库或工具并不需要 Excel 文件IronXL丰富的功能。IronXL 让格式切换变得轻而易举。

using IronXL;
using Microsoft.AspNetCore.Mvc;
public class CsvController : Controller
{
    // Export data as a CSV file download
    public IActionResult ExportCsv()
    {
        var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        var worksheet = workbook.CreateWorkSheet("Products");
        worksheet["A1"].Value = "SKU";
        worksheet["B1"].Value = "Product";
        worksheet["C1"].Value = "Price";
        worksheet["A2"].Value = "WDG-001";
        worksheet["B2"].Value = "Widget Pro";
        worksheet["C2"].Value = 29.99;
        // Convert to CSV stream instead of XLSX
        var stream = workbook.ToCsvStream();
        string filename = "Products.csv";
        return File(stream, "text/csv", filename);
    }
}
using IronXL;
using Microsoft.AspNetCore.Mvc;
public class CsvController : Controller
{
    // Export data as a CSV file download
    public IActionResult ExportCsv()
    {
        var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        var worksheet = workbook.CreateWorkSheet("Products");
        worksheet["A1"].Value = "SKU";
        worksheet["B1"].Value = "Product";
        worksheet["C1"].Value = "Price";
        worksheet["A2"].Value = "WDG-001";
        worksheet["B2"].Value = "Widget Pro";
        worksheet["C2"].Value = 29.99;
        // Convert to CSV stream instead of XLSX
        var stream = workbook.ToCsvStream();
        string filename = "Products.csv";
        return File(stream, "text/csv", filename);
    }
}
$vbLabelText   $csharpLabel

输出CSV文件

在.NET C# 中下载 Excel 文件:将数据导出为 XLSX、CSV 等格式:图 3 - 数据下载为 CSV 文件而不是 Excel 文件

ToCsvStream 方法将第一个工作表导出为 CSV 格式的MemoryStream 。 CSV 文件非常适合数据交换,但它们会去除所有格式、公式和多工作表结构。 当您需要这些功能时,请使用 XLSX 文件格式,并通过 ToStream() 或 ToXlsxStream() 进行转换。 要深入了解格式转换,请参阅电子表格转换指南

如何将上传的文件重新导出为其他格式?

常见的 Web 应用程序场景包括接受用户上传的文件并将其导出为另一种格式,例如将 XLS 上传文件转换为 XLSX 文件,或者从最初以旧格式保存的工作簿生成 CSV 文件。

public IActionResult ConvertUpload(IFormFile upload)
{
    using var memoryStream = new MemoryStream();
    upload.CopyTo(memoryStream);
    memoryStream.Position = 0;
    // Load uploaded Excel file from the stream
    var workbook = WorkBook.Load(memoryStream);
    // Re-export as XLSX regardless of the original file extension or file type
    var stream = workbook.ToXlsxStream();
    string filename = Path.GetFileNameWithoutExtension(upload.FileName) + ".xlsx";
    return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", filename);
}
public IActionResult ConvertUpload(IFormFile upload)
{
    using var memoryStream = new MemoryStream();
    upload.CopyTo(memoryStream);
    memoryStream.Position = 0;
    // Load uploaded Excel file from the stream
    var workbook = WorkBook.Load(memoryStream);
    // Re-export as XLSX regardless of the original file extension or file type
    var stream = workbook.ToXlsxStream();
    string filename = Path.GetFileNameWithoutExtension(upload.FileName) + ".xlsx";
    return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", filename);
}
$vbLabelText   $csharpLabel

输出:将 CSV 转换为 XLSX 格式

在.NET C# 中下载 Excel 文件:将数据导出为 XLSX、CSV 等格式:图 4 - 将 CSV 文件转换为 XLSX 格式的示例输出

WorkBook.Load方法接受 MemoryStream 类型参数,因此无需先将上传的文件保存到磁盘。它会自动检测源文件是 XLS、XLSX 还是 CSV 文件,并进行相应的解析。 从那里,ToXlsxStream() 生成一个干净的新 MemoryStream,采用现代 XLSX 格式,每个字节都结构正确。 这有助于在进一步处理或存储之前对用户提交的内容进行规范化。

支持导出哪些文件格式?

IronXL支持将数据导出为多种电子表格和数据交换格式。 下表总结了可用的输出选项及其最佳用途。

|翻译格式| 文件扩展名 | 流方法 | 最佳用例 | |---|---|---|---| | XLSX | .xlsx | ToXlsxStream() | 带有格式和公式的现代Excel电子表格 | | XLS | .xls | ToXlsStream() | 旧系统兼容性 | | CSV | .csv | ToCsvStream() | 数据库导入、数据管道、轻量级导出 | | XML | .xml | ToXmlStream() | 企业系统集成 | | JSON | .json | SaveAsJson() | Web API 响应和数据交换 | | HTML | .html | ExportToHtml() | 网页上显示电子表格数据 |

每个流方法都会返回一个 MemoryStream,该 MemoryStream 可以直接插入ASP.NET Core 的 File() 返回辅助函数。 在某些情况下,例如保存到 blob 数据库或附加到电子邮件响应流时,byte[] 更方便,也可以使用字节数组替代方案 (ToByteArray())。 安装IronXL NuGet包后,所有这些方法都可以立即使用。 有关每种导出格式的完整说明,请参阅导出到 Excel 文档

无论目标是为业务分析师下载 XLSX 格式的文件,为数据工程师导出 CSV 文件,还是为企业集成生成 XML, IronXL都能在.NET Core和.NET Framework应用程序中保持代码的简洁性和输出的可靠性。 准备好在下一个项目中交付电子表格导出文件了吗? 获取免费试用许可证了解许可选项,立即开始使用。 有关分步设置说明,请参阅IronXL入门指南

常见问题解答

如何使用 C# 在ASP.NET Core中下载 Excel 文件?

您可以使用IronXL在ASP.NET Core中使用 C# 下载 Excel 文件。IronXL 允许您直接从 MVC 控制器将数据导出为多种格式,例如 XLSX、CSV 和 XML。使用 MemoryStream 和 File() 方法可以高效地完成此操作。

使用IronXL导出 Excel 文件有哪些好处?

IronXL通过有效管理 MemoryStream 和配置 HTTP 内容处置标头,简化了 Excel 文件的导出流程。它确保浏览器行为的一致性并防止数据损坏,使其成为企业级 Web 应用程序的理想选择。

IronXL 可以将数据导出到哪些文件格式?

IronXL可以将数据导出为多种文件格式,包括 XLSX、CSV 和 XML。这种多功能性有助于开发人员轻松应对不同的数据导出需求。

IronXL在导出 Excel 文件时可以帮助克服哪些技术难题?

IronXL有助于克服诸如 MemoryStream 管理和精确配置 HTTP 内容处置标头等挑战。这些功能可确保浏览器正确处理导出的 Excel 文件,并防止数据损坏。

IronXL能否用于从 MVC 控制器导出数据?

是的, IronXL可以用于从 MVC 控制器导出数据。它提供了一种直接以 Excel 格式输出数据的方法,使其成为ASP.NET Core Web 应用程序的实用选择。

IronXL如何改进 Excel 文件生成流程?

IronXL通过自动化 MemoryStream 和 HTTP 标头管理等复杂任务来改进流程,使开发人员能够专注于核心功能而不是技术细节。

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