.NET导出Excel的四种方法及评测

前言导出Excel是.NET的常见需求,开源社区、市场上,都提供了不少各式各样的Excel操作相关包 。本文,我将使用NPOI、EPPlus、OpenXML、Aspose.Cells四个市面上常见的库,各完成一个导出Excel示例 。然后对其代码风格和性能做一个横向比较 。最后我将说出我自己的感想 。
文中所有的示例代码可以在这里下载:
https://github.com/sdcb/blog-data/tree/master/2019/20190824-dotnet-excel-compare
 
NPOINPOI源自于JAVA的Apache POI(https://poi.apache.org/),目前最新版本是2.4.1 。NPOI是开源项目,作者是华人(https://github.com/tonyqus/),项目地址是:https://github.com/tonyqus/npoi 。
几年前大家导出Excel都使用COM,但COM不方便,这个组件的推出无疑弥补了.NET在Excel方面组件的空白,大家都说比COM好用 。
NPOI还加入了.NET Core Community组织,项目地址是:https://github.com/dotnetcore/NPOI 。
 
EPPlusEPPlus是另一个开源的Excel操作库,目前最新版本是4.5.3.2 。Github地址是:https://github.com/JanKallman/EPPlus 。
EPPlus仅依赖基础类库BCL,完全没有第三方包依赖,也是.NET原生库 。
EPPlus只支持导出office 2007之后的格式,也就是xlsx 。这已经是存在12年的格式了,但如果有客户想要导出xls,EPPlus将不支持 。
 
OpenXMLOpenXML的NuGet包全称是DocumentFormat.OpenXml:是微软推出的较为低层的Excel操作库,最新稳定版本是2.9.1 。OpenXML也是开源项目,地址是:https://github.com/OfficeDev/Open-XML-SDK 。
从该项目的名字可以看出,OpenXML比较涉及底层,因此很容易令人浮想联翩,感觉它的性能、速度很可能是最快的,但真的如此吗?
 
Aspose.Cells这是Aspose Pty Ltd公司推出的Excel操作库 。它是众多Aspose File Format API产品其中之一 。目前最新版本是19.8.0(基于年/月) 。Aspose提供了应有尽有的文件格式支持,除了.NET外,Aspose还提供了C++和Java的包 。
据我所知Aspose的客户支持服务也不错,客户提出的问题经常可以在下一次发布时解决 。
Aspose.Cells是不开源,付费的库,但提供无限期的试用,据[官方网站](https://docs.aspose.com/display/cellsnet/Licensing#Licensing-EvaluationVersionLimitations)显示,试用版将
限制打开文件数量100个
限制使用Aspose.Cells.GridWeb功能
生成的Excel将添加如下水印:

.NET导出Excel的四种方法及评测

文章插图
但经过我的试用,无论是并行还是串行,都没找到限制打开文件数量100个的限制 。因此,“试用版”对我们的物理限制,就只有这个水印了(当然加了这个水印,客户肯定也不会有好表情) 。
 
Excel-COMCOM是随着Excel安装而自带的库,Excel的包名叫Microsoft.Office.Interop.Excel 。本文不会深入解析,具体可以看[这篇文档](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interop/how-to-access-office-onterop-objects) 。
我想要多说两句的是,COM的old-fashion(过时)不是没有原因的,据我所知COM有以下缺点:
  • 调用时会启动一个进程外的excel.exe,可能因为它为是专门为Office设计的(不是为.NET集成设计的)
  • 要求目标环境安装相关软件,没安装将无法运行
  • 显然也没办法跨平台
  • 使用了大量动态/多参数接口,对开发不是很友好
  • 不像托管内存,COM对资源释放也有要求,具体参见[这篇文章](https://www.breezetree.com/blog/common-mistakes-programming-excel-with-c-sharp)
 
横向比较  NPOIEPPlusOpenXMLAspose包依赖有1个无无无封装程度正常正常低层正常支持格式完善仅xlsx仅xlsx完善开源协议Apache-2.0LGPLMIT不开源收费类型免费免费免费收费  
评测说明版本与数据【.NET导出Excel的四种方法及评测】所有代码的版本号基于上文中提到的最新稳定版本:
包最新稳定版本号NPOI2.4.1EPPlus4.5.3.2OpenXML2.9.1Aspose.Cells19.8.0 数据全部基于我上篇文章使用的6万条/10列的数据,总共数据量19,166 KB 。所有数据可以从这里下载:https://github.com/sdcb/blog-data/tree/master/2019/20190821-generate-lorem-data
 
环境 项目值CPUE3-1230 v3 @ 3.30GHz内存24GB DDR3-1600 MHz (8GBx3)操作系统windows 10 1903 64位电源选项已设置为“高性能”软件LINQPad 6.0.18运行时环境.NET Core 3.0-preview8-28405-07 注意,LINQPad设置了optimize+,代码都是优化后执行的;代码都指定了Util.NewProcess = true;,确保每次运行都会在新进程中运行,不会互相影响 。


推荐阅读