大数据量导出Excel的方案 POI、JXL、FastExcel比较

news/2024/7/21 4:53:04 标签: Excel, XML, 单元测试, Access, JVM
大数据量导出Excel的方案 POI、JXL、FastExcel比较
试共同条件:
数据总数为110011条,每条数据条数为19个字段。

一、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 能 能

提高JVM的大小几乎没效果……

http://www.niftyadmin.cn/n/595254.html

相关文章

网络与信息安全初探

一、什么是网络信息安全诞生于20世纪六七十年代计算机互联网通讯技术,发展至今,自下而上架构了以基础“物理层”、数字“代码层”、信息“内容层”三个基本层面构成的闭合系统,塑造了世界范围内各行为体密切链接的网络空间。这一空间打通了“…

移动硬盘无法读取分区表修复RAW格式修复

突然发现连在玩客云上的320G西数的移动硬盘读不出了,拔出来后连在台式机笔记本上都是无法识别。摸了一下硬盘还在转,想了好多办法都修复不了,上网查了一下应该是分区表被损坏了。后来用台式机通过老毛桃的winpe系统,用里面的磁盘修…

CentOS7下mongodb忘记密码后重置密码

新装mongodb后,结果一段时间没有用,密码给忘记了,只能重置密码了。 步骤如下: 1、找到mongodb的配置文件 通过ps -ef|grep mongod找到mongodb的配置文件mongod.conf 也可以通过find / -name mongod.conf找到配置文件 发现配置文件…

关于ServerSocketChannel和SocketChannel

1 这两个类是抽象类 源码里面它们的前面是加了abstract的。 2 抽象类是不能new出实例的 3 这两个类使用静态方法open创建其子类的实例 有动态绑定原理可知,返回的ServerSocketChannel和SocketChannel引用指向的是其子类的对象。在调用accept()、connect()等虚函数的…

J2EE开发者选择何种AJAX框架

<iframe align"top" marginwidth"0" marginheight"0" src"http://www.zealware.com/csdnblog01.html" frameborder"0" width"728" scrolling"no" height"90"></iframe>在下面这篇…

MyBatis下在插入数据时获得MySQL自增长序列的值

在写代码的时候经常会碰到这样一种情况&#xff0c;就是有个A表的主键是mysql自动递增的序列&#xff0c;而这个A表的主键又是B表的外键。有时候会在同一个方法事务里先插入A表&#xff0c;然后插入B表&#xff0c;但是这时后在程序中还无法获得这个A表的自动递增的序列主键&am…

POI生成excel表格,如何合并单元格

Java代码 import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.…

@RequestParam什么时候可以省略

1 <form action"${pageContext.request.contextPath}/user/param" method"get">2 用户名&#xff1a;<input type"text" name"name">3 <input type"submit" value"param">4 &l…