JAVA Excel导入导出技术选型(Apache POI、EasyPoi、EasyExcel)
Apache POI、EasyPoi、EasyExcel对比使用
一、Apache POI 简介
是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office(Excel、WORD、PowerPoint、Visio等)格式档案读和写的功能。
Apache POI是java原生的,可以精细到对每个表单,每个单元格进行操作,封装度较低,使用起来需写大量的代码,并且性能较低,可以入门使用,这里不详细介绍。
EasyPoi和EasyExcel都是基于Apache POI进行二次开发的,都做了封装处理使用起来很方便。
官方文档为英文,这里放个使用范例:
Apache POI使用详解monday的博客-CSDN博客apachepoi
二、EasyPOI简介
Easypoi 为谁而开发
不太熟悉poi的
不想写太多重复太多的
只是简单的导入导出的
喜欢使用模板的
基于注解的导入导出,修改注解就可以修改Excel
官方文档:
三、EasyExcel简介
EasyExcel是阿里巴巴开源的一款 excel 解析工具,是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。 github地址:https://github.com/alibaba/easyexcel
官方文档:
单就代码简洁度来说,EasyPOI和EasyExcel封装度都比较高,使用起来非常方便,可以不写工具类直接调用,但两者的性能和内存消耗有着大的差异,接下来说下实际测试结果:
环境: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导入导出技术选型 |
综上:就导出效率来说EasyPoi和EasyExcel相差不大,但内存消耗和系统稳定性EasyExcel更好,更加推荐使用。
版权声明:本文为博主原创文章,转载请附上原文出处链接
https://blog.csdn.net/chang_mao/article/details/135956470?spm=1001.2014.3001.5501