大家有没有过这样的经历:开发某个项目,需要调用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);}
以上示例代码中,通过 MiniExcel.Query 方法可以读取 Excel 文件的数据,并使用 FirstOrDefault 方法获取第一个工作表的数据。通过索引可以访问特定的单元格数据。
通过 MiniExcel.Save 方法可以将数据写入 Excel 文件,并保存为指定的路径。
MiniExcel 简化了对 Excel 文件的读写操作,适用于简单的数据处理需求。相比于其他更复杂的库,MiniExcel 是一个更轻量级的选择,对于一些小规模的 Excel 操作场景可能更加适合。
Query 查询 Excel 返回强型别 IEnumerable 数据。
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\>();
指定单元格开始读取数据
MiniExcel.Query(path,useHeaderRow:true,startCell:"B3")
查询所有 Sheet 名称跟数据
var sheetNames = MiniExcel.GetSheetNames(path);
foreach (var sheetName in sheetNames)
{
var rows = MiniExcel.Query(path, sheetName: sheetName);
}
查询所有栏(列)
var columns = MiniExcel.GetColumns(path);
高频使用示例就介绍到这里啦,有需求的伙伴可以自行获取项目地址学习更多优秀示例。
6. 最后有话说
这个开源项目提供全部源代码,方便大家下载,还提供了很详细的文档说明。
以本人使用经验来看,这个控件已经基本满足了调用Excel控件开发需求,大家可以多多尝试。而且,这个项目的团队依然在继续维护,让人很看好。
有一个这么好用的工具,在项目开发过程中会让你不用担心内存不够用,不用考虑对Excel的内容大小进行限制。所以本人很有诚意的推荐这款Mini控件啦。还有,通过对源代码的学习,可以提高自己的水平。
该文章在 2023/9/7 16:14:03 编辑过