我们在做一个报表导出的功能,WEB 容器Server使用TOMCAT6,JVM可用的内存范围只有512M,导出报表使用excel需要下载到本地。 现在遇到性能问题,我现在采用的是POI的HSSF导出,导出的数据来自数据库中的多个表,列最多时,列的个数为110列,如果数据一次性导出会OutOfMemory。 我们现在的做法是,每8K条记录导出到一个Excel的一个Sheet,为一个文件;写成多个文件,最后把生成的多个文件打包成一个压缩包反回客户端。
2 回答
蓝山帝景
TA贡献1843条经验 获得超7个赞
先确定一下你的格式,到底是xlsx还是xls,看你说想要有20万行,我印象里面xls是没法到20万行的(最多65535行),列也有限制(貌似255),但是xlsx是没这个限制的(或者说限制宽松很多)
如果是xlsx的话,你可以新建一个xlsx文件,然后把后缀改成zip,然后解压缩,看看生成的结果,是一堆文本文件。然后你加一行数据,再改后缀,解压缩,看看结果,你会发现,xlsx文件的更新实际上就是更新xml的一个操作。
那么你应该明白了,你后台需要做的就是做xml文件,然后zip压缩后把后缀改成xlsx,这样的话,不会涉及到POI那些很耗内存的操作,应该是很容易做到你要的效果的。
如果是xls格式,那么首先行数达不到你的要求。如果强行要做,那么推荐你还是先把数据查出来放在文本文件里面,然后调用另一个process来在外部运行来完成这步工作(或者干脆连查询所有的事情都交给外部进行,这时候是启动另一个java虚拟机,占用的是别的内存,甚至可以交给别的server来干这件事),你的程序可以轮询这个工作做完没有,做完后再下载。
说实话,我觉这种需求的正路就是应该是异步另外一个process去做,做完之后再下载。
否则用户画面上点个按钮,数据量超大的情况下你让他等20分钟是不是很蠢?应该给他一个机制告诉他这个事很花时间,现在正在做,做完后让他自己下载是比较合适的作法。
如果一定要在画面上的一次请求搞定的话,参考我说的用xlsx或者轮询另外一个process的作法应该能搞定你的需求。
- 2 回答
- 0 关注
- 278 浏览
添加回答
举报
0/150
提交
取消