开源。NET快速简单避免OOM的Excel处理工具
《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的是一个。NET处理Excel查、写、填充数据的工具MiniExcel。
目前主流框架大多需要将数据全载入到内存方便操作,但这会导致内存消耗问题,MiniExcel尝试以Stream角度写底层算法逻辑,能让原本1000多MB占用降低到几MB,避免内存不够情况。
特性低内存耗用,避免OOM、频繁FullGC情况支持即时操作每行数据兼具搭配LINQ延迟查询特性,能办到低消耗、快速分页等复杂查询轻量,不需要安装MicrosoftOffice、COM,DLL小于150KB简便操作的API风格
性能比较导入、查询Excel比较
逻辑:以Test1,000,000x10。xlsx做基准与主流框架做性能测试,总共1,000,000行10列笔HelloWorld,文件大小23MB
导出、创建Excel比较
逻辑:创建1千万笔HelloWorld
代码示例Query查询Excel返回IEnumerable数据publicclassUserAccount{publicGuidID{get;set;}publicstringName{get;set;}publicDateTimeBoD{get;set;}publicintAge{get;set;}publicboolVIP{get;set;}publicdecimalPoints{get;set;}}varrowsMiniExcel。QueryUserAccount(path);orusing(varstreamFile。OpenRead(path))varrowsstream。QueryUserAccount();
Query查询支援延迟加载(DeferredExecution),能配合LINQFirstTakeSkip办到低消耗、高效率复杂查询
举例:查询第一笔数据varrowMiniExcel。Query(path)。First();Assert。Equal(HelloWorld,row。A);orusing(varstreamFile。OpenRead(path)){varrowstream。Query()。First();Assert。Equal(HelloWorld,row。A);}
与其他框架效率比较:
Query读Excel返回DataTable
提醒:不建议使用,因为DataTable会将数据全载入内存,失去MiniExcel低内存消耗功能。提醒:不建议使用,因为DataTable会将数据全载入内存,失去MiniExcel低内存消耗功能。
指定单元格开始读取数据MiniExcel。Query(path,useHeaderRow:true,startCell:B3)
创建多个工作表(Sheet)1。Dictionarystring,objectvarusersnew〔〕{new{NameJack,Age25},new{NameMike,Age44}};vardepartmentnew〔〕{new{ID01,NameHR},new{ID02,NameIT}};varsheetsnewDictionarystring,object{〔users〕users,〔department〕department};MiniExcel。SaveAs(path,sheets);2。DataSetvarsheetsnewDataSet();sheets。Add(UsersDataTable);sheets。Add(DepartmentDataTable);。。MiniExcel。SaveAs(path,sheets);
IEnumerable数据填充
Note1:同行从左往右以第一个IEnumerableUse当列表来源(不支持同列多集合)1。ByPOCOvarvaluenew{employeesnew〔〕{new{nameJack,departmentHR},new{nameLisa,departmentHR},new{nameJohn,departmentHR},new{nameMike,departmentIT},new{nameNeo,departmentIT},new{nameLoan,departmentIT}}};MiniExcel。SaveAsByTemplate(path,templatePath,value);2。ByDictionaryvarvaluenewDictionarystring,object(){〔employees〕new〔〕{new{nameJack,departmentHR},new{nameLisa,departmentHR},new{nameJohn,departmentHR},new{nameMike,departmentIT},new{nameNeo,departmentIT},new{nameLoan,departmentIT}}};MiniExcel。SaveAsByTemplate(path,templatePath,value);
模板:
最终效果:
END
开源协议:Apache2。0
开源地址:https:github。comMiniExcelMiniExcel