C# 中读取 Excel 文件的最佳方法 | IronXL分步指南
对于.NET开发人员来说,在 C# 中读取 Excel 文件是一个常见的挑战。 无论您是构建数据导入管道、报表工具还是批处理系统,正确解析电子表格数据都至关重要。 IronXL是一个.NET库,它无需服务器上的 Microsoft Office 或 COM 互操作 即可处理 XLSX、XLS 和 CSV 文件。 本指南将带您了解完整的流程——从安装到高级查询——以便您可以为您的项目选择正确的方法。
在 C# 中读取 Excel 文件的最佳方法是什么?
最佳方法是使用专用的、独立于 Office 的库,例如IronXL。 像 Microsoft.Office.Interop.Excel 这样的传统方法在安装了 Excel 的机器上可以正常工作,但在服务器或容器环境中却很脆弱,因为它们会在后台启动一个 COM 进程。 OpenXML SDK 是免费的,并且对服务器安全,但它公开了一个底层 XML 模型,日常任务需要大量的样板代码。
IronXL 的性能介于这两种极端情况之间。 该 API 反映了开发者对电子表格的固有认知——工作簿包含工作表,工作表包含单元格,单元格包含输入的值。 该库内部处理格式检测、公式计算和编码,因此您可以将时间花在业务逻辑上,而不是解析细节上。
| 方法 | 需要 Office 吗? | 服务器安全吗? | 简化应用程序接口 | 格式支持 |
|---|---|---|---|---|
| COM 互操作 | 是 | 无 | 低的 | XLSX、XLS |
| OpenXML SDK | 无 | 是 | 低的 | 仅限 XLSX |
| IronXL | 无 | 是 | 高的 | XLSX、XLS、CSV |
IronXL Excel 读取文档涵盖了完整的 API 接口。 目前,以下各节展示了您在每个项目中都会用到的核心模式。
如何在.NET项目中安装IronXL ?
使用NuGet包管理器安装只需不到一分钟。 在项目目录中打开终端并运行:
dotnet add package IronXL.Excel
dotnet add package IronXL.Excel
或者,使用 Visual Studio 包管理器控制台:
Install-Package IronXL.Excel
Install-Package IronXL.Excel
安装完成后,将 using IronXL; 指令添加到任何需要访问电子表格的文件。 该库面向.NET 10、 .NET 8、 .NET 6、 .NET Framework 4.6.2 和.NET Standard 2.0,因此无需升级运行时即可集成到现有项目中。有关特定平台的说明和NuGet包详细信息,请参阅IronXL安装指南。
无需额外的运行时组件、注册表项或 Office 许可证。 NuGet包包含了库所需的一切。
验证安装
添加软件包后,构建一次项目以确认引用解析正确。 如果您看到 CS0246 错误,请检查 IronXL 类型是否存在 using IronXL; 指令,以及您的 .csproj 中的目标框架是否为受支持的版本之一。 IronXL兼容性矩阵列出了所有已确认的运行时目标。
如何加载和读取Excel工作簿?
加载工作簿只需要调用一个方法。 WorkBook.Load 接受一个文件路径,并返回一个 WorkBook 对象,该对象表示内存中的整个文件。
using IronXL;
// Load any supported format -- XLSX、XLS, or CSV
WorkBook workbook = WorkBook.Load("financial_report.xlsx");
// Access the first worksheet by position
WorkSheet worksheet = workbook.WorkSheets[0];
// Or retrieve a named worksheet
WorkSheet expenses = workbook.GetWorkSheet("Expenses");
Console.WriteLine($"Sheets loaded: {workbook.WorkSheets.Count}");
Console.WriteLine($"Default sheet rows: {worksheet.RowCount}");
using IronXL;
// Load any supported format -- XLSX、XLS, or CSV
WorkBook workbook = WorkBook.Load("financial_report.xlsx");
// Access the first worksheet by position
WorkSheet worksheet = workbook.WorkSheets[0];
// Or retrieve a named worksheet
WorkSheet expenses = workbook.GetWorkSheet("Expenses");
Console.WriteLine($"Sheets loaded: {workbook.WorkSheets.Count}");
Console.WriteLine($"Default sheet rows: {worksheet.RowCount}");
Imports IronXL
' Load any supported format -- XLSX, XLS, or CSV
Dim workbook As WorkBook = WorkBook.Load("financial_report.xlsx")
' Access the first worksheet by position
Dim worksheet As WorkSheet = workbook.WorkSheets(0)
' Or retrieve a named worksheet
Dim expenses As WorkSheet = workbook.GetWorkSheet("Expenses")
Console.WriteLine($"Sheets loaded: {workbook.WorkSheets.Count}")
Console.WriteLine($"Default sheet rows: {worksheet.RowCount}")
。
WorkBook 对象可访问所有工作表数据。 每个 WorkSheet 实例都映射到文件中的一个制表符。通过索引 (WorkSheets[0]) 访问单页文件是可靠的; 当文件包含多个名称已知的标签页时,按名称访问更安全。
IronXL会在读取单元格时自动计算公式。 如果单元格 B10 包含 =SUM(B2:B9),则读取 sheet["B10"].DecimalValue 返回计算出的总计,而不是公式字符串。 有关工作簿加载选项的更多详细信息,请参阅加载电子表格操作指南。
同时处理多个工作表
当工作簿包含多个工作表时,可以使用 workbook.WorkSheets 枚举它们,并依次处理每个工作表。 这对于按月、部门或地区将数据拆分到不同标签页的文件非常有用。 WorkSheet.Name 属性会将选项卡标签作为字符串提供给你,你可以将其用于条件处理或日志记录。
如何读取工作表中的单元格值?
IronXL为每个单元格提供强类型属性,因此您可以直接将值读取到正确的.NET类型中,而无需手动解析。
using IronXL;
WorkBook workbook = WorkBook.Load("Products.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;
// Address-based access with typed properties
string productName = sheet["A2"].StringValue;
int quantity = sheet["B2"].IntValue;
decimal price = sheet["C2"].DecimalValue;
bool inStock = sheet["D2"].BoolValue;
// Check for empty cells before processing
var statusCell = sheet["E2"];
if (statusCell.Value != null && statusCell.StringValue.Length > 0)
{
Console.WriteLine($"Status: {statusCell.StringValue}");
}
// Row/column index access (zero-based)
var firstDataCell = sheet.Rows[1].Columns[0];
Console.WriteLine($"Product: {productName}, Qty: {quantity}, Price: {price:C}");
using IronXL;
WorkBook workbook = WorkBook.Load("Products.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;
// Address-based access with typed properties
string productName = sheet["A2"].StringValue;
int quantity = sheet["B2"].IntValue;
decimal price = sheet["C2"].DecimalValue;
bool inStock = sheet["D2"].BoolValue;
// Check for empty cells before processing
var statusCell = sheet["E2"];
if (statusCell.Value != null && statusCell.StringValue.Length > 0)
{
Console.WriteLine($"Status: {statusCell.StringValue}");
}
// Row/column index access (zero-based)
var firstDataCell = sheet.Rows[1].Columns[0];
Console.WriteLine($"Product: {productName}, Qty: {quantity}, Price: {price:C}");
Imports IronXL
Dim workbook As WorkBook = WorkBook.Load("Products.xlsx")
Dim sheet As WorkSheet = workbook.DefaultWorkSheet
' Address-based access with typed properties
Dim productName As String = sheet("A2").StringValue
Dim quantity As Integer = sheet("B2").IntValue
Dim price As Decimal = sheet("C2").DecimalValue
Dim inStock As Boolean = sheet("D2").BoolValue
' Check for empty cells before processing
Dim statusCell = sheet("E2")
If statusCell.Value IsNot Nothing AndAlso statusCell.StringValue.Length > 0 Then
Console.WriteLine($"Status: {statusCell.StringValue}")
End If
' Row/column index access (zero-based)
Dim firstDataCell = sheet.Rows(1).Columns(0)
Console.WriteLine($"Product: {productName}, Qty: {quantity}, Price: {price:C}")
。
sheet["A2"] 语法使用标准的 Excel 表示法。 列字母不区分大小写,行号从 1 开始,与 Excel 标记单元格的方式一致。 单元格值读取文档显示了其他类型访问器,包括 DateTimeValue,用于格式化为日期的单元格。
当单元格包含以文本形式存储的数字时(这是导出电子表格中常见的数据质量问题),StringValue 会按原样返回文本,而 DecimalValue 会尝试解析,并在解析失败时返回 0。 在生产代码中将意外数据作为类型化值处理之前,务必先对其进行验证。
处理日期和布尔单元格
Excel 中的日期单元格在内部以序列号的形式存储。 IronXL 公开 DateTimeValue,以便将它们转换为 .NET DateTime 对象,而无需手动计算。 对于包含 TRUE 或 FALSE 的单元格,BoolValue 返回正确的布尔值,无需进行字符串比较。 这些类型化访问器消除了一类在通过通用文本解析器读取电子表格时经常出现的数据类型错误。
如何遍历行和单元格?
遍历数据集需要一个范围或行集合。 IronXL支持这两种方法,您可以将它们结合起来以匹配数据的形状。
using IronXL;
WorkBook workbook = WorkBook.Load("financial_report.xlsx");
WorkSheet sheet = workbook.WorkSheets[0];
// Iterate a cell range -- skips header row
foreach (var cell in sheet["A2:D100"])
{
Console.WriteLine($"{cell.AddressString}: {cell.Text}");
}
// Row-by-row with column access
for (int rowIndex = 1; rowIndex < sheet.RowCount; rowIndex++)
{
var row = sheet.Rows[rowIndex];
var values = new System.Text.StringBuilder();
foreach (var cell in row)
{
if (cell.Value != null)
values.Append($"{cell.StringValue}\t");
}
Console.WriteLine(values.ToString().TrimEnd());
}
using IronXL;
WorkBook workbook = WorkBook.Load("financial_report.xlsx");
WorkSheet sheet = workbook.WorkSheets[0];
// Iterate a cell range -- skips header row
foreach (var cell in sheet["A2:D100"])
{
Console.WriteLine($"{cell.AddressString}: {cell.Text}");
}
// Row-by-row with column access
for (int rowIndex = 1; rowIndex < sheet.RowCount; rowIndex++)
{
var row = sheet.Rows[rowIndex];
var values = new System.Text.StringBuilder();
foreach (var cell in row)
{
if (cell.Value != null)
values.Append($"{cell.StringValue}\t");
}
Console.WriteLine(values.ToString().TrimEnd());
}
Imports IronXL
Imports System.Text
Dim workbook As WorkBook = WorkBook.Load("financial_report.xlsx")
Dim sheet As WorkSheet = workbook.WorkSheets(0)
' Iterate a cell range -- skips header row
For Each cell In sheet("A2:D100")
Console.WriteLine($"{cell.AddressString}: {cell.Text}")
Next
' Row-by-row with column access
For rowIndex As Integer = 1 To sheet.RowCount - 1
Dim row = sheet.Rows(rowIndex)
Dim values As New StringBuilder()
For Each cell In row
If cell.Value IsNot Nothing Then
values.Append($"{cell.StringValue}" & vbTab)
End If
Next
Console.WriteLine(values.ToString().TrimEnd())
Next
。
范围字符串 "A2:D100" 创建一个扁平单元格集合。 该范围内的行按从上到下、从左到右的顺序处理。 此模式适用于导出到 List<t>、DataTable 或数据库。
sheet.RowCount 属性反映工作表中最后使用的行,因此当数据结束时循环会自动终止。 迭代 Excel 范围指南涵盖了其他迭代模式,包括列优先遍历。
跳过标题行
大多数电子表格都有一个标题行,用于描述列名称,而不是包含数据。 从第 2 行开始范围迭代(例如,"A2:D100"),或者从 rowIndex = 1 开始索引循环以跳过标题。 如果您使用 ToDataTable(true),IronXL 会自动处理标题检测并映射第一行的列名。
如何处理多种Excel格式?
IronXL会自动根据文件扩展名和文件头检测文件格式。 XLSX、XLS 和 CSV 文件的 API 完全相同,这意味着相同的解析代码无需条件逻辑即可应用于所有三种格式。
using IronXL;
// Load different formats with identical API
WorkBook xlsxBook = WorkBook.Load("Modern.xlsx");
WorkBook xlsBook = WorkBook.Load("Legacy.xls");
WorkBook csvBook = WorkBook.Load("Export.csv");
// Access worksheets identically across formats
WorkSheet sheet1 = xlsxBook.DefaultWorkSheet;
WorkSheet sheet2 = xlsBook.DefaultWorkSheet;
WorkSheet sheet3 = csvBook.DefaultWorkSheet;
// Cross-format conversion -- save XLSX as CSV, or CSV as XLSX
xlsxBook.SaveAs("converted_output.csv");
csvBook.SaveAs("structured_output.xlsx");
Console.WriteLine($"XLSX rows: {sheet1.RowCount}");
Console.WriteLine($"XLS rows: {sheet2.RowCount}");
Console.WriteLine($"CSV rows: {sheet3.RowCount}");
using IronXL;
// Load different formats with identical API
WorkBook xlsxBook = WorkBook.Load("Modern.xlsx");
WorkBook xlsBook = WorkBook.Load("Legacy.xls");
WorkBook csvBook = WorkBook.Load("Export.csv");
// Access worksheets identically across formats
WorkSheet sheet1 = xlsxBook.DefaultWorkSheet;
WorkSheet sheet2 = xlsBook.DefaultWorkSheet;
WorkSheet sheet3 = csvBook.DefaultWorkSheet;
// Cross-format conversion -- save XLSX as CSV, or CSV as XLSX
xlsxBook.SaveAs("converted_output.csv");
csvBook.SaveAs("structured_output.xlsx");
Console.WriteLine($"XLSX rows: {sheet1.RowCount}");
Console.WriteLine($"XLS rows: {sheet2.RowCount}");
Console.WriteLine($"CSV rows: {sheet3.RowCount}");
Imports IronXL
' Load different formats with identical API
Dim xlsxBook As WorkBook = WorkBook.Load("Modern.xlsx")
Dim xlsBook As WorkBook = WorkBook.Load("Legacy.xls")
Dim csvBook As WorkBook = WorkBook.Load("Export.csv")
' Access worksheets identically across formats
Dim sheet1 As WorkSheet = xlsxBook.DefaultWorkSheet
Dim sheet2 As WorkSheet = xlsBook.DefaultWorkSheet
Dim sheet3 As WorkSheet = csvBook.DefaultWorkSheet
' Cross-format conversion -- save XLSX as CSV, or CSV as XLSX
xlsxBook.SaveAs("converted_output.csv")
csvBook.SaveAs("structured_output.xlsx")
Console.WriteLine($"XLSX rows: {sheet1.RowCount}")
Console.WriteLine($"XLS rows: {sheet2.RowCount}")
Console.WriteLine($"CSV rows: {sheet3.RowCount}")
对于 CSV 文件, IronXL遵循 RFC 4180 约定,包括包含逗号的带引号字段、带引号的值中的换行符以及转义的双引号。 CSV 转 XLSX 转换指南涵盖了非标准 CSV 导出的分隔符自定义。
当您的应用程序必须从外部系统接收文件时,最佳实践是在加载之前检查文件扩展名并验证文件内容。 如果文件损坏或格式不受支持, IronXL会抛出一个描述性异常,您可以捕获该异常并将其显示给用户。
如何在 Excel 数据上运行高级查询?
除了逐个单元格读取之外, IronXL还提供了聚合函数和 LINQ 兼容性,可以将工作表范围转换为可查询的集合。
using IronXL;
using System.Linq;
WorkBook workbook = WorkBook.Load("Financials.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;
// Built-in aggregates -- no manual looping needed
decimal totalSales = sheet["B2:B50"].Sum();
decimal maxRevenue = sheet["C2:C50"].Max(c => c.DecimalValue);
decimal avgMargin = sheet["D2:D50"].Avg();
// LINQ filtering directly on a range
var highValueRows = sheet["C2:C50"]
.Where(c => c.DecimalValue > 1000)
.Select(c => new { c.AddressString, c.DecimalValue });
foreach (var row in highValueRows)
Console.WriteLine($"高的 value at {row.AddressString}: {row.DecimalValue:C}");
// Write a calculated result back to the sheet
sheet["E2"].Value = totalSales;
workbook.SaveAs("Financials_Updated.xlsx");
Console.WriteLine($"Total: {totalSales:C}, Max: {maxRevenue:C}, Avg: {avgMargin:C}");
using IronXL;
using System.Linq;
WorkBook workbook = WorkBook.Load("Financials.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;
// Built-in aggregates -- no manual looping needed
decimal totalSales = sheet["B2:B50"].Sum();
decimal maxRevenue = sheet["C2:C50"].Max(c => c.DecimalValue);
decimal avgMargin = sheet["D2:D50"].Avg();
// LINQ filtering directly on a range
var highValueRows = sheet["C2:C50"]
.Where(c => c.DecimalValue > 1000)
.Select(c => new { c.AddressString, c.DecimalValue });
foreach (var row in highValueRows)
Console.WriteLine($"高的 value at {row.AddressString}: {row.DecimalValue:C}");
// Write a calculated result back to the sheet
sheet["E2"].Value = totalSales;
workbook.SaveAs("Financials_Updated.xlsx");
Console.WriteLine($"Total: {totalSales:C}, Max: {maxRevenue:C}, Avg: {avgMargin:C}");
Imports IronXL
Imports System.Linq
Dim workbook As WorkBook = WorkBook.Load("Financials.xlsx")
Dim sheet As WorkSheet = workbook.DefaultWorkSheet
' Built-in aggregates -- no manual looping needed
Dim totalSales As Decimal = sheet("B2:B50").Sum()
Dim maxRevenue As Decimal = sheet("C2:C50").Max(Function(c) c.DecimalValue)
Dim avgMargin As Decimal = sheet("D2:D50").Avg()
' LINQ filtering directly on a range
Dim highValueRows = sheet("C2:C50") _
.Where(Function(c) c.DecimalValue > 1000) _
.Select(Function(c) New With {Key .AddressString = c.AddressString, Key .DecimalValue = c.DecimalValue})
For Each row In highValueRows
Console.WriteLine($"高的 value at {row.AddressString}: {row.DecimalValue:C}")
Next
' Write a calculated result back to the sheet
sheet("E2").Value = totalSales
workbook.SaveAs("Financials_Updated.xlsx")
Console.WriteLine($"Total: {totalSales:C}, Max: {maxRevenue:C}, Avg: {avgMargin:C}")
。
当您需要在将行导入数据库之前对其进行筛选,或者验证列中的所有值是否都满足阈值时,LINQ 兼容性非常有用。 该库在 LINQ 运行之前会评估公式,因此聚合查询始终对最终计算值进行操作,而不是对公式字符串进行操作。
IronXL的 LINQ 教程涵盖了连接工作表、按列分组以及将结果投影到强类型对象——这些模式可以消除数据管道代码中的大量样板代码。
如何将Excel数据导出到DataTable?
许多 .NET 应用程序将电子表格数据加载到 ADO.NET DataTable 中进行进一步处理或插入数据库。 IronXL提供了一种直接转换方法,无需手动进行列映射。
using IronXL;
using System.Data;
WorkBook workbook = WorkBook.Load("SalesData.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;
// Convert worksheet to DataTable -- first row becomes column headers
DataTable dataTable = sheet.ToDataTable(true);
Console.WriteLine($"Columns: {dataTable.Columns.Count}");
Console.WriteLine($"Rows: {dataTable.Rows.Count}");
// Iterate the DataTable normally
foreach (DataRow row in dataTable.Rows)
{
Console.WriteLine($"{row["ProductName"]} -- {row["Quantity"]} -- {row["Price"]}");
}
using IronXL;
using System.Data;
WorkBook workbook = WorkBook.Load("SalesData.xlsx");
WorkSheet sheet = workbook.DefaultWorkSheet;
// Convert worksheet to DataTable -- first row becomes column headers
DataTable dataTable = sheet.ToDataTable(true);
Console.WriteLine($"Columns: {dataTable.Columns.Count}");
Console.WriteLine($"Rows: {dataTable.Rows.Count}");
// Iterate the DataTable normally
foreach (DataRow row in dataTable.Rows)
{
Console.WriteLine($"{row["ProductName"]} -- {row["Quantity"]} -- {row["Price"]}");
}
Imports IronXL
Imports System.Data
Dim workbook As WorkBook = WorkBook.Load("SalesData.xlsx")
Dim sheet As WorkSheet = workbook.DefaultWorkSheet
' Convert worksheet to DataTable -- first row becomes column headers
Dim dataTable As DataTable = sheet.ToDataTable(True)
Console.WriteLine($"Columns: {dataTable.Columns.Count}")
Console.WriteLine($"Rows: {dataTable.Rows.Count}")
' Iterate the DataTable normally
For Each row As DataRow In dataTable.Rows
Console.WriteLine($"{row("ProductName")} -- {row("Quantity")} -- {row("Price")}")
Next
将 true 传递给 ToDataTable 会将工作表的第一行视为列标题。 生成的 DataTable 使用与标题文本匹配的字符串列名,使后续的 LINQ to DataSet 查询更易读。 DataTable 导出文档涵盖了空值处理和类型推断选项。
当下游代码已经期望 DataTable 时,这种模式特别有用——例如,当调用 SqlBulkCopy 将行插入 SQL Server 时。 您可以加载 XLSX 文件,将其转换为 DataTable,然后批量插入,而无需编写任何列映射样板代码。
| 手术 | API | 返回 |
|---|---|---|
| 加载文件 | WorkBook.Load(path) |
WorkBook |
| 按索引获取工作表 | workbook.WorkSheets[0] |
WorkSheet |
| 按名称获取工作表 | workbook.GetWorkSheet("name") |
WorkSheet |
| 读取字符串单元格 | sheet["A1"].StringValue |
字符串
|
| 读取十进制单元格 | sheet["B1"].DecimalValue |
decimal |
| 迭代范围 | foreach cell in sheet["A2:D100"] |
IEnumerable<Cell> |
| 对一定范围求和 | sheet["B2:B50"].Sum() |
decimal |
| 导出到数据表 | sheet.ToDataTable(true) |
DataTable |
有关完整的 API 列表,请参阅IronXL API 参考。 该参考文档涵盖了每个属性和方法,包括参数描述和返回类型详情。
下一步计划是什么?
只要有了合适的库,用 C# 读取 Excel 文件就非常简单。 IronXL消除了对 Office 的依赖,简化了 API 接口,并且使用相同的代码路径处理 XLSX、XLS 和 CSV 格式。 这里涵盖的模式——加载工作簿、读取键入的单元格值、迭代范围、运行聚合以及导出到 DataTable——涵盖了大多数现实世界的电子表格读取需求。
为了继续沿用这些模式:
- 阅读IronXL入门文档,了解项目设置指南和运行时要求。
- 探索有关写作、格式设置和图表生成的操作指南。
- 查看Excel 公式支持指南,了解IronXL会自动计算哪些 Excel 函数。
- 请查看IronXL许可页面,了解生产部署选项。
- 浏览IronXL博客,查看有关数据验证、数据透视表导出和密码保护文件处理的示例。
对于正在评估IronXL与其他库的团队来说, IronXL与 EPPlus 的比较以及IronXL与 NPOI 的比较涵盖了性能基准和 API 差异。 两项比较都包含了每个库中等效操作的代码示例。
如果您遇到来自旧系统的不寻常的电子表格结构,微软自己的Excel 文件格式规范是一个有用的参考。 ECMA-376 标准定义了 XLSX 文件遵循的 OOXML 格式。
在购买正式版许可证之前,您可以先申请IronXL免费试用许可证,在您自己的项目中测试完整的 API。
常见问题解答
用 C# 阅读 Excel 文件的最佳方法是什么?
在 C# 中读取 Excel 文件的最佳方法是使用专用的、独立于 Office 的库,例如IronXL。它无需 Microsoft Excel 或 COM Interop 即可处理 XLSX、XLS 和 CSV 格式,因此可以安全地用于服务器和容器环境。
使用IronXL需要安装 Microsoft Office 吗?
不IronXL是一个独立的.NET库,以NuGet包的形式分发。它不需要计算机上安装 Microsoft Office、Excel 或任何 COM 组件。
IronXL支持哪些 Excel 文件格式?
IronXL可以读取和写入 XLSX、XLS 和 CSV 文件。它能根据文件扩展名和内容头自动检测文件格式。
如何在.NET项目中安装IronXL ?
在终端中运行“dotnet add package IronXL.Excel”或在 Visual Studio 程序包管理器控制台中运行“Install-Package IronXL.Excel”。
IronXL能否将Excel数据导出为DataTable?
是的。WorkSheet.ToDataTable(true) 方法会将任何工作表转换为.NET DataTable,当传递 true 参数时,第一行将用作列标题。
IronXL是否支持对 Excel 数据进行 LINQ 查询?
是的。IronXLIronXL实现了 IEnumerable 接口,因此您可以直接在工作表区域上使用 LINQ 方法,例如 Where、Select、Sum、Max 和 Avg。
IronXL 如何处理 Excel 公式?
IronXL会在读取单元格值时自动计算公式。读取公式单元格中的 sheet["B10"].DecimalValue 会返回计算结果,而不是公式字符串。
IronXL支持哪些.NET版本?
IronXL支持.NET 10、 .NET 8、 .NET 6、 .NET Framework 4.6.2 和.NET Standard 2.0。


