跳至页脚内容
使用 IRONXL

C# 中读取 Excel 文件的最佳方法 | IronXL分步指南

对于.NET开发人员来说,在 C# 中读取 Excel 文件是一个常见的挑战。 无论您是构建数据导入管道、报表工具还是批处理系统,正确解析电子表格数据都至关重要。 IronXL是一个.NET库,它无需服务器上的 Microsoft Office 或 COM 互操作 即可处理 XLSX、XLS 和 CSV 文件。 本指南将带您了解完整的流程——从安装到高级查询——以便您可以为您的项目选择正确的方法。

立即开始使用 IronXL。
green arrow pointer

在 C# 中读取 Excel 文件的最佳方法是什么?

最佳方法是使用专用的、独立于 Office 的库,例如IronXL。 像 Microsoft.Office.Interop.Excel 这样的传统方法在安装了 Excel 的机器上可以正常工作,但在服务器或容器环境中却很脆弱,因为它们会在后台启动一个 COM 进程。 OpenXML SDK 是免费的,并且对服务器安全,但它公开了一个底层 XML 模型,日常任务需要大量的样板代码。

IronXL 的性能介于这两种极端情况之间。 该 API 反映了开发者对电子表格的固有认知——工作簿包含工作表,工作表包含单元格,单元格包含输入的值。 该库内部处理格式检测、公式计算和编码,因此您可以将时间花在业务逻辑上,而不是解析细节上。

C# 中 Excel 阅读方法的比较
方法 需要 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
SHELL

或者,使用 Visual Studio 包管理器控制台:

Install-Package IronXl.Excel
Install-Package IronXl.Excel
SHELL

安装完成后,将 using IronXL; 指令添加到任何需要访问电子表格的文件。 该库面向.NET 10、 .NET 8、 .NET 6、 .NET Framework 4.6.2 和.NET Standard 2.0,因此无需升级运行时即可集成到现有项目中。有关特定平台的说明和NuGet包详细信息,请参阅IronXL安装指南

无需额外的运行时组件、注册表项或 Office 许可证。 NuGet包包含了库所需的一切。

验证安装

添加软件包后,构建一次项目以确认引用解析正确。 如果您看到 CS0246 类型的错误,请检查 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}");
$vbLabelText   $csharpLabel

使用IronXL在 C# 中读取 Excel 文件的最佳方法:图 1 - 用于确认工作簿已加载的控制台输出

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}");
$vbLabelText   $csharpLabel

使用IronXL在 C# 中读取 Excel 文件的最佳方法:图 2 - 使用IronXL读取 Excel 文件输出

sheet["A2"] 语法使用标准的 Excel 表示法。 列字母不区分大小写,行号从 1 开始,与 Excel 标记单元格的方式一致。 单元格值读取文档显示了其他类型访问器,包括 DateTimeValue,用于格式化为日期的单元格。

当单元格包含以文本形式存储的数字时(这是导出电子表格中常见的数据质量问题),StringValue 会按原样返回文本,而 DecimalValue 会尝试解析,并在解析失败时返回 0。 在生产代码中将意外数据作为类型化值处理之前,务必先对其进行验证。

处理日期和布尔单元格

Excel 中的日期单元格在内部以序列号的形式存储。 IronXL公开 DateTimeValue,以便将它们转换为.NET DateTime 对象,而无需手动计算。 对于包含 TRUEFALSE 的单元格,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());
}
$vbLabelText   $csharpLabel

使用IronXL在 C# 中读取 Excel 文件的最佳方法:图 3 - 遍历行的输出

范围字符串 "A2:D100" 创建一个扁平单元格集合。 该范围内的行按从上到下、从左到右的顺序处理。 这种模式非常适合导出到 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}");
$vbLabelText   $csharpLabel

对于 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}");
$vbLabelText   $csharpLabel

使用IronXL在 C# 中读取 Excel 文件的最佳方法:图 4 - 高级读取操作控制台输出

当您需要在将行导入数据库之前对其进行筛选,或者验证列中的所有值是否都满足阈值时,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"]}");
}
$vbLabelText   $csharpLabel

true 传递给 ToDataTable 会将工作表的第一行视为列标题。 生成的 DataTable 使用与标题文本匹配的字符串列名,使后续的 LINQ to DataSet 查询更易读。 DataTable 导出文档涵盖了空值处理和类型推断选项。

当下游代码已经期望 DataTable 时,这种模式特别有用——例如,当调用 SqlBulkCopy 将行插入 SQL Server 时。 您可以加载 XLSX 文件,将其转换为 DataTable,然后进行批量插入,而无需编写任何列映射样板代码。

IronXL核心读取 API 参考
手术 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`
对一定范围求和 `sheet["B2:B50"].Sum()` `decimal`
导出到数据表 `sheet.ToDataTable(true)` `DataTable`

有关完整的 API 列表,请参阅IronXL API 参考。 该参考文档涵盖了每个属性和方法,包括参数描述和返回类型详情。

下一步计划是什么?

只要有了合适的库,用 C# 读取 Excel 文件就非常简单。 IronXL消除了对 Office 的依赖,简化了 API 接口,并且使用相同的代码路径处理 XLSX、XLS 和 CSV 格式。 这里涵盖的模式——加载工作簿、读取键入的单元格值、迭代范围、运行聚合以及导出到 DataTable——涵盖了大多数现实世界的电子表格读取需求。

为了继续沿用这些模式:

对于正在评估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。

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