在.NET C# 中下载 Excel 文件:将数据导出为 XLSX、CSV 等格式
对于EnterpriseWeb 应用程序而言,实现电子表格导出功能是一个常见的需求,然而手动生成和交付这些文件的过程往往会引入相当大的技术复杂性。 开发人员必须经常了解 MemoryStream 管理的细微差别,并配置精确的 HTTP 内容处置标头,以确保浏览器行为的一致性并防止数据损坏。
本文将逐一介绍如何使用IronXL库在ASP.NET C# MVC控制器中创建和下载Excel文件所需的一切。 我们将介绍如何将数据导出为XLSX格式的 Excel 文件、如何流式传输CSV文件、如何转换上传文件以便重新导出,以及如何将下载的文件返回到浏览器,所有这些操作都无需安装 Microsoft Office 或依赖 Excel Interop。安装IronXL NuGet包并开始免费试用,即可跟随源代码示例进行学习。
如何从控制器创建和下载 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);
}
}
Imports IronXL
Imports Microsoft.AspNetCore.Mvc
Public Class ReportController
Inherits Controller
' Export employee data as a downloadable Excel file
Public Function DownloadExcel() As IActionResult
' Create a new workbook and worksheet
Dim workbook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim 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
Dim stream = workbook.ToStream()
Dim filename As String = "Employees.xlsx"
Dim content = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
' Return file to the browser with content disposition attachment
Return File(stream, content, filename)
End Function
End Class
输出 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);
}
}
Imports IronXL
Imports Microsoft.AspNetCore.Mvc
Public Class DataExportController
Inherits Controller
' Export database records to an xlsx file for download
Public Function ExportDatabaseReport() As IActionResult
' Simulate a database query returning order records
Dim orders = New() {
New With {.OrderId = 1001, .Customer = "Acme Corp", .Total = 4500.0D},
New With {.OrderId = 1002, .Customer = "Globex Inc", .Total = 12300.5D},
New With {.OrderId = 1003, .Customer = "Initech LLC", .Total = 890.75D}
}
Dim workbook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim 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 i As Integer = 0 To orders.Length - 1
Dim row As Integer = i + 2
worksheet($"A{row}").Value = orders(i).OrderId
worksheet($"B{row}").Value = orders(i).Customer
worksheet($"C{row}").Value = orders(i).Total
Next
Dim stream = workbook.ToStream()
Dim filename As String = $"OrderReport-{DateTime.Now:yyyyMMdd}.xlsx"
Return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", filename)
End Function
End Class
输出

在生产环境中,订单数组将来自 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 aCSVfile 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 toCSVstream 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 aCSVfile 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 toCSVstream instead of XLSX
var stream = workbook.ToCsvStream();
string filename = "Products.csv";
return File(stream, "text/csv", filename);
}
}
Imports IronXL
Imports Microsoft.AspNetCore.Mvc
Public Class CsvController
Inherits Controller
' Export data as a CSV file download
Public Function ExportCsv() As IActionResult
Dim workbook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim 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
Dim stream = workbook.ToCsvStream()
Dim filename As String = "Products.csv"
Return File(stream, "text/csv", filename)
End Function
End Class
输出CSV文件

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 asXLSXregardless 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 asXLSXregardless 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);
}
Imports Microsoft.AspNetCore.Http
Imports Microsoft.AspNetCore.Mvc
Imports System.IO
Public Function ConvertUpload(upload As IFormFile) As IActionResult
Using memoryStream As New MemoryStream()
upload.CopyTo(memoryStream)
memoryStream.Position = 0
' Load uploaded Excel file from the stream
Dim workbook = WorkBook.Load(memoryStream)
' Re-export as XLSX regardless of the original file extension or file type
Dim stream = workbook.ToXlsxStream()
Dim filename As String = Path.GetFileNameWithoutExtension(upload.FileName) & ".xlsx"
Return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", filename)
End Using
End Function
输出:将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()| Enterprise系统集成 | |JSON|.json|SaveAsJson()| Web API 响应和数据交换 | |HTML|.html|ExportToHtml()| 网页上显示电子表格数据 |
每个流方法都会返回一个 MemoryStream,该 MemoryStream 可以直接插入ASP.NET Core 的 File() 返回辅助函数。 在某些情况下,例如保存到 blob 数据库或附加到电子邮件响应流时,byte[] 更方便,也可以使用字节数组替代方案 (ToByteArray())。 安装IronXL NuGet包后,所有这些方法都可以立即使用。 有关每种导出格式的完整说明,请参阅导出到 Excel 文档。
无论目标是为业务分析师下载XLSX格式的文件,为数据工程师导出CSV文件,还是为Enterprise集成生成 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 标头管理等复杂任务来改进流程,使开发人员能够专注于核心功能而不是技术细节。




