试共同条件:
数据总数为110011条,每条数据条数为19个字段。
电脑配置为:P4 2.67GHz,1G内存。
1、POI、JXL、FastExcel比较
POI、JXL、FastExcel均为java第三方开源导出Excel的开源项目。
导出方案一:一次性所有导出到一个Excel文件中。
实际状况均报OutOfMemery错误,如下数据为报OutOfMemery数据时,数据到的最大数据数目,如表1所示:
表1:报OutOfMemery错误时所能处理的数据量 java
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万条。
2、导出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数据库。
3、总结
项目要求是大数据量导出Excel文件,POI、JXL、FastExcel不能彻底知足要求;使用XML 的电子表格导出实现了大数据量导出,可是格式为XML不是纯正的Excel文件,为曲线救国。两种导出形式的比较,如表5所示。
表5:合并5万数据所用时间 图片
POI、JXL、FastExcel | XML 的电子表格 | |
导出数据格式 | 为纯Execl文件 | 为XML文件 |
导出数据量 | 小 | 较大 |
可否分Sheet | 能 | 能 |
可否添加样式 | 能 | 能 |
可否添加图片 | POI 能 | 不能 |
导出数据可否导入Access | 能 | 能 |