开发语言和平台:Java jdk1.8
是否需要读写较老版本的Excel文件:是
性能需求:最大100M
是否需要支持高级功能(函数、图表等处理):否
Apache POI
免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office(Excel、WORD、PowerPoint、Visio等)格式档案读和写的功能。
Apache POI是java原生的,可以精细到对每个表单,每个单元格进行操作,封装度较低,使用起来需写大量的代码,并且性能较低。
-
优势: 功能最全,适用于需要高度定制Excel样式、公式等高级特性的场景。长期维护,社区庞大,遇到问题容易找到解决方案。
-
劣势: 大数据量处理时易导致内存溢出,开发效率相对较低,需手动处理很多细节。
EasyPOI
对Apache POI的封装
-
优势: 通过简化API和对象映射,快速实现Excel与Java Bean的转换,适合快速开发。提供模板功能,减少模板设计工作量。
-
劣势: 虽然改善了Apache POI的使用复杂度,但对于极大数据处理仍有性能瓶颈,且相较于Apache POI和EasyExcel,社区和资源较小。
官方文档:http://easypoi.mydoc.io/
EasyExcel
对Apache POI的封装
-
优势: 针对大数据处理进行优化,使用流式处理,极大减少了内存占用,能有效处理百万级别数据而不引起内存溢出。API简洁,易于上手。
-
劣势: 对比Apache POI,复杂格式和某些高级Excel功能支持有限,可能不适合需要高度定制的场景。
官方文档:https://easyexcel.opensource.alibaba.com/docs/current/
EasyPOI和EasyExcel对比
EasyExcel | EasyPOI | ||
Github fork数 | 7.4k | github没有项目 | |
Gitee fork数 | 191 | 2.7k | |
版本数 | 52 | 12 | |
最后更新时间 | 2个月前 | 6个月前 | |
漏洞数量 | 0 | 0 | 查询平台: https://nvd.nist.gov/products/cpe/search ; https://www.cvedetails.com/vulnerability-search.php |
性能比较
环境:Xms512m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=logs -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:logs/Gc.log;
即最大堆内存512mb,打印过程中的Gc日志以及堆内存溢出报错,数据量65535条数据(Apache POI支持的最大数据,EasyPOI和EasyExcel没有限制);
每条数据5个字段(字段长度为UUID字符串),使用apache-jmeter进行压力测试,分别用1个线程和10个线程测试两者的性能,使用JDK自带程序jvisualvm.exe观察项目堆内存的变化以及单个线程(即一次请求)的内存消耗。
EasyPOI测试结果:
-
单个线程测试:
单次请求使用总内存为714Mb,期间发生几次Young GC和一次Full GC,服务正常运行,导出一次所需时间为4秒钟。
-
10个线程同时请求:
服务崩溃,系统出现内存溢出java.lang.OutOfMemoryError: GC overhead limit exceeded,在降低数据级后测试,发现在10个线程同时请求导出3万条数据已经发生内存溢出错误,1万条压力可以承受。
EasyExcel测试结果:
-
单个线程测试:
可见每次使用的总内存量为1.6Gb,比EasyPOI要大,系统查看Gc日志发生几次Young GC,没有Full GC,导出一次所需时间为2秒钟。
-
10个线程同时请求:
服务停滞很久,查看Gc日志发现服务一直在频繁进行Full Gc,在20秒过后导出成功,服务没有崩溃,可见虽然EasyExcel单个线程使用内存总量比较多,但内存使用后及时释放,没有导致堆内存溢出,由于系统发生Full Gc期间JVM处于停顿状态,所以导出时间较长,在20秒左右导出成功。
实测在8万条左右也发生了堆内存溢出java.lang.OutOfMemoryError: GC overhead limit exceeded,可见EasyExcel虽然内存占用少,但也有上限,相对于EasyPOI对内存控制的更好。
总结
单个线程测试结果
技术栈 | 线程内存增量 | 服务状态 | 导出所需时间 | Young Gc次数 | Full Gc次数 |
EasyPOI | 714MB | 正常 | 平均2.5s | 10次 | 偶发1次 |
EasyExcel | 1.6GB | 正常 | 平均2s | 12次 | 0次 |
10个线程测试结果
技术栈 | 线程内存增量 | 服务状态 | 导出所需时间 | Full Gc次数 |
EasyPOI | 平均每个线程700MB | OutOfMemoryError | -/- | 多次Full Gc后崩溃 |
EasyExcel | 平均每个线程 1.6GB | 卡顿一段时间正常运行 | 平均16s | 频繁进行Full GcJAVA Excel导入导出技术选型 |
功能差别
Apache POI:
-
功能最为全面,不仅支持Excel(包括
.xls
和.xlsx
等多种版本),还支持Word、PowerPoint等Microsoft Office文件格式的读写操作。 -
提供了丰富的API,允许开发者进行低级别控制,比如直接操作单元格、样式、图表等,适合处理复杂Excel特性或需要操作其他Office文件的应用场景。
-
由于其底层性和高度灵活性,使用Apache POI可能需要编写更多的代码,并且对开发者要求较高,了解Excel内部结构会有助于更高效地使用它。
EasyPoi:
-
基于Apache POI进行了封装,主要聚焦于简化Excel的导入导出操作,特别是通过对象映射功能,能够快速地将Java对象与Excel表格相互转换。
-
支持模板导出,使得生成格式化报表变得简便,减少了样式设置的工作量。
-
通过注解配置,减少硬编码,提高开发效率,适合需要快速开发常规Excel处理功能的项目。
EasyExcel:
-
专为处理大规模数据而设计,采用流式处理方式,能够有效避免处理大量数据时的内存溢出问题。
-
相较于Apache POI,EasyExcel的API更简洁,易于上手,特别适合初学者或对性能有严格要求的场景。
-
支持注解映射,简化数据对象与Excel行的映射过程,同时也提供了方便的回调机制来处理读写过程中的逻辑。
总结: Apache POI是基础且强大的工具,适合处理各种复杂场景;EasyPoi着重于简化常规的Excel导入导出操作,提高开发速度;而EasyExcel则专注于大数据量的高效处理,特别适合批量数据的导出导入任务。
相关资料链接:
https://wenku.csdn.net/answer/3qdhygz076
https://www.cnblogs.com/wujiaxing/p/14714787.html
http://www.manongjc.com/detail/16-ajxwgojlpppminn.html
https://blog.csdn.net/chang_mao/article/details/135956470
具体
Apache POI | EasyPoi | EasyExcel |
广泛格式支持: 支持读写多种Microsoft Office文件格式,包括早期的 | 模板导出:强化了对模板导出的支持,可以直接利用预设的Excel模板进行数据填充,简化了报表样式的定义过程,而EasyExcel和原生Apache POI在使用模板时可能需要更多的手动配置。 | 流式处理: 最大特点是支持大数据量的流式读写,能够有效处理百万级别的数据记录而不引起内存溢出(OOM),这是Apache POI和EasyPoi在未经特殊优化时难以直接实现的。 |
深度定制:提供更底层的API,允许对单元格样式、公式、图表等进行细致的定制,适合需要高度自定义Excel功能的场景,这是EasyExcel和EasyPoi可能无法直接提供的。 | 简化对象映射: 通过注解和少量配置即可实现Java Bean与Excel表单的自动映射,这一特性使得数据导入导出更为便捷,虽然EasyExcel也支持注解映射,但EasyPoi在此方面可能提供了更丰富的模板处理能力。 | API简洁性: 相比Apache POI复杂的API,EasyExcel提供了更为简洁直观的操作接口,降低了学习成本,特别是在进行大量数据写入操作时更为明显。 |
总结:EasyExcel没有Apache POI那样广泛的Office文件格式支持,Apache POI没有EasyExcel的高效流式处理大规模数据的能力,而EasyPoi可能在模板导出的便捷性和深度上超过EasyExcel。