为.NET Core构建 Excel API:创建、读取和导出 XLSX 文件
使用IronXL为.NET Core构建 Excel API 非常简单。 安装该软件包,创建一个 WorkBook,填充单元格,然后直接返回流——无需 Microsoft Office。
Install-Package IronXL.Excel
IronXL完全使用托管的.NET代码处理 XLSX 创建、数据导入、多格式导出和单元格样式设置。 它可以运行在 Windows、Linux 和 macOS 上,因此对于任何需要以编程方式支持 Excel 的ASP.NET Core API 来说,它都是一个实用的选择。
如何在.NET Core项目中安装IronXL ?
通过NuGet程序包管理器控制台将IronXL添加到任何.NET 10 项目:
Install-Package IronXL.Excel
或者通过 Visual Studio NuGet UI 搜索IronXL进行安装。 NuGet 上的包名称是IronXl.Excel 。
安装完成后,将 using IronXL; 添加到任何创建或读取工作簿的文件中。 IronXL完全独立,无需 Office 互操作库、COM 注册或安装 Microsoft Excel,主机上即可运行。
IronXL 的目标平台是.NET Standard 2.0 及更高版本,这意味着同一个库可以用于.NET Core、 .NET 5/6/7/8/9/10 和.NET Framework项目。 IronXL文档详细介绍了所有支持的环境。
如何在.NET Core中以编程方式创建Excel文件?
使用 IronXL 直观的 API,只需几行代码即可从头开始创建 Excel 文档。 该库通过清晰的对象模型,提供对工作簿、工作表、单元格样式和公式的完全控制。
以下是一个控制器操作,它创建一个包含格式化数据的新 Excel 工作簿,演示工作表管理,并应用单元格样式:
using IronXL;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/[controller]")]
public class ExcelController : ControllerBase
{
[HttpGet("create-report")]
public IActionResult CreateSalesReport()
{
// Create a new Excel workbook in XLSX format
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("Sales Data");
// Set header labels in the first row
worksheet["A1"].Value = "Product";
worksheet["B1"].Value = "Q1 Sales";
worksheet["C1"].Value = "Q2 Sales";
worksheet["D1"].Value = "Total";
// Bold headers and apply a blue background with white text
worksheet["A1:D1"].Style.Font.Bold = true;
worksheet["A1:D1"].Style.SetBackgroundColor("#4472C4");
worksheet["A1:D1"].Style.Font.SetColor("#FFFFFF");
// Add data rows
worksheet["A2"].Value = "Widget Pro";
worksheet["B2"].Value = 15000;
worksheet["C2"].Value = 18500;
worksheet["D2"].Formula = "=B2+C2";
worksheet["A3"].Value = "Gadget Plus";
worksheet["B3"].Value = 22000;
worksheet["C3"].Value = 24000;
worksheet["D3"].Formula = "=B3+C3";
// Apply currency number format to sales columns
worksheet["B2:D3"].Style.Format = "$#,##0";
// Stream the XLSX file back to the caller
var stream = workbook.ToStream();
return File(
stream,
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"SalesReport.xlsx");
}
}
using IronXL;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/[controller]")]
public class ExcelController : ControllerBase
{
[HttpGet("create-report")]
public IActionResult CreateSalesReport()
{
// Create a new Excel workbook in XLSX format
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet worksheet = workbook.CreateWorkSheet("Sales Data");
// Set header labels in the first row
worksheet["A1"].Value = "Product";
worksheet["B1"].Value = "Q1 Sales";
worksheet["C1"].Value = "Q2 Sales";
worksheet["D1"].Value = "Total";
// Bold headers and apply a blue background with white text
worksheet["A1:D1"].Style.Font.Bold = true;
worksheet["A1:D1"].Style.SetBackgroundColor("#4472C4");
worksheet["A1:D1"].Style.Font.SetColor("#FFFFFF");
// Add data rows
worksheet["A2"].Value = "Widget Pro";
worksheet["B2"].Value = 15000;
worksheet["C2"].Value = 18500;
worksheet["D2"].Formula = "=B2+C2";
worksheet["A3"].Value = "Gadget Plus";
worksheet["B3"].Value = 22000;
worksheet["C3"].Value = 24000;
worksheet["D3"].Formula = "=B3+C3";
// Apply currency number format to sales columns
worksheet["B2:D3"].Style.Format = "$#,##0";
// Stream the XLSX file back to the caller
var stream = workbook.ToStream();
return File(
stream,
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"SalesReport.xlsx");
}
}
Imports IronXL
Imports Microsoft.AspNetCore.Mvc
<ApiController>
<Route("api/[controller]")>
Public Class ExcelController
Inherits ControllerBase
<HttpGet("create-report")>
Public Function CreateSalesReport() As IActionResult
' Create a new Excel workbook in XLSX format
Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim worksheet As WorkSheet = workbook.CreateWorkSheet("Sales Data")
' Set header labels in the first row
worksheet("A1").Value = "Product"
worksheet("B1").Value = "Q1 Sales"
worksheet("C1").Value = "Q2 Sales"
worksheet("D1").Value = "Total"
' Bold headers and apply a blue background with white text
worksheet("A1:D1").Style.Font.Bold = True
worksheet("A1:D1").Style.SetBackgroundColor("#4472C4")
worksheet("A1:D1").Style.Font.SetColor("#FFFFFF")
' Add data rows
worksheet("A2").Value = "Widget Pro"
worksheet("B2").Value = 15000
worksheet("C2").Value = 18500
worksheet("D2").Formula = "=B2+C2"
worksheet("A3").Value = "Gadget Plus"
worksheet("B3").Value = 22000
worksheet("C3").Value = 24000
worksheet("D3").Formula = "=B3+C3"
' Apply currency number format to sales columns
worksheet("B2:D3").Style.Format = "$#,##0"
' Stream the XLSX file back to the caller
Dim stream = workbook.ToStream()
Return File(
stream,
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"SalesReport.xlsx")
End Function
End Class
输出 Excel 文件
构建 .NET Core 的 Excel API:创建、读取和导出 XLSX 文件:图 1 - 由 .NET Core API 生成的 Excel 文件
WorkBook.Create() 同时支持 XLSX 和 XLS 格式。 CreateWorkSheet() 方法会添加一个命名工作表,您可以在其中填充单元格值、应用 Excel 公式进行计算,并通过单元格区域控制布局。 IronXL 的计算引擎会在工作簿数据更改时自动评估公式,包括支持在更复杂的数据分析场景中使用的数组公式。
单元格样式远不止粗体和颜色。 单元格格式 API允许您设置数字格式、边框、对齐方式、字体大小等等——所有这些都无需触及 COM 层。 这样一来,即使没有显示上下文,也可以安全地在容器化的 Linux 环境中运行。
如何向工作簿中添加多个工作表?
一个工作簿可以容纳任意数量的工作表。 请致电 workbook.CreateWorkSheet("SheetName") 获取所需标签页。 工作表可通过名称 workbook.GetWorkSheet("SheetName") 或索引 workbook.WorkSheets[0] 稍后访问。
这种模式在生成汇总加明细报告时非常有用:一个工作表保存汇总总数,而子工作表保存原始交易行。 工作表管理文档详细介绍了如何在运行时重命名、重新排序和删除工作表。
在 Web API 中读取 Excel 数据的最佳方法是什么?
对于任何处理电子表格内容的 Web 应用程序来说,从用户上传的 Excel 文件导入数据都至关重要。 IronXL可以直接读取 Excel 电子表格——从流中加载、遍历行,并从每个单元格中提取键入的值。
[HttpPost("import")]
public IActionResult ImportExcelData(IFormFile file)
{
if (file == null || file.Length == 0)
return BadRequest("No file uploaded");
using var stream = file.OpenReadStream();
// Load the workbook directly from the upload stream
WorkBook workbook = WorkBook.Load(stream);
WorkSheet worksheet = workbook.DefaultWorkSheet;
var records = new List<Dictionary<string, object>>();
// Start at row 2 to skip the header row
for (int row = 2; row <= worksheet.RowCount; row++)
{
var record = new Dictionary<string, object>
{
["Product"] = worksheet[$"A{row}"].StringValue,
["Sales"] = worksheet[$"B{row}"].DecimalValue,
["Date"] = worksheet[$"C{row}"].DateTimeValue
};
records.Add(record);
}
return Ok(new {
message = "Import successful",
recordCount = records.Count,
data = records
});
}
[HttpPost("import")]
public IActionResult ImportExcelData(IFormFile file)
{
if (file == null || file.Length == 0)
return BadRequest("No file uploaded");
using var stream = file.OpenReadStream();
// Load the workbook directly from the upload stream
WorkBook workbook = WorkBook.Load(stream);
WorkSheet worksheet = workbook.DefaultWorkSheet;
var records = new List<Dictionary<string, object>>();
// Start at row 2 to skip the header row
for (int row = 2; row <= worksheet.RowCount; row++)
{
var record = new Dictionary<string, object>
{
["Product"] = worksheet[$"A{row}"].StringValue,
["Sales"] = worksheet[$"B{row}"].DecimalValue,
["Date"] = worksheet[$"C{row}"].DateTimeValue
};
records.Add(record);
}
return Ok(new {
message = "Import successful",
recordCount = records.Count,
data = records
});
}
Imports Microsoft.AspNetCore.Mvc
Imports System.Collections.Generic
Imports IronXL
<HttpPost("import")>
Public Function ImportExcelData(file As IFormFile) As IActionResult
If file Is Nothing OrElse file.Length = 0 Then
Return BadRequest("No file uploaded")
End If
Using stream = file.OpenReadStream()
' Load the workbook directly from the upload stream
Dim workbook As WorkBook = WorkBook.Load(stream)
Dim worksheet As WorkSheet = workbook.DefaultWorkSheet
Dim records As New List(Of Dictionary(Of String, Object))()
' Start at row 2 to skip the header row
For row As Integer = 2 To worksheet.RowCount
Dim record As New Dictionary(Of String, Object) From {
{"Product", worksheet($"A{row}").StringValue},
{"Sales", worksheet($"B{row}").DecimalValue},
{"Date", worksheet($"C{row}").DateTimeValue}
}
records.Add(record)
Next
Return Ok(New With {
.message = "Import successful",
.recordCount = records.Count,
.data = records
})
End Using
End Function
输出
构建适用于 .NET Core 的 Excel API:创建、读取和导出 XLSX 文件:图 2 - 显示成功导入的 Excel 数据的输出
WorkBook.Load() 从流、文件路径或字节数组打开 Excel 文件。 可以通过 worksheet["A1"] 索引器语法或通过迭代命名的单元格范围来访问单元格。 IronXL 会自动处理数据验证,并公开类型安全的访问器 -- IntValue, DecimalValue, DateTimeValue, StringValue -- 因此,使用代码保持简洁和可预测。
如何筛选和排序导入的数据?
加载工作簿后,对任何 .SortAscending() 或 .SortDescending() 对象调用 Range 对象对行进行排序。 对于筛选,可以遍历单元格并在线评估条件,或者将数据传输到 LINQ 集合中进行进一步处理。 排序和筛选指南通过实际示例演示了这两种方法。
正在处理大型上传文件? IronXL只读取访问过的单元格,因此无需在查询特定列之前将整个几兆字节的文件加载到内存中。 这种延迟访问方式即使在处理数万行的工作簿时也能保持内存消耗稳定。
如何将Excel数据导出为不同格式?
应用程序通常需要提供多种输出格式的电子表格。 IronXL支持通过一次方法调用导出为 XLSX、XLS、CSV、JSON 和 HTML 格式,无需外部转换工具。
[HttpGet("export/{format}")]
public IActionResult ExportData(string format)
{
// Load a pre-designed template workbook
WorkBook workbook = WorkBook.Load("template.xlsx");
return format.ToLower() switch
{
"xlsx" => File(
workbook.ToStream(),
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"export.xlsx"),
"csv" => File(
workbook.ToStream(FileFormat.CSV),
"text/csv",
"export.csv"),
"json" => Ok(workbook.ToJson()),
_ => BadRequest("Unsupported format")
};
}
[HttpGet("export/{format}")]
public IActionResult ExportData(string format)
{
// Load a pre-designed template workbook
WorkBook workbook = WorkBook.Load("template.xlsx");
return format.ToLower() switch
{
"xlsx" => File(
workbook.ToStream(),
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"export.xlsx"),
"csv" => File(
workbook.ToStream(FileFormat.CSV),
"text/csv",
"export.csv"),
"json" => Ok(workbook.ToJson()),
_ => BadRequest("Unsupported format")
};
}
Imports Microsoft.AspNetCore.Mvc
<HttpGet("export/{format}")>
Public Function ExportData(format As String) As IActionResult
' Load a pre-designed template workbook
Dim workbook As WorkBook = WorkBook.Load("template.xlsx")
Select Case format.ToLower()
Case "xlsx"
Return File(workbook.ToStream(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "export.xlsx")
Case "csv"
Return File(workbook.ToStream(FileFormat.CSV), "text/csv", "export.csv")
Case "json"
Return Ok(workbook.ToJson())
Case Else
Return BadRequest("Unsupported format")
End Select
End Function
使用带有预定义布局的 Excel 模板可以加快报告生成速度。 加载预先设计好的工作簿,将动态数据填充到已命名的单元格或区域中,然后流式传输结果。 这种方法适用于销售报告、发票和合规文件,在这些文件中,格式的一致性比灵活性更重要。
IronXL 的跨平台支持意味着这些文件操作在 Windows、Linux 和 macOS 上都能以相同的方式运行,使其适用于.NET Core容器化部署。 请阅读IronXL跨平台指南了解更多信息。
如何使用.NET Core API 导出为 CSV 文件?
调用 workbook.ToStream(FileFormat.CSV) 并以 text/csv 内容类型返回,如上所示。 对于多工作表工作簿,可以通过访问 workbook.WorkSheets[index] 并调用工作表对象上的 .ToStream(FileFormat.CSV) 来独立导出每个工作表。 CSV 导出文档涵盖了分隔符的处理、编码和日期格式选项。
如何应用条件格式和数据条?
除了基本的单元格样式外, IronXL还支持条件格式规则——以绿色突出显示高于阈值的单元格,以红色标记负值,或应用渐变数据条,使趋势在电子表格中立即可见,而无需在单独的工具中进行任何后处理。
条件格式在财务仪表盘和 KPI 报告中尤其有价值,因为读者需要一眼就能发现异常值。 与其依赖收件人在下载后自行应用格式,不如将格式规则嵌入到 XLSX 文件中,并在任何版本的 Microsoft Excel 或兼容的查看器中打开文件时自动进行评估。
条件格式是通过工作表的 ConditionalFormatting 属性设置的。 规则应用于指定的单元格区域,并支持多种条件类型:单元格值比较、基于公式的规则、从低到高对值进行分级的颜色标度,以及功能类似于单元格内条形图的数据条叠加层。 Open XML 规范定义了IronXL写入 XLSX 文件的基本规则结构。
有关应用颜色标度、图标集和数据条的完整参考,请参阅IronXL文档中的条件格式教程。
如何保护Excel文件和工作表?
分发包含敏感数据的报告需要一层访问控制。 IronXL同时支持工作簿级别的密码保护和工作表级别的密码保护:
-工作簿密码:在调用 .SaveAs() 加密 XLSX 文件之前,请先设置 workbook.Password = "secret"。收件人必须输入密码才能在 Excel 中打开该文件。
-工作表保护:调用 worksheet.ProtectSheet("password") 可锁定单元格编辑,同时仍允许查看工作表。 可以使用 AllowEditRange API 解锁特定范围以进行数据输入。
-只读分发:对于永远不应该被编辑的文档,将工作表保护与文件级加密结合起来。
受密码保护的 XLSX 文件默认使用 AES-128 加密,这是 Excel 原生采用的标准。 这意味着通过IronXL保护的文件与 Excel 内置的打开文件提示完全兼容——接收方无需使用特殊查看器。
这些安全特性是对标准.NET Core安全模型的补充,在构建财务或人力资源报告端点时尤其有用。 文件保护文档提供了完整的 API 参考。
如何在.NET中使用Excel公式?
IronXL 的内置计算引擎会在运行时计算标准 Excel 公式,因此 API 可以直接返回计算值,无需先保存到磁盘并在 Excel 中重新打开。将公式字符串分配给任何单元格的 .Formula 属性:
// Sum a column and place the result in a footer row
worksheet[$"B{lastRow}"].Formula = $"=SUM(B2:B{lastRow - 1})";
// Calculate an average across a range
worksheet[$"C{lastRow}"].Formula = $"=AVERAGE(C2:C{lastRow - 1})";
// Retrieve the computed value immediately
decimal total = worksheet[$"B{lastRow}"].DecimalValue;
// Sum a column and place the result in a footer row
worksheet[$"B{lastRow}"].Formula = $"=SUM(B2:B{lastRow - 1})";
// Calculate an average across a range
worksheet[$"C{lastRow}"].Formula = $"=AVERAGE(C2:C{lastRow - 1})";
// Retrieve the computed value immediately
decimal total = worksheet[$"B{lastRow}"].DecimalValue;
' Sum a column and place the result in a footer row
worksheet($"B{lastRow}").Formula = $"=SUM(B2:B{lastRow - 1})"
' Calculate an average across a range
worksheet($"C{lastRow}").Formula = $"=AVERAGE(C2:C{lastRow - 1})"
' Retrieve the computed value immediately
Dim total As Decimal = worksheet($"B{lastRow}").DecimalValue
IronXL支持大多数标准 Excel 函数,包括数学、统计、文本、日期和查找类别。 对于高级场景,还支持数组公式(Ctrl+Shift+Enter 语义)。 由于公式计算是在.NET进程内部进行的,因此无需与外部计算服务进行往返通信——公式分配后即可立即获得结果,即使计算数千行数据,也能保持 API 响应时间的可预测性。 公式支持参考列表列出了所有支持的函数。
下一步计划是什么?
使用IronXL构建 Excel API 可以为.NET Core应用程序提供强大的电子表格处理能力。 从创建包含格式化数据和计算公式的 XLSX 文件,到导入用户上传内容和以多种格式导出数据, IronXL以跨平台、无需 Office 的方式处理程序化电子表格操作的方方面面。
探索以下资源,了解更多信息:
IronXL产品页面——功能概述和入门指南
- IronXL文档——完整的 API 参考和操作指南文章 -使用 C# 创建 Excel 文件——工作簿和工作表创建的详细教程 -使用 C# 读取 Excel 文件——加载、解析和提取数据 -将 Excel 导出为 CSV -- 导出带有编码和分隔符选项的 CSV 文件 -单元格格式设置 API -- 字体、颜色、边框和数字格式 -条件格式——规则、数据条、颜色标度 -公式支持-- 支持的 Excel 函数参考 文件保护——工作簿和工作表密码API
- NuGet包-- 当前版本和版本历史记录
常见问题解答
什么是 IronXL?
IronXL是一个.NET Excel 库,它允许开发人员使用 C# 以编程方式创建、读取和导出 Excel 文件,而无需 Microsoft Office 或 COM 互操作。
如何在不使用 Office 的情况下,使用.NET Core创建 Excel 文件?
调用 WorkBook.Create(ExcelFileFormat.XLSX) 创建一个新工作簿,使用 CreateWorkSheet() 添加工作表,使用 worksheet['A1'].Value 语法填充单元格,并使用 workbook.ToStream() 流式传输结果。
如何在ASP.NET Core中读取上传的 Excel 文件?
将 IFormFile 流传递给 WorkBook.Load(stream),访问 DefaultWorkSheet,并使用 worksheet.RowCount 遍历行。诸如 DecimalValue 和 DateTimeValue 之类的类型化访问器从每个单元格中提取强类型数据。
IronXL能否将Excel数据导出为CSV或JSON格式?
是的。调用 workbook.ToStream(FileFormat.CSV) 可获得 CSV 输出,调用 workbook.ToJson() 可获得工作簿数据的 JSON 表示形式。
IronXL能在 Linux 和 macOS 上运行吗?
是的。IronXL 面向IronXL .NET Standard 2.0 及更高版本,可在 Windows、Linux 和 macOS 上运行,无需安装任何 Microsoft Office 或 COM 层。
如何使用IronXL对 Excel 文件进行密码保护?
在调用 SaveAs() 之前,请将 workbook.Password 设置为字符串。要实现工作表级别的保护,请调用 worksheet.ProtectSheet('password') 以防止编辑单元格,同时允许读取工作表。

