ExcelDataReader 完全指南:高效读取Excel数据的终极解决方案
项目概述
ExcelDataReader 是一个用 C# 编写的轻量级、高性能库,专门用于读取 Microsoft Excel 文件。该项目支持从 Excel 2.0 到 2021 版本以及 Office 365 的所有主流格式,包括传统的 XLS 和现代的 XLSX 格式。
核心特性与优势
多格式全面支持
ExcelDataReader 支持广泛的 Excel 文件格式:
| 文件类型 | 容器格式 | 文件格式 | Excel版本 |
|---|---|---|---|
| .xlsx | ZIP, CFB+ZIP | OpenXml | 2007及更新版本 |
| .xlsb | ZIP, CFB | OpenXml | 2007及更新版本 |
| .xls | CFB | BIFF8 | 97, 2000, XP, 2003 |
| .xls | - | BIFF5 | 5.0, 95 |
| .xls | - | BIFF4 | 4.0 |
| .xls | - | BIFF3 | 3.0 |
| .xls | - | BIFF2 | 2.0, 2.2 |
| .csv | - | CSV | 所有版本 |
性能优势
- 轻量级设计,内存占用小
- 快速解析大型Excel文件
- 支持流式读取,适合处理大数据量
快速开始
安装配置
通过 NuGet 安装 ExcelDataReader 包:
dotnet add package ExcelDataReader
对于需要将数据读取到 DataSet 的场景,可安装扩展包:
dotnet add package ExcelDataReader.DataSet
基础使用示例
using System;
using System.IO;
using ExcelDataReader;
class Program
{
static void Main(string[] args)
{
// 注册编码提供程序
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
using (var stream = File.Open("your_excel_file.xlsx", FileMode.Open, FileAccess.Read))
{
// 自动检测格式,支持二进制和OpenXml格式
using (var reader = ExcelReaderFactory.CreateReader(stream))
{
// 方法1:使用读取器方法逐行读取
do
{
while (reader.Read())
{
for (int i = 0; i < reader.FieldCount; i++)
{
var value = reader.GetValue(i);
Console.Write(value + "\t");
}
Console.WriteLine();
}
} while (reader.NextResult());
// 方法2:使用AsDataSet扩展方法
var result = reader.AsDataSet();
// 每个电子表格的结果在 result.Tables 中
}
}
}
}
高级功能详解
读取器核心方法
ExcelDataReader 提供了丰富的读取方法:
| 方法/属性 | 功能描述 |
|---|---|
| Read() | 从当前工作表读取一行 |
| NextResult() | 将光标前进到下一个工作表 |
| ResultsCount | 返回当前工作簿中的工作表数量 |
| Name | 返回当前工作表的名称 |
| CodeName | 返回当前工作表的VBA代码名称标识符 |
| FieldCount | 返回当前工作表中的列数 |
| RowCount | 返回当前工作表中的行数 |
| HeaderFooter | 返回包含页眉和页脚信息的对象 |
| MergeCells | 返回当前工作表中合并单元格范围的数组 |
| RowHeight | 返回当前行的视觉高度(以点为单位) |
配置选项
CreateReader 配置
var reader = ExcelReaderFactory.CreateReader(stream, new ExcelReaderConfiguration()
{
// 当输入XLS缺少CodePage记录时使用的编码
FallbackEncoding = Encoding.GetEncoding(1252),
// 用于打开受密码保护的工作簿的密码
Password = "password",
// CSV分隔符候选数组,自动检测最适合输入数据的分隔符
AutodetectSeparators = new char[] { ',', ';', '\t', '|', '#' },
// 是否修剪CSV的空白值
TrimWhiteSpace = true,
// 处置IExcelDataReader对象后是否保持流打开
LeaveOpen = false,
// 分析CSV的编码、分隔符和字段计数的行数
AnalyzeInitialCsvRows = 0
});
AsDataSet 配置
var result = reader.AsDataSet(new ExcelDataSetConfiguration()
{
// 是否在第二轮中设置DataColumn.DataType属性
UseColumnDataType = true,
// 确定是否将当前工作表包含在DataSet中的回调
FilterSheet = (tableReader, sheetIndex) => true,
ConfigureDataTable = (tableReader) => new ExcelDataTableConfiguration()
{
// 生成列名称的前缀
EmptyColumnNamePrefix = "Column",
// 是否使用数据中的一行作为列名称
UseHeaderRow = false,
// 确定哪一行是标题行的回调
ReadHeaderRow = (rowReader) => {
// 例如,跳过第一行并使用第二行作为列标题:
rowReader.Read();
},
// 确定是否将当前行包含在DataTable中的回调
FilterRow = (rowReader) => {
return true;
},
// 确定是否包含特定列的回调
FilterColumn = (rowReader, columnIndex) => {
return true;
}
}
});
实战应用场景
数据导入与处理
数据库批量导入 将Excel数据无缝迁移到SQL Server、MySQL等数据库系统:
// 示例:将Excel数据导入SQL Server
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
foreach (DataTable table in result.Tables)
{
foreach (DataRow row in table.Rows)
{
// 执行数据库插入操作
}
}
}
系统数据同步 实现多个系统间的数据交换与同步,确保数据一致性。
报表自动化
构建智能报表生成流水线,自动从Excel文件中提取数据并生成标准格式报告。
注意事项与最佳实践
.NET Core 兼容性
在 .NET Core 和 .NET 5.0 或更高版本上,默认情况下 ExcelDataReader 会抛出 "No data is available for encoding 1252" 的 NotSupportedException。
解决方案:添加对 System.Text.Encoding.CodePages 包的依赖,并在应用程序初始化期间注册代码页提供程序:
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
版本升级指南
从 ExcelDataReader 2.x 升级到 3.x 时需要注意:
-
确保将代码中的任何
Excel命名空间引用重命名为新的命名空间ExcelDataReader -
确保项目引用了
ExcelDataReader.DataSet包以使用AsDataSet() -
移除包含
IsFirstRowAsColumnNames的代码行,并将 AsDataSet() 的调用改为:
var result = reader.AsDataSet(new ExcelDataSetConfiguration()
{
ConfigureDataTable = (_) => new ExcelDataTableConfiguration()
{
UseHeaderRow = true
}
});
格式化处理
ExcelDataReader 不直接支持格式化。用户可以通过 IExcelDataReader.GetNumberFormatString(i) 获取单元格的数字格式字符串,并使用第三方 ExcelNumberFormat 库进行格式化目的。
示例辅助方法:
string GetFormattedValue(IExcelDataReader reader, int columnIndex, CultureInfo culture)
{
var value = reader.GetValue(columnIndex);
var formatString = reader.GetNumberFormatString(columnIndex);
if (formatString != null)
{
var format = new NumberFormat(formatString);
return format.Format(value, culture);
}
return Convert.ToString(value, culture);
}
项目架构
核心组件
- ExcelDataReader: 基础读取器接口
- ExcelDataReader.DataSet: 支持 DataSet 转换的扩展包
- ExcelDataReader.Tests: 完整的测试套件
- ExcelDataReader.Sample: 使用示例项目
- ExcelDataReader.Benchmarks: 性能基准测试
测试数据
项目中包含了大量的测试数据文件,涵盖了各种边界情况和特殊场景:
- 各种编码格式测试文件
- 不同版本的Excel文件
- 特殊格式和公式测试
- 加密和受保护文件测试
性能优化建议
内存管理
对于大型Excel文件,建议使用流式读取方式,避免一次性加载所有数据到内存中。
错误处理
在读取Excel文件时,应添加适当的错误处理机制,以应对文件格式不正确或数据不完整的情况。
开发环境搭建
克隆项目
git clone https://gitcode.com/gh_mirrors/ex/ExcelDataReader
构建与测试
项目使用标准的 .NET 构建流程,支持跨平台开发。
总结
ExcelDataReader 作为一个成熟稳定的 Excel 文件读取库,为 C# 开发者提供了强大而灵活的数据处理能力。无论是简单的数据导入还是复杂的企业级应用,都能找到合适的解决方案。
通过掌握本文介绍的核心概念和使用技巧,您可以快速构建出高效、可靠的Excel数据处理应用程序。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




