有两种主要的方法来操作Excel。Net平台。第一,把Excel文件看成一个数据库,由OleDb读取和操作。第二,调用Excel的COM组件。两种方法各有特点。
今天给大家介绍第三种方法:外挂法。目前大多数主流框架都需要将所有数据加载到内存中以便于操作,但这样会导致内存消耗问题。MiniExcel尝试从流的角度写底层算法逻辑。
可以将原来1000多MB的占用减少到几MB,避免内存不足的情况。MiniExcel简单高效,避免了OOM的。NET处理Excel工具,用于搜索、写入和填充数据。
特点内存消耗低,避免了OOM和频繁全GC的情况,支持每一行数据的实时操作,结合LINQ延迟查询特性,可以实现低消耗、快速分页等复杂查询功能。
You don't need to install Microsoft Office, COM,
DLL小于150KB API风格性能对比,测试导入,查询Excel对比逻辑:以Test1,000,000x10.xlsx为基准,用主流框架做性能测试。
总共1,000,000行* 10列的笔‘hello world’,文件大小为23 MB。导出并创建Excel比较逻辑:创建1000万个“HelloWorld”
使用示例
1、读/导入Excel1.1查询查询擅长返回强型别IEnumerable数据public类用户帐户{ public Guid ID { get设置;}公共字符串名称{获取设置;}公共日期时间BoD { get设置;} public int Age { get设置;} public bool VIP { get设置;}公共小数点{获取设置;}}var rows=MiniExcel .查询(路径);//orusing (var stream=File .var rows=stream .query();
Can cooperate with LINQ first/band/skip to achieve low consumption and high efficiency for complex queries var row=MiniExcel. Query (path). first(); Assertion. Equal('HelloWorld 'row。 a); //orusing (var stream=File。 OpenRead(path)){ var row=stream。 Query (). first(); Assertion. Equal('HelloWorld 'row。 a); } Efficiency comparison with other frameworks:
1.3阅读大文件的盘基缓存-SharedString的概念:当MiniExcel判断文件SharedString的大小超过5MB时,会默认使用本地缓存。
比如10x100000.xlsx(一百万条数据),在不打开本地缓存的情况下读取所需的最大内存占用约为195MB,打开后减少到65MB。不过需要注意的是,这种优化是以时间换取内存的减少,所以读取效率会变慢。
在这个例子中,读取时间从7.4秒增加到27.2秒。如果没有必要,请使用以下代码关闭硬盘缓存。
var config=new openxml configuration { EnableSharedStringCache=false }; Mini Excel. Query (path, configuration: configuration) can also use SharedStringCacheSize to adjust the shared string file size beyond the specified size before hard disk caching.
var config=new OpenXmlConfiguration { SharedStringCacheSize=500*1024*1024 };MiniExcel.Query(path, configuration: config);
Please don't read all the data into memory by means of ToList unless necessary. 2.1 supports the collection anonymous category or strongly typed var path=Path. Combination (path. GetTempPath(),$'{Guid。 NewGuid()}。 xlsx’); Mini Excel. SaveAs(path,new[] { new { Column1='MiniExcel 'Column2=1 },new { Column1='Github 'column 2=2 } }); 2.2 IDataReader is recommended.
3.模板填充的Excel声明类似于Vue template {{variable name}},或者set rendering {{set name。字段名}}集合渲染支持IEUMERABLE/DATABLE/dapper row 3.1基本填充。
//1.By POCOvar value=new{ Name='Jack 'CreateDate=new DateTime(2021,01,01),VIP=true,Points=123 };迷你Excel .SaveAsByTemplate(路径,模板路径,值);//2 . by Dictionary var value=new Dictionary(){[' Name ']=' Jack '[' create date ']=new DateTime(2021,01,01),['VIP']=true,[' Points ']=123 };迷你Excel .SaveAsByTemplate(路径,模板路径,值);3.2 复杂数据填充
//1 . by poco var value=new { title=' foo company 'managers=new[] { new {name='Jack 'department='HR'},new {name='Loan 'department='IT'},employees=new[] { new {name='Wade 'department='HR'},new {name='Felix 'department='HR'},new {name='Eric 'department='IT'},new {name='Keaton 'department=' IT ' };迷你Excel .SaveAsByTemplate(路径,模板路径,值);//2 . by Dictionary var value=new Dictionary(){[' title ']=' foo company '[' managers ']=new[]{ new { name=' Jack 'department='HR'},new {name='Loan 'department='IT'},[' employees ']=new[]{ new { name=' Wade 'department='HR'},new {name='Felix 'department='HR'},new {name='Eric 'department='IT'},new { name=' IT ' },new { name='迷你Excel .SaveAsByTemplate(路径,模板路径,值);4、Excel列属性(Excel列属性)
卡特格里安科恩的流不是最好的,因为他自己就是最好的流。SaveAs(excelType:ExcelType).CSV);orstream的SaveAs(excelType:ExcelType).XLSX);orstream的. Query(excel type:excel type)CSV);orstream的. Query(excel type:excel type)XLSX);GithubAdresse private ant wort:1011,
标题:NET操作Excel高效低内存的开源框架
链接:https://www.52hkw.com/news/rj/58046.html
版权:文章转载自网络,如有侵权,请联系删除!