读书人

大数据量导出Excel的议案

发布时间: 2012-11-05 09:35:12 作者: rapoo

大数据量导出Excel的方案

试共同条件:
数据总数为110011条,每条数据条数为19个字段。
电脑配置为:P4 2.67GHz,1G内存。

一、POI、JXL、FastExcel比较
POI、JXL、FastExcel均为java第三方开源导出Excel的开源项目。

导出方案一:一次性全部导出到一个Excel文件中。
实际情况均报OutOfMemery错误,以下数据为报OutOfMemery数据时,数据到的最大数据数目,如表1所示:
表1:报OutOfMemery错误时所能处理的数据量

FastExeclPOI JXL 10000数据/sheet37465 28996 42270 5000数据/sheet39096 31487 46270 3000数据/sheet39000 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数据/sheet28.0秒 20000数据/sheet30.1秒 30000数据/sheet28.1秒40000数据/sheet26.5秒50000数据/shee28.2秒55000数据/sheet26.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、FastExcelXML 的电子表格导出数据格式为纯Execl文件为XML文件导出数据量小较大能否分Sheet能能能否添加样式能能能否添加图片POI 能不能导出数据能否导入Access能能

?

PS。我提高JVM的大小几乎没效果,不知道是怎么回事……




LZ 网上,都说FastExcel比较快,,,怎么在你的测试中相反呢?

刚刚也用到这个..先用FastExcel它好了。,,,但是 到底谁更好呢,,,,有时间测下下.....File file = new File("c:/xx.xls"); Workbook workbook = Workbook.getWorkbook(file);//执行到这里就无反应

但是记录少于10000就不会有问题,请问打家是如何解决大文件读取的 61 楼 wbsh583 2010-03-19 学习了正需要导出了 好好看看能行么我的也是一直在包内存溢出 62 楼 lightning_11 2010-03-19 还是用CSV吧,我曾经搜索47个excel,各个xls的数据量大小不一,大的2M小的几十K
然后把找到的数据一起放到csv中,一共44000多条,共用44秒,感觉很好,如果用excel根本不行 63 楼 kimmking 2010-03-19 ray_linn 写道最简单得莫过于在excel里写一段vba脚本, VBA脚本采用AJAX的方式去和server端数据通讯,并负责填充表单。

好处:

1. 局域网内服务器端产生数万条数据并通讯并不需要耗费许多时间。

2. 表单的填充在客户端完成,不需要耗费服务器的时间。



vba里容易假死,很别扭的。 64 楼 kimmking 2010-03-19 excel2003的话,自己看biff8,格式固定的话,自己写二进制也不难。
excel2007就更简单了,自己写xml,然后zip即可。
65 楼 lkj107 2010-03-19 csv不支持sheet
普通的操作excel的包,超过3万条容易内存溢出
所以没有完美的解决方案
很多人都是使用导出多个文件,最后合并的
如楼上所说的用xml,但是很多单位office还是用的2003版的 66 楼 kimmking 2010-03-19 lkj107 写道csv不支持sheet
普通的操作excel的包,超过3万条容易内存溢出
所以没有完美的解决方案
很多人都是使用导出多个文件,最后合并的
如楼上所说的用xml,但是很多单位office还是用的2003版的
我什么时候说csv了,
我说 biff8 67 楼 mycybyb 2010-03-19 POI也是可以的 68 楼 对酒当歌,人生几何 2010-07-07 vlinux 写道我的做法是:
1.用jxl,养成经常write()的习惯
2.每6W条记录分一个sheet
3.JAVA循环的时候要记得不要在循环体中分配太多内存,避免系统回收时占用过高的CPU资源--本来导出时候已经很消耗CPU了
4.每次导出先创建一个不重复的临时的文件,等文件导好后再重命名为可用的文件,这样可以避免用户导出的时候强行终止所带来的莫名其妙的文件记录,重命名好后入库,通知前台可以下载--或者可以省略掉重命名这步?

请问你这里的第一条,是什么意思? 我查询了一个list出来,想循环一个list就write一次。结果,除了第一条数据,其他都没写到文件里面。也没有找到合适的api,搞不懂了

读书人网 >软件架构设计

热点推荐