Java操作Excel技术选型

开发语言和平台: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次数
EasyPOI714MB正常平均2.5s10次偶发1次
EasyExcel1.6GB正常平均2s12次0次
10个线程测试结果
技术栈线程内存增量服务状态导出所需时间Full Gc次数
EasyPOI平均每个线程700MBOutOfMemoryError-/-多次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文件格式,包括早期的.xls.xlsx、Word的.doc.docx、PowerPoint的.ppt.pptx等,而EasyExcel主要关注Excel文件。

模板导出:强化了对模板导出的支持,可以直接利用预设的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。

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

户伟伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值