博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转]Java大数据量导出Excel的问题
阅读量:7071 次
发布时间:2019-06-28

本文共 1687 字,大约阅读时间需要 5 分钟。

hot3.png

试共同条件:

数据总数为110011条,每条数据条数为19个字段。
电脑配置为:P4 2.67GHz,1G内存。
一、POI、JXL、FastExcel比较
POI、JXL、FastExcel均为java第三方开源导出Excel的开源项目。
导出方案一:一次性全部导出到一个Excel文件中。
实际情况均报OutOfMemery错误,以下数据为报OutOfMemery数据时,数据到的最大数据数目,如表1所示:
表1:报OutOfMemery错误时所能处理的数据量

FastExecl POI JXL
10000数据/sheet 37465 28996 42270
5000数据/sheet 39096 31487 46270
3000数据/sheet 39000 32493 47860

小结:

多分sheet能一定程度上减少内存的使用,但是均因为程序中创建的Cell(即为Excel中的一个单元格)无法释放,消耗大量内存,导致OutOfMemery错误;JXL表现最好,创建Cell内存使用较少。
导出方案二:先分多个Excel文件将数据全部导出,然后对多个Excel文件进行合并。
首先,测试将全部数据导出所用的时间,如表2所示,数据均测试三次取平均。
表2:导出全部数据所用时间

FastExecl POI JXL
10000数据/文件 68s 33s 30s
5000数据/文件 68s 32s 33s
3000数据/文件 59s 33s 39s

小结:

均成功导出Excel文件,原因是导出一个Excel文件,释放所占用的创建Cell的内存。
FastExecl表现最差,POI表现稳定,JXL随着数据的增大,速度一定程度上增快。
然后,进行整合,由于将多Excel合并成一个Excel文件的功能只有POI所有,故使用POI测试,结果如表3所示。
注:数据量大合并还会报OutOfMemery错误,故合并总数据量以5万为准。
表3:合并5万数据所用时间

时间
10000数据/文件 11s
5000数据/文件 11s
3000数据/文件 11s

小结:

使用POI对文件进行合并速度较快,但有数据量的限制。
总结:方案二比较可行,但是数据量有限制,为5万条。
二、导出XML 的电子表格
导出的格式类似为纯文本,能实现大数据量的存储,并能实现分Sheet查看,且能添加简单的样式,符合项目要求。经实际测试Excel2003和Excel2007均能识别并正常打开查看。使用时间测试如表4所示,数据均测试3次取平均。
表4:生成全部数据所用时间

时间
10000数据/sheet 28.0秒
20000数据/sheet 30.1秒
30000数据/sheet 28.1秒
40000数据/sheet 26.5秒
50000数据/shee 28.2秒
55000数据/sheet 26.8秒
59000数据/sheet 30.1秒
59500数据/sheet 发生假死机现象
60000数据/sheet 发生假死机现象

但是导出的数据为XML不是纯正的Excel文件,如使用Excel文件的xls后缀保存,打开文件会弹出警告,但不影响阅读。
且经实际测试,在Access2007和Access2003中可通过导入外部数据的方式,将导出的XML导入进Access数据库。
三、总结
项目要求是大数据量导出Excel文件,POI、JXL、FastExcel不能完全满足要求;使用XML 的电子表格导出实现了大数据量导出,但是格式为XML不是纯正的Excel文件,为曲线救国。两种导出形式的比较,如表5所示。
表5:合并5万数据所用时间

POI、JXL、FastExcel XML 的电子表格
导出数据格式 为纯Execl文件 为XML文件
导出数据量 较大
能否分Sheet
能否添加样式
能否添加图片 POI 能 不能
导出数据能否导入Access

转载于:https://my.oschina.net/u/158611/blog/28899

你可能感兴趣的文章
测试架构师修炼之道:“秘书九段”的故事 - 延伸至测试六段
查看>>
Silverlight数据验证
查看>>
Ubuntu始终是外国的,为什么大家这么力推?
查看>>
iOS开发滚动视图UIScrollView
查看>>
SSH服务及其扩展(sshpass和expect)
查看>>
mysql中的锁
查看>>
会话Cookie与session的关系
查看>>
Blend ---- 自定义ImageButton(图片按钮)
查看>>
04-模板层
查看>>
Beta冲刺-第二天
查看>>
call 和 apply方法解析
查看>>
Update emacs to 23.2 on Ubuntu
查看>>
C#中结构(struct)与类(class)的区别
查看>>
mount loop最大数的调整
查看>>
Android的消息机制(1)
查看>>
树的创建与遍历
查看>>
进度条控件基本使用
查看>>
DataGrid PCV排序学习
查看>>
centos7安装jdk1.8
查看>>
Vue中v-for的数据分组
查看>>