如何在 C# 中读取 Excel 文件(无需安装 Excel)

在 C# 中读取 Excel 文件是报表生成、数据导入和自动化处理的常见需求。借助免费社区版 Free Spire.XLS for .NET,你可以加载 Excel 工作簿并读取其中的数据,无需在运行环境中安装 Microsoft Excel,也不依赖 Interop。本文将介绍如何读取单元格、工作表和行数据,将工作表导出为 DataTable,以及处理公式结果。

快速开始:用 C# 读取 Excel 文件

通过 NuGet 安装 Free Spire.XLS for .NET。在终端中执行以下命令:

1
dotnet add package FreeSpire.XLS

或者在 NuGet 包管理器控制台中执行:

1
Install-Package FreeSpire.XLS

你也可以从产品页面下载 Free Spire.XLS for .NET 并手动引用 DLL,或在 NuGet 上获取该包。

下面的示例加载一个 Excel 文件,获取第一个工作表,并输出单元格 A1 的值。请将 input.xlsx 替换为你的文件完整路径,或确保文件位于程序的当前工作目录下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using System;
using Spire.Xls;

class Program
{
static void Main()
{
Workbook workbook = new Workbook();

try
{
// 加载 Excel 文件
workbook.LoadFromFile("input.xlsx");

// 获取第一个工作表
Worksheet sheet = workbook.Worksheets[0];

// 读取单元格 A1 的值(第 1 行,第 1 列)
string value = sheet.Range[1, 1].Value;

Console.WriteLine("Cell A1: " + value);
}
finally
{
workbook.Dispose();
}
}
}

Workbook.LoadFromFile() 将文件读入内存。Worksheets[0] 返回第一个工作表,Range[1, 1].Value 返回第一行第一列单元格的文本值。finally 块在你完成操作后释放工作簿资源。

使用 Free Spire.XLS 在 C# 中读取单元格 A1 的值 — 控制台输出

读取指定单元格或工作表

以下示例假设 workbook 已通过 LoadFromFile() 加载,展示如何按索引或名称访问工作表。

一个 Excel 文件可以包含多个工作表。你可以按位置或名称获取工作表:

1
2
3
4
5
// 按索引(从 0 开始):第一个工作表为 0,第二个为 1
Worksheet first = workbook.Worksheets[0];

// 按名称
Worksheet sales = workbook.Worksheets["Sales"];

你也可以按行列号或 Excel 地址读取单元格:

1
2
3
4
5
// 按行列号(从 1 开始):第 2 行,第 3 列
string byIndex = sales.Range[2, 3].Value;

// 按 Excel 地址
string byAddress = sales.Range["C2"].Value;

注意起始编号的区别。工作表集合是从 0 开始的,所以第一个工作表是 Worksheets[0]。单元格的行列号是从 1 开始的,所以 Range[1, 1] 对应单元格 A1。

要读取一块单元格区域,传入区域地址并遍历:

1
2
3
4
5
6
CellRange range = sales.Range["A1:C3"];

foreach (CellRange cell in range.CellList)
{
Console.WriteLine($"{cell.RangeAddress}: {cell.Value}");
}

在 C# 中逐行读取 Excel 数据

要读取工作表中的所有数据,用外层循环遍历行,内层循环遍历列。每行结束后输出换行符,使控制台输出保持工作表的结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using System;
using Spire.Xls;

class Program
{
static void Main()
{
Workbook workbook = new Workbook();

try
{
workbook.LoadFromFile("input.xlsx");
Worksheet sheet = workbook.Worksheets[0];

for (int row = 1; row <= sheet.LastDataRow; row++)
{
for (int col = 1; col <= sheet.LastDataColumn; col++)
{
Console.Write($"{sheet.Range[row, col].Value}\t");
}

Console.WriteLine();
}
}
finally
{
workbook.Dispose();
}
}
}

循环从第 1 行第 1 列运行到 LastDataRow 和 LastDataColumn,这两个属性返回包含数据的最后一行和最后一列。这样可以避免 LastRow 和 LastColumn 将仅格式化但为空的单元格也包含进来。如果你的工作表布局特殊,请在处理输出前先在实际文件上验证数据范围。

假设工作表包含以下示例数据:

产品 类别 价格
键盘 配件 25
显示器 显示设备 180

控制台会将每行数据单独输出一行,单元格值之间用制表符分隔:

1
2
3
Product    Category    Price
Keyboard Accessories 25
Monitor Displays 180

使用 Free Spire.XLS 在 C# 中逐行读取 Excel 数据 — 控制台输出

将 Excel 数据导出为 DataTable

如果你需要用 ADO.NET 处理工作表数据、绑定到控件或插入数据库,可以通过 ExportDataTable() 将工作表导出为 DataTable:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using System;
using System.Data;
using Spire.Xls;

class Program
{
static void Main()
{
Workbook workbook = new Workbook();

try
{
workbook.LoadFromFile("input.xlsx");

// 导出前重新计算公式
workbook.CalculateAllValue();

Worksheet sheet = workbook.Worksheets[0];

DataTable dataTable = sheet.ExportDataTable(
sheet.AllocatedRange,
true, // exportColumnNames
true // computedFormulaValue
);

// 逐行输出以验证导出的数据
foreach (DataRow row in dataTable.Rows)
{
Console.WriteLine(string.Join("\t", row.ItemArray));
}
}
finally
{
workbook.Dispose();
}
}
}

此重载方法接受三个参数:

  • range:要导出的单元格区域。sheet.AllocatedRange 返回工作表已使用的区域。根据工作簿的格式设置和已用区域配置,它可能包含空单元格。如果只需要特定数据区域,请使用显式区域并验证其边界。
  • exportColumnNames:为 true 时,区域的第一行成为 DataTable 的列名。为 false 时,第一行作为普通数据导出。
  • computedFormulaValue:为 true 时,导出器使用公式的计算值而非公式文本。为 false 时,公式单元格导出为公式文本。如果数据中包含公式,请在你自己的测试文件上验证导出的值——可能需要先触发公式计算才能正确填充结果。

要在 Windows Forms 应用程序中展示结果,将 DataTable 赋值给 DataGridView:

1
dataGridView1.DataSource = dataTable;

在后续处理中依赖导出表之前,请对照你自己的 Excel 文件检查列名和数据类型。更多选项(如导出指定区域),请参阅用 C# 读取 Excel 为 DataTable 的详细教程。

将 Excel 数据导出为 DataTable 并在 DataGridView 中展示 — C# Free Spire.XLS

读取公式结果和处理单元格值

本节中的代码片段假设 sheet 指向已加载工作簿中的工作表,与前述示例一致。

包含公式的单元格有两样你可能需要读取的内容:公式本身和计算结果。使用 HasFormula 检查单元格是否包含公式,Formula 获取公式文本,FormulaValue 获取计算结果。如果需要最新的公式结果,请在加载工作簿后、读取 FormulaValue 之前调用 workbook.CalculateAllValue()。

1
2
3
4
5
6
7
8
9
10
11
CellRange cell = sheet.Range["D2"];

if (cell.HasFormula)
{
Console.WriteLine("Formula: " + cell.Formula);
Console.WriteLine("Result: " + cell.FormulaValue);
}
else
{
Console.WriteLine("Value: " + cell.Value);
}

更多公式相关操作,请参阅在 Excel 中插入或读取函数和公式。

使用 Free Spire.XLS 在 C# 中读取 Excel 公式结果 — 控制台输出

不同内容类型的单元格可以通过类型化属性读取:

1
2
3
4
5
6
CellRange priceCell = sheet.Range["C2"];
CellRange dateCell = sheet.Range["E2"];

double price = priceCell.NumberValue; // 数值
DateTime date = dateCell.DateTimeValue; // 日期值
string text = sheet.Range["A2"].Text; // 显示文本

Excel 存储数字和日期的方式与纯文本不同,因此应根据单元格中的数据类型选择匹配的属性。

读取数字格式和显示值

对于应用了数字格式的单元格——百分比、货币、日期等——存储值、格式代码和格式化后的文本可能各不相同。一个存储 0.15 并使用百分比格式的单元格显示为 15%。使用 Value 获取原始值,NumberFormat 获取格式代码,NumberText 获取 Excel 中显示的文本:

属性 返回内容
Value 单元格原始值
NumberFormat 数字格式代码(如 0.00%)
NumberText 应用格式后的文本(如 15%)
1
2
3
4
5
CellRange cell = sheet.Range["C2"];

Console.WriteLine("Value: " + cell.Value);
Console.WriteLine("Number format: " + cell.NumberFormat);
Console.WriteLine("Formatted text: " + cell.NumberText);

根据下游逻辑的需要选择相应属性:计算用数值,展示用格式化文本。更多数字格式相关内容,请参阅设置 Excel 中数字格式。

读取单元格之前,可以先检查它是否为空:

1
2
3
4
if (string.IsNullOrEmpty(sheet.Range["B5"].Value))
{
Console.WriteLine("B5 is empty.");
}

常见问题

在 C# 中读取 Excel 文件需要安装 Microsoft Excel 吗?

不需要。Free Spire.XLS 直接读取 Excel 文件,不要求运行代码的计算机或服务器上安装 Microsoft Excel 或 Interop。

如何读取公式的计算结果而不是公式文本?

对于单个单元格,检查 CellRange.HasFormula 并读取 CellRange.FormulaValue。要读取整个工作表,调用 ExportDataTable() 并将 computedFormulaValue 设为 true。参见「读取公式结果和处理单元格值」一节。

可以读取密码保护的 Excel 文件吗?

可以。在加载文件之前设置打开密码:

1
2
3
Workbook workbook = new Workbook();
workbook.OpenPassword = "your-password";
workbook.LoadFromFile("protected.xlsx");

Free Spire.XLS 支持哪些 Excel 文件格式?

Free Spire.XLS 支持 .xls、.xlsx 和 .xlsm 格式。

免费版有哪些限制?

Free Spire.XLS for .NET 是面向个人开发者和小型项目的社区版。使用 .xls 格式时,每个工作表限制 5 个工作表和每表 200 行。加载和保存 .xlsx 文件不受此限制。如需更高容量或高级功能,可使用商业版 Spire.XLS for .NET。

如需更高容量、高级功能或商业用途,Spire.XLS for .NET 是功能完整的商业版本——你可以申请 30 天免费试用许可证进行评估。

另请参见