ExcelDataReader 完全指南:高效读取Excel数据的终极解决方案

ExcelDataReader 完全指南:高效读取Excel数据的终极解决方案

【免费下载链接】ExcelDataReader Lightweight and fast library written in C# for reading Microsoft Excel files 【免费下载链接】ExcelDataReader 项目地址: https://gitcode.com/gh_mirrors/ex/ExcelDataReader

项目概述

ExcelDataReader 是一个用 C# 编写的轻量级、高性能库,专门用于读取 Microsoft Excel 文件。该项目支持从 Excel 2.0 到 2021 版本以及 Office 365 的所有主流格式,包括传统的 XLS 和现代的 XLSX 格式。

核心特性与优势

多格式全面支持

ExcelDataReader 支持广泛的 Excel 文件格式:

文件类型容器格式文件格式Excel版本
.xlsxZIP, CFB+ZIPOpenXml2007及更新版本
.xlsbZIP, CFBOpenXml2007及更新版本
.xlsCFBBIFF897, 2000, XP, 2003
.xls-BIFF55.0, 95
.xls-BIFF44.0
.xls-BIFF33.0
.xls-BIFF22.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 时需要注意:

  1. 确保将代码中的任何 Excel 命名空间引用重命名为新的命名空间 ExcelDataReader

  2. 确保项目引用了 ExcelDataReader.DataSet 包以使用 AsDataSet()

  3. 移除包含 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文件
  • 特殊格式和公式测试
  • 加密和受保护文件测试

ExcelDataReader架构图

性能优化建议

内存管理

对于大型Excel文件,建议使用流式读取方式,避免一次性加载所有数据到内存中。

错误处理

在读取Excel文件时,应添加适当的错误处理机制,以应对文件格式不正确或数据不完整的情况。

开发环境搭建

克隆项目

git clone https://gitcode.com/gh_mirrors/ex/ExcelDataReader

构建与测试

项目使用标准的 .NET 构建流程,支持跨平台开发。

总结

ExcelDataReader 作为一个成熟稳定的 Excel 文件读取库,为 C# 开发者提供了强大而灵活的数据处理能力。无论是简单的数据导入还是复杂的企业级应用,都能找到合适的解决方案。

通过掌握本文介绍的核心概念和使用技巧,您可以快速构建出高效、可靠的Excel数据处理应用程序。

【免费下载链接】ExcelDataReader Lightweight and fast library written in C# for reading Microsoft Excel files 【免费下载链接】ExcelDataReader 项目地址: https://gitcode.com/gh_mirrors/ex/ExcelDataReader

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值