LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C#.net试用MiniExcel优雅的操作Excel

admin
2023年9月7日 16:8 本文热度 1413

大家有没有过这样的经历:开发某个项目,需要调用Excel控件去生成Excel文件、填充数据、改变格式等等,常常在测试环境中一切正常,但在生产环境却无法正常调用Excel,不是安装的Excel版本不正确导致调用错误,就是因为超额数据量导致调用控件消耗内存过大,无法顺利解决问题,搞得码农心态崩溃,导致DeadLine延迟?现在好了,铛铛铛,值得推荐的一款实用控件来了:MiniExcel!

1. 控件介绍

MiniExcel简单、高效避免’OOM’的.NET处理Excel查、写、填充数据工具。

‘OOM’,全称“Out Of Memory”,意思是“内存用完了”。它来源于java.lang.OutOfMemoryError。

目前主流框架大多需要将数据全载入到内存方便操作,但这会导致内存消耗问题,MiniExcel尝试以 Stream角度写底层算法逻辑,能让原本1000多MB占用降低到几MB,避免内存不够情况,而且不再要求系统本身必须安装Excel。

MiniExcel 是一个在 .NET 平台上用于操作 Excel 文件的库。它的特点是轻量级、简单易用,并且支持读取和写入 Excel 文件的功能。

使用 MiniExcel 可以进行以下操作:

读取 Excel 文件的数据,并将其转换为多维数组或实体对象。

将多维数组或实体对象写入 Excel 文件,并保存为.xlsx格式。

根据指定的范围读取或写入数据。

支持对单元格的样式、格式进行设置。

项目目标是:力求做最简单、最实用的Excel控件!

这个项目已经被dotNET China收录,成为一个很有前途的开源项目,并在Gitee上得到站点推荐,得到了1.1KStars。

2. 特点简述

  • 支持.Net4.5,.Net5.0,Core .Net2.0。

  • 低内存耗用,避免’OOM’(out of memoery)、频繁 Full GC 情况。

  • 支持即时操作每行数据。

  • 兼具搭配 LINQ 延迟查询特性,能办到低消耗、快速分页等复杂查询。

  • 轻量,不需要安装 Microsoft Office、COM+,DLL小于150KB。

  • 简便操作的 API 风格。

3. 安装

这个项目是通过NuGet包实现安装。简单来说,就是在.NET CLI模式下,执行如下命令即可自动安装:

dotnet add package MiniExcel --version 1.23.2

4. 性能比较与测试

Benchmarks 逻辑可以在 MiniExcel.Benchmarks 中进行查看或是提交 PR,运行指令如下:

dotnet run -p .\\benchmarks\\MiniExcel.Benchmarks\\ -c Release -f netcoreapp3.1 \-- -f \* --join

最后一次运行规格、结果:

BenchmarkDotNet=v0.12.1, OS=Windows 10.0.19042 Intel Core i7-7700 CPU 3.60GHz (Kaby Lake), 1 CPU, 8 logical and 4 physical cores [Host] : .NET Framework 4.8 (4.8.4341.0), X64 RyuJIT Job-ZYYABG : .NET Framework 4.8 (4.8.4341.0), X64 RyuJIT IterationCount=3 LaunchCount=3 WarmupCount=3

现在我们做一个查询、导入性能比较:

逻辑 : 以 Test1,000,000x10.xlsx 做基准与主流框架做性能测试,总共 1,000,000 行 *
10 列笔 “HelloWorld”,文件大小 23 MB。测试结果列在下图中:

导出、创建Excel性能比较参见下图:

5. 示例:

下面将给出部分样例和效果图,供大家参考。

using MiniExcelLibs;public void ReadExcel(string filePath){    var result = MiniExcel.Query(filePath)                          .FirstOrDefault();    // 读取第一行第一列的数据    var data = result?[0][0];    Console.WriteLine(data);}public void WriteExcel(string filePath){    var data = new List<object[]>    {        new object[] { "Name", "Age" },        new object[] { "John", 25 },        new object[] { "Amy", 30 }    };    MiniExcel.Save(filePath, data);}

  1. 以上示例代码中,通过 MiniExcel.Query 方法可以读取 Excel 文件的数据,并使用 FirstOrDefault 方法获取第一个工作表的数据。通过索引可以访问特定的单元格数据。

  2. 通过 MiniExcel.Save 方法可以将数据写入 Excel 文件,并保存为指定的路径。

  3. MiniExcel 简化了对 Excel 文件的读写操作,适用于简单的数据处理需求。相比于其他更复杂的库,MiniExcel 是一个更轻量级的选择,对于一些小规模的 Excel 操作场景可能更加适合。

  4. Query 查询 Excel 返回强型别 IEnumerable 数据。

  5.    public class UserAccount    {    public Guid ID { get; set; }    public string Name { get; set; }    public DateTime BoD { get; set; }    public int Age { get; set; }    public bool VIP { get; set; }    public decimal Points { get; set; }    }    var rows = MiniExcel.Query\<UserAccount\>(path);

// or

   using (var stream = File.OpenRead(path))    var rows = stream.Query\<UserAccount\>();

  1. 指定单元格开始读取数据

  2. MiniExcel.Query(path,useHeaderRow:true,startCell:"B3")

  1. 查询所有 Sheet 名称跟数据

  2.    var sheetNames = MiniExcel.GetSheetNames(path);    foreach (var sheetName in sheetNames)    {        var rows = MiniExcel.Query(path, sheetName: sheetName);    }
  3. 查询所有栏(列)

  4. var columns = MiniExcel.GetColumns(path); // e.g result : ["A","B"...]

高频使用示例就介绍到这里啦,有需求的伙伴可以自行获取项目地址学习更多优秀示例。

6. 最后有话说

这个开源项目提供全部源代码,方便大家下载,还提供了很详细的文档说明。

以本人使用经验来看,这个控件已经基本满足了调用Excel控件开发需求,大家可以多多尝试。而且,这个项目的团队依然在继续维护,让人很看好。

有一个这么好用的工具,在项目开发过程中会让你不用担心内存不够用,不用考虑对Excel的内容大小进行限制。所以本人很有诚意的推荐这款Mini控件啦。还有,通过对源代码的学习,可以提高自己的水平。


该文章在 2023/9/7 16:14:03 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved