如何在 C# 中读取 Excel 文件(无需安装 Excel)
如何在 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 | using System; |
Workbook.LoadFromFile() 将文件读入内存。Worksheets[0] 返回第一个工作表,Range[1, 1].Value 返回第一行第一列单元格的文本值。finally 块在你完成操作后释放工作簿资源。
读取指定单元格或工作表
以下示例假设 workbook 已通过 LoadFromFile() 加载,展示如何按索引或名称访问工作表。
一个 Excel 文件可以包含多个工作表。你可以按位置或名称获取工作表:
1 | // 按索引(从 0 开始):第一个工作表为 0,第二个为 1 |
你也可以按行列号或 Excel 地址读取单元格:
1 | // 按行列号(从 1 开始):第 2 行,第 3 列 |
注意起始编号的区别。工作表集合是从 0 开始的,所以第一个工作表是 Worksheets[0]。单元格的行列号是从 1 开始的,所以 Range[1, 1] 对应单元格 A1。
要读取一块单元格区域,传入区域地址并遍历:
1 | CellRange range = sales.Range["A1:C3"]; |
在 C# 中逐行读取 Excel 数据
要读取工作表中的所有数据,用外层循环遍历行,内层循环遍历列。每行结束后输出换行符,使控制台输出保持工作表的结构:
1 | using System; |
循环从第 1 行第 1 列运行到 LastDataRow 和 LastDataColumn,这两个属性返回包含数据的最后一行和最后一列。这样可以避免 LastRow 和 LastColumn 将仅格式化但为空的单元格也包含进来。如果你的工作表布局特殊,请在处理输出前先在实际文件上验证数据范围。
假设工作表包含以下示例数据:
| 产品 | 类别 | 价格 |
|---|---|---|
| 键盘 | 配件 | 25 |
| 显示器 | 显示设备 | 180 |
控制台会将每行数据单独输出一行,单元格值之间用制表符分隔:
1 | Product Category Price |
将 Excel 数据导出为 DataTable
如果你需要用 ADO.NET 处理工作表数据、绑定到控件或插入数据库,可以通过 ExportDataTable() 将工作表导出为 DataTable:
1 | using System; |
此重载方法接受三个参数:
- range:要导出的单元格区域。
sheet.AllocatedRange返回工作表已使用的区域。根据工作簿的格式设置和已用区域配置,它可能包含空单元格。如果只需要特定数据区域,请使用显式区域并验证其边界。 - exportColumnNames:为
true时,区域的第一行成为DataTable的列名。为false时,第一行作为普通数据导出。 - computedFormulaValue:为
true时,导出器使用公式的计算值而非公式文本。为false时,公式单元格导出为公式文本。如果数据中包含公式,请在你自己的测试文件上验证导出的值——可能需要先触发公式计算才能正确填充结果。
要在 Windows Forms 应用程序中展示结果,将 DataTable 赋值给 DataGridView:
1 | dataGridView1.DataSource = dataTable; |
在后续处理中依赖导出表之前,请对照你自己的 Excel 文件检查列名和数据类型。更多选项(如导出指定区域),请参阅用 C# 读取 Excel 为 DataTable 的详细教程。
读取公式结果和处理单元格值
本节中的代码片段假设 sheet 指向已加载工作簿中的工作表,与前述示例一致。
包含公式的单元格有两样你可能需要读取的内容:公式本身和计算结果。使用 HasFormula 检查单元格是否包含公式,Formula 获取公式文本,FormulaValue 获取计算结果。如果需要最新的公式结果,请在加载工作簿后、读取 FormulaValue 之前调用 workbook.CalculateAllValue()。
1 | CellRange cell = sheet.Range["D2"]; |
更多公式相关操作,请参阅在 Excel 中插入或读取函数和公式。
不同内容类型的单元格可以通过类型化属性读取:
1 | CellRange priceCell = sheet.Range["C2"]; |
Excel 存储数字和日期的方式与纯文本不同,因此应根据单元格中的数据类型选择匹配的属性。
读取数字格式和显示值
对于应用了数字格式的单元格——百分比、货币、日期等——存储值、格式代码和格式化后的文本可能各不相同。一个存储 0.15 并使用百分比格式的单元格显示为 15%。使用 Value 获取原始值,NumberFormat 获取格式代码,NumberText 获取 Excel 中显示的文本:
| 属性 | 返回内容 |
|---|---|
Value |
单元格原始值 |
NumberFormat |
数字格式代码(如 0.00%) |
NumberText |
应用格式后的文本(如 15%) |
1 | CellRange cell = sheet.Range["C2"]; |
根据下游逻辑的需要选择相应属性:计算用数值,展示用格式化文本。更多数字格式相关内容,请参阅设置 Excel 中数字格式。
读取单元格之前,可以先检查它是否为空:
1 | if (string.IsNullOrEmpty(sheet.Range["B5"].Value)) |
常见问题
在 C# 中读取 Excel 文件需要安装 Microsoft Excel 吗?
不需要。Free Spire.XLS 直接读取 Excel 文件,不要求运行代码的计算机或服务器上安装 Microsoft Excel 或 Interop。
如何读取公式的计算结果而不是公式文本?
对于单个单元格,检查 CellRange.HasFormula 并读取 CellRange.FormulaValue。要读取整个工作表,调用 ExportDataTable() 并将 computedFormulaValue 设为 true。参见「读取公式结果和处理单元格值」一节。
可以读取密码保护的 Excel 文件吗?
可以。在加载文件之前设置打开密码:
1 | Workbook workbook = new Workbook(); |
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 天免费试用许可证进行评估。














