适用于.net的操作excel的库

news/2025/1/11 12:41:27 标签: excel, c#, .net, Avalonia

目录

目录

知识点概要

知识点具体说明(使用步骤、解释)

使用场景及示例

1. EPPlus

 2. NPOI

 3. ClosedXml

4. SpreadsheetLight

 5.ExcelDataReader 开源库

 6. ExcelDataWriter

总结


 

知识点概要

        使用Excel来导入和导出数据,在日常工作中使用频率是相当高的,而直接去读取Excel数据还是比较繁琐的,使用 EPPlus 、 ClosedXML 等第三方库读取 Excel 数据相较于直接读取,则方便的多,第三方库通常都提供了简单、实用、易于理解的高层次API,具有很高的可用性,使得开发效率大大提高,同时也使得代码更易于理解和维护。现在我们就总结一下适合于.Net操作Excel的库。

知识点具体说明(使用步骤、解释)

        Excel其实是由XML发展而来的,它实际上是一个ZIP压缩包,其中包含了很多的文件和文件夹,我们可以将一个excel文件的后缀改成“.zip”,然后打开就可以看到其内部组成文件了。

所以使用库来操作excel还是很有必要的。

现在我整理了一下几个常见的比较稳定的库:

1. EPPlus(1亿2306万下载量,123M)

2. ClosedXML(8399万下载量,84M)

3. NPOI(5872万下载量, 58.8M)

4. SpreadsheetLight(284万下载量,2.8M),跨平台可能会有GDI+(图形设备接口)的初始化问题、兼容性问题;

5. ExcelDataReader(6092万下载量,61M) ,ExcelDataWriter(0.89万下载量,9.0K)

6. Microsoft.Office.Interop.Excel(2148万下载量,21.5M), 需要依赖Microsoft office,跨平台就不用考虑了;

7. Syncfusion Excel (XlsIO)、GemBox.Spreadsheet都是功能强大的商业库;

 下面就分别说一下。

使用场景及示例

下面就用代码来实际说一下,实验环境为使用Avalonia读取到了文件流:

await using var stream = await file.OpenReadAsync(); //已经读取到stream流

 下面就用各个库来分析获取想要的数据。

1. EPPlus

EPPlus是一个非常流行的开源 .NET 库,用于读取和写入 Excel 文件(只适用.xlsx 格式);

开源,跨平台;

性能优秀,适合处理大型 Excel 文件;

支持 LINQ 查询,可以方便地对 Excel 数据进行操作和过滤;

支持许多 Excel 公式和函数,可以在文档中直接使用;

单元格的行、列Index是从1开始;

private async Task<List<TemplateData>> ReadFilesByEpplus(Stream stream)
{
    try
    {
        ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
        using var package = new ExcelPackage(stream); // 用流加载Excel包  
        var worksheet = package.Workbook.Worksheets[0]; // 获取第一个工作表  

        var datas = new List<TemplateData>();
        var rowCount = worksheet.Dimension.End.Row;  
        var colCount = worksheet.Dimension.End.Column;  
        // 遍历每一行  
        for (var row = 2; row <= rowCount; row++) // 从第二行开始  
        {
            var t = new ExcelRow()
            {
                ColumnData = new List<string>()
            };
            // 遍历每一列  
            for (var col = 1; col <= colCount; col++)  
            {  
                var cellValue = worksheet.Cells[row, col].Text; // 获取当前单元格的文本  
                t.ColumnData.Add(cellValue); // 将值添加到ColumnData  
            }
            // 将读取的数据添加到列表  
            datas.Add(t.ToTemplateData());  
        } 
        return datas;
    }
    catch (Exception e)
    {
        var logger = LogManager.GetCurrentClassLogger();
        logger.Error($"ReadFiles Exception: {e.Message}");
        return null;
    }
}

 值得一提的是,EPPlus 从版本 5 开始引入了许可证管理,所以在使用的代码中设置ExcelPackage.LicenseContext 属性:

ExcelPackage.LicenseContext = LicenseContext.NonCommercial; // 对于非商业用途

当然,也可以在配置文件中设置。

如果不进行设置的话,会触发异常:

Exception: Please set the ExcelPackage.LicenseContext property. See https://epplussoftware.com/developers/licenseexception

EPPlus 官网也给出了解决方案:

1. 代码中直接设置:

 2. 配置文件

3. 环境变量

 2. NPOI

NPOI 也是一个比较好用的非常流行的开源 .NET 库,而且不仅可以处理Excel,也支持 Word 文档(.doc 和 .docx)、PowerPoint(.ppt 和 .pptx)等其他Office 文件格式。

支持读取 .xls 和 .xlsx 文件,但导入方式不同。需要根据文件格式使用 HSSFWorkbook 或 XSSFWorkbook;支持公式、样式、图表和图像的管理;操作工作表(如插入、删除或修改行和列);

NPOI单元格行、列Index都是从0开始;

private async Task<List<TemplateData>> ReadFiles(Stream stream)
{
    try
    {
        var workbook = new XSSFWorkbook(stream);  
        var worksheet = workbook.GetSheetAt(0);

        var datas = new List<TemplateData>();
        for (var row = 1; row <= worksheet.LastRowNum; row++) // row=1 跳过表头  
        {  
            var temp = new ExcelRow { ColumnData = new List<string>() };
            var currentRow = worksheet.GetRow(row); // 获取当前行  
            if (currentRow == null) continue; // 确保行不为空  
            for (var col = 0; col < currentRow.LastCellNum; col++) // 遍历每一列  
            {  
                var cell = currentRow.GetCell(col); // 获取当前列的单元格,得到的是单元格的内容  
                // 尝试获取单元格的值  
                var cellValue = cell?.ToString(); // 转换为字符串  
                temp.ColumnData.Add(cellValue); // 添加到 ColumnData 列表中  
            }  
            // 将读取的数据添加到列表  
            datas.Add(temp.ToTemplateData());
        } 
        return datas;
    }
    catch (Exception e)
    {
        var logger = LogManager.GetCurrentClassLogger();
        logger.Error($"ReadFiles Exception: {e.Message}");
        return null;
    }
}
 3. ClosedXml

能够快速创建、读取、写入和修改 Excel 文件,而不需要深入了解 Excel 的复杂结构,ClosedXML 库的目标是使 Excel 操作简单而强大;

支持单元格写入、格式化、图表生成、数据验证、合并单元格等,能够满足大多数 Excel 操作的需求;

支持 LINQ 查询;

仅支持 .xlsx 格式,不可以操作 .xls 文件;

单元格行、列index从1开始;

private async Task<List<TemplateData>> ReadFilesByClosedXml(Stream stream)
{
    try
    {
        using var workbook = new XLWorkbook(stream);
        var worksheet = workbook.Worksheet(1);

        var datas = new List<TemplateData>();
        var rowNum = worksheet.LastRowUsed().RowNumber();
        for (var row = 2; row <= rowNum; row++) // row=1 跳过表头  
        {  
            var temp = new ExcelRow { ColumnData = new List<string>() };
            var colNum = worksheet.LastColumnUsed().ColumnNumber();
            for (var col = 1; col <= colNum; col++) // 遍历每一列  
            {  
                // 获取当前列的单元格
                var cell = worksheet.Cell(row,col).GetString(); 
                // 尝试获取单元格的值  
                temp.ColumnData.Add(cell); // 添加到 ColumnData 列表中  
            }  
            // 将读取的数据添加到列表  
            datas.Add(temp.ToTemplateData());
        } 
        return datas;
    }
    catch (Exception e)
    {
        var logger = LogManager.GetCurrentClassLogger();
        logger.Error($"ReadFiles Exception: {e.Message}");
        return null;
    }
}
4. SpreadsheetLight

轻量级的.NET库,创建、读取、写入、图表支持、数据验证等;适合快速开发和原型制作。

开源,可在Mono框架下运行,实现跨平台,不过得不偿失,仍可能会有些兼容性问题,

比如:

“Exception: The type initializer for 'Gdip' threw an exception” ;
 5.ExcelDataReader 开源库

是一个用于读取 Excel 文件的轻量级库,特别适用于 .xls 和 .xlsx 文件格式。专为快速和高效的数据读取而设计,特别适合需要将 Excel 数据导入到数据库或进行其他处理的场景。只支持数据的读取,而不支持 Excel 文件的写入和格式化;

行、列index从0开始;

private async Task<List<TemplateData>> ReadFiles(IStorageFile file)
{
    try
    {
        Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);  
        var datas = new List<TemplateData>();
        await using var stream = await file.OpenReadAsync();
        using var reader = ExcelReaderFactory.CreateReader(stream);
        // 读取所有数据  
        var result = reader.AsDataSet();  

        // 遍历获取的 DataSet
        foreach (DataTable table in result.Tables)  
        {  
            Console.WriteLine($"Sheet: {table.TableName}");  
            for (var row = 1; row < table.Rows.Count; row++) //跳过第一行
            {
                var temp = new ExcelRow { ColumnData = [] };
                for (var col = 0; col < table.Rows[row].ItemArray.Length; col++)
                {
                    var cell = table.Rows[row][col];
                    temp.ColumnData.Add(cell?.ToString());
                }
                datas.Add(temp.ToTemplateData());
            }
        }

        return datas;
    }
    catch (Exception e)
    {
        var logger = LogManager.GetCurrentClassLogger();
        logger.Error($"ReadFiles Exception: {e.Message}");
        return null;
    }
}
 6. ExcelDataWriter

ExcelDataWriter 是一个专门用于在 .NET 环境中处理 Excel 表格的轻量级库,主要用于将数据以 Excel 格式写入文件。

只支持生成 Excel 文件,且只能生成.xlsx 文件;

它与ExcelDataReader并不是同一个库,且他们之间没有任何关系,不是同一个作者。

还要依赖于EPPLus。

总结

前三个库都是比较好用且使用比较多的,且开源跨平台,推荐使用前三种,稳定,使用起来也放心,易于维护。使用方法大差不差,但是还是需要注意个别差异,比如单元格行、列Index有的是从1开始,而有的是从0开始......


http://www.niftyadmin.cn/n/5797188.html

相关文章

[c++进阶(三)]单例模式及特殊类的设计

1.前言 在实际场景中,总会遇见一些特殊情况,比如设计一个类,只能在堆上开辟空间, 或者是设计一个类只能实例化一个对象。那么我们应该如何编写代码呢&#xff1f;本篇将会详细的介绍 本章重点&#xff1a; 本篇文章着重讲解如何设计一些特殊 的类,包括不能被拷贝,只能在栈/堆上…

基于哈希的字符串子串匹配算法

标题&#xff1a;基于哈希的字符串子串匹配算法 摘要&#xff1a; 本文介绍了一种基于哈希的算法&#xff0c;用于快速比较两个字符串中子串的相似性。该算法利用了Rabin-Karp算法的思想&#xff0c;通过计算子串的哈希值来快速判断它们是否相同。这种方法在处理大量数据时具有…

关于ftp.ncbi.nlm.nih.gov数据下载路由调整的记录

经查防火墙看到ftp.ncbi.nlm.nih.gov的流量比较大&#xff0c;对专线带宽使用造成比较大的负担。 于是把ftp.ncbi.nlm.nih.gov改从PPOE线出&#xff0c;发现下载速度下降好多。通过流量图进行分析&#xff0c; 可以看出路由走PPOE时&#xff0c;仅HTTPS协议有通迅流量&#xf…

CS 144 check4: interoperating in the world

Lectures Note 略 Exercises 执行cmake --build build --target check_webget发现超出12s了。 1、回看check0的代码&#xff0c;似乎不需要关闭写入方向&#xff0c;于是注释掉&#xff08;关键&#xff09; 2、将request的变量类型从string转为string_view&#xff08;顺手…

VSCode 搭建Python编程环境 2024新版图文安装教程(Python环境搭建+VSCode安装+运行测试+背景图设置)

名人说&#xff1a;一点浩然气&#xff0c;千里快哉风。—— 苏轼《水调歌头》 创作者&#xff1a;Code_流苏(CSDN) 目录 一、Python环境安装二、VScode下载及安装三、VSCode配置Python环境四、运行测试五、背景图设置 很高兴你打开了这篇博客&#xff0c;更多详细的安装教程&…

几种广泛使用的 C++ 编译器

C 编译器有很多种&#xff0c;它们在不同的操作系统和开发环境中提供服务。以下是几种广泛使用的 C 编译器&#xff1a; 1. GCC (GNU Compiler Collection) 平台&#xff1a;跨平台&#xff08;Linux, macOS, Windows&#xff09;特点&#xff1a;GCC 是一个自由软件编译器套…

如何使用Python编写有效的网页抓取脚本以获取和处理数据?

要编写有效的网页抓取脚本以获取和处理数据&#xff0c;你可以使用Python的一些库和技术。下面是一些建议的步骤和工具&#xff1a; 安装必要的库&#xff1a;首先&#xff0c;你需要安装requests库&#xff0c;它是一个简单且功能强大的HTTP库&#xff0c;用于发送HTTP请求和…

【Mac】安装 PaddleOCR

环境&#xff1a;Mac M1 芯片 1、安装 1.1 安装 Anaconda Anaconda 安装较为简单&#xff0c;直接在 Anaconda 官网 下载pkg文件&#xff0c;根据向导提示完成安装。 Anaconda 用于搭建 Python 虚拟环境&#xff0c;目的是为了避免与之前环境安装库的版本冲突&#xff0c;另…