.NET导出Excel的四种方法及评测
导出Excel
是.NET
的常见需求,开源社区、市场上,都提供了不少各式各样的Excel
操作相关包。本文,我将使用NPOI
、EPPlus
、OpenXML
、Aspose.Cells
四个市面上常见的库,各完成一个导出Excel
示例。然后对其代码风格和性能做一个横向比较。最后我将说出我自己的感想。
文中所有的示例代码可以在这里下载:
https://github.com/sdcb/blog-data/tree/master/2019/20190824-dotnet-excel-compare
NPOI
NPOI
源自于Java
写的Apache POI,目前最新版本是2.4.1
。NPOI
是开源项目,作者是华人,项目地址是:https://github.com/tonyqus/npoi。
几年前大家导出Excel
都使用COM
,但COM
不方便,这个组件的推出无疑弥补了.NET
在Excel
方面组件的空白,大家都说比COM
好用。
NPOI
还加入了.NET Core Community组织。
EPPlus
EPPlus
是另一个开源的Excel
操作库,目前最新版本是4.5.3.2
。Github
地址如下:https://github.com/JanKallman/EPPlus。
EPPlus
仅依赖基础类库(BCL
),完全没有第三方包依赖,也是.NET
原生库。
EPPlus
只支持导出Office 2007
之后的格式,也就是xlsx
。这已经是存在12年的格式了,但如果有客户想要导出xls
,EPPlus
将不支持。
OpenXML
OpenXML
的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
是不开源,付费的库,但提供无限期的试用,据官方网站显示,试用版将:
- 限制打开文件数量100个
- 限制使用Aspose.Cells.GridWeb功能
- 生成的
Excel
将添加如下水印:
![.NET导出Excel的四种方法及评测_第1张图片](http://img.e-com-net.com/image/info8/88a168a23079403e9c0c88877e4f0626.png)
但经过我的试用,无论是并行还是串行,都没找到限制打开文件数量100个的限制。因此,“试用版”对我们的物理限制,就只有这个水印了(当然加了这个水印客户肯定也不会有好表情?)。
Excel-COM
COM是随着Excel安装而自带的库,Excel
的包名叫Microsoft.Office.Interop.Excel
。本文不会深入解析,具体可以看这篇文档。
我想要多说两句的是,COM
的old-fashion
(过时)不是没有原因的,据我所知COM
有以下缺点:
- 调用时会启动一个进程外的
excel.exe
,可能因为它为是专门为Office设计的(不是为.NET
集成设计的)
- 要求目标环境安装相关软件,没安装将无法运行
- 显然也没办法跨平台
- 使用了大量动态/多参数接口,对开发不是很友好
- 不像托管内存,
COM
对资源释放也有要求,具体参见这篇文章
横向比较
包依赖 |
有1个 |
无 |
无 |
无 |
封装程度 |
正常 |
正常 |
低层 |
正常 |
支持格式 |
完善 |
仅xlsx |
仅xlsx |
完善 |
开源协议 |
Apache-2.0 |
LGPL |
MIT |
不开源 |
收费类型 |
开源免费 |
开源免费 |
开源免费 |
试用/付费 |
评测说明
版本与数据
所有代码的版本号基于上文中提到的最新稳定版本:
最新版本 |
2.4.1 |
4.5.3.2 |
2.9.1 |
19.8.0 |
数据全部基于我上篇文章使用的6万条/10列的数据,总共数据量19,166 KB
。所有数据可以从这里下载:
https://github.com/sdcb/blog-data/tree/master/2019/20190821-generate-lorem-data
环境
CPU |
E3-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;
,确保每次运行都会在新进程中运行,不会互相影响。
我的性能测试函数介绍
IEnumerable