编辑
2025-02-03
C# 应用
00
请注意,本文编写于 92 天前,最后修改于 92 天前,其中某些信息可能已经过时。

目录

前提条件
安装 ExcelDataReader 库
支持格式
注意事项
常用方法
基本使用
代码示例
读取 Excel 文件并输出内容
读取 Excel 文件中的特定工作表
按条件过滤内容
注意事项
Maper
结论

ExcelDataReader 是一个轻量级且高效的库,用于读取 .xlsx.xls 文件中的数据。本文将详细介绍如何在 C# 项目中使用 ExcelDataReader 库,并提供多个示例来演示其功能。

前提条件

在开始之前,确保以下环境准备就绪:

  1. .NET (Core 或 Framework)
  2. Visual Studio 或其他兼容的 IDE

安装 ExcelDataReader 库

首先,通过 NuGet 包管理器安装 ExcelDataReader 库。您可以在 NuGet 包管理器控制台中运行下面的命令:

C#
Install-Package ExcelDataReader

此外,还需要安装一个支持读取方式的包:

PowerShell
Install-Package ExcelDataReader.DataSet

image.png

支持格式

File TypeContainer FormatFile FormatExcel Version(s)
.xlsxZIP, CFB+ZIPOpenXml2007 and newer
.xlsbZIP, CFBOpenXml2007 and newer
.xlsCFBBIFF897, 2000, XP, 2003 98, 2001, v.X, 2004 (Mac)
.xlsCFBBIFF55.0, 95
.xls-BIFF44.0
.xls-BIFF33.0
.xls-BIFF22.0, 2.2
.csv-CSV(All)

注意事项

  • ExcelDataReader 只负责读取数据,写入则需使用其他工具。
  • ExcelDataReaderExcelDataReader.DataSet 都是必备的 NuGet 包。
  • 确保在不同的 .NET 版本下正确注册编码提供程序,例如对 .NET Framework 需要特定的编码注册步骤。

此表提供了 ExcelDataReader 的关键功能和属性,方便开发者了解并使用该库进行 Excel 文件读取操作。

常用方法

方法属性(中文)
Read()从当前工作表中读取一行。
NextResult()将光标移至下一个工作表。
ResultsCount返回当前工作簿中的工作表数量。
Name返回当前工作表的名称。
CodeName返回当前工作表的VBA代码名称标识符。
FieldCount返回当前工作表中的列数。
RowCount返回当前工作表中的行数。
HeaderFooter返回包含页眉和页脚信息的对象,或null如果没有。
MergeCells返回当前工作表中合并单元格范围的数组。
RowHeight返回当前行的视觉高度(以点为单位)。可能为0如果行被隐藏。
GetColumnWidth()返回列的宽度(以字符单位)。可能为0如果列被隐藏。
GetFieldType()返回当前行中值的类型。
IsDBNull()检查当前行中的值是否为null。
GetValue()从当前行返回一个值作为object,或null如果没有值。
GetDouble()从当前行返回一个值并转换为double类型。
GetInt32()从当前行返回一个值并转换为int类型。
GetBoolean()从当前行返回一个值并转换为bool类型。
GetDateTime()从当前行返回一个值并转换为DateTime类型。
GetString()从当前行返回一个值并转换为string类型。
GetNumberFormatString()返回当前行中值的格式代码字符串,或null如果没有值。
GetNumberFormatIndex()返回当前行中值的数字格式索引。
GetCellStyle()返回包含当前行中单元格样式信息的对象。

基本使用

以下是如何使用 ExcelDataReader 读取 Excel 文件的基本步骤:

  1. 打开文件流
  2. 使用 ExcelReaderFactory 创建 IExcelDataReader
  3. 可选:将数据转换为 DataSet
  4. 处理数据
  5. 关闭数据读取器和文件流

代码示例

读取 Excel 文件并输出内容

C#
using System; using System.Data; using System.IO; using ExcelDataReader; class Program { static void Main() { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);//注意这个编码注册 // 文件路径 string filePath = @"pgcustomer.xlsx"; // 打开文件流 using var stream = File.Open(filePath, FileMode.Open, FileAccess.Read); // 创建 ExcleDataReader using var reader = ExcelReaderFactory.CreateReader(stream); // 配置读取选项 var conf = new ExcelDataSetConfiguration { ConfigureDataTable = _ => new ExcelDataTableConfiguration { UseHeaderRow = true // 使用第一行作为列名 } }; // 转换为 DataSet var result = reader.AsDataSet(conf); // 遍历所有表 foreach (DataTable table in result.Tables) { Console.WriteLine($"Sheet: {table.TableName}"); foreach (DataRow row in table.Rows) { foreach (DataColumn column in table.Columns) { Console.Write($"{row[column]} "); } Console.WriteLine(); } } } }

image.png

读取 Excel 文件中的特定工作表

如果你只想读取特定的工作表,可以按如下方式实现:

JavaScript
var table = result.Tables["Sheet1"];

按条件过滤内容

C#
using System; using System.Data; using System.IO; using System.Linq; using ExcelDataReader; class Program { static void Main() { string filePath = @"path\to\your\excel-file.xlsx"; using var stream = File.Open(filePath, FileMode.Open, FileAccess.Read); using var reader = ExcelReaderFactory.CreateReader(stream); var conf = new ExcelDataSetConfiguration { ConfigureDataTable = _ => new ExcelDataTableConfiguration { UseHeaderRow = true } }; var result = reader.AsDataSet(conf); var table = result.Tables["Sheet1"]; if (table != null) { // 使用 LINQ 进行条件过滤 var filteredRows = table.AsEnumerable() .Where(row => row.Field<string>("accountpricingcode") == "B002"); foreach (var row in filteredRows) { foreach (DataColumn column in table.Columns) { Console.Write($"{row[column]} "); } Console.WriteLine(); } } } }

image.png

注意事项

  1. 文件格式支持:ExcelDataReader 支持 .xlsx, .xls 等常见 Excel 文件格式,但 .xlsm (包含宏的文件)可能在某些版本中不被完全支持。
  2. 文件流:务必正确管理文件流的打开和关闭,以防止资源泄漏。
  3. 日期格式:确保 Excel 文件中的日期格式一致,否则在解析时可能出现异常。

Maper

安装ExcelDataReader.Mapping

C#
public class PgCustomer { [ExcelColumnName("accountpricingcode")] public string code { get; set; } [ExcelColumnName("pg")] public string pg { get; set; } [ExcelColumnName("factor")] public decimal factor { get; set; } [ExcelColumnName("startdate")] public DateTime startdate { get; set; } [ExcelColumnName("enddate")] public DateTime enddate { get; set; } }

如果属性名称与excel 列头一样,就不用给ExcelColumnName了。

C#
static void Main(string[] args) { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);//注意这个编码注册 string filePath = @"pgcustomer.xlsx"; using var stream = File.Open(filePath, FileMode.Open, FileAccess.Read); using var importer = new ExcelImporter(stream); ExcelSheet sheet = importer.ReadSheet(); var pgs = sheet.ReadRows<PgCustomer>().ToList(); foreach (var pg in pgs) { Console.Write(pg.code +"\t"); Console.Write(pg.pg + "\t"); Console.Write(pg.factor + "\t"); Console.Write(pg.startdate + "\t"); Console.Write(pg.enddate + "\t"); Console.WriteLine(); } }

image.png

结论

使用 ExcelDataReader,可以轻松实现对 Excel 文件的读取操作,无论是简单的读取还是按条件过滤。通过配置选项,可以灵活地处理不同的文件结构和内容格式。

希望这篇文章对你了解和使用 ExcelDataReader 提供帮助。如果有其他问题,欢迎在评论区提问。

本文作者:rick

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!