0 0

关于POI生成报表大数据量的问题0

    我们在做一个报表导出的功能,WEB 容器Server使用TOMCAT6,JVM可用的内存范围只有512M,导出报表使用excel需要下载到本地。

    现在遇到性能问题,我现在采用的是POI的HSSF导出,导出的数据来自数据库中的多个表,列最多时,列的个数为110列,如果数据一次性导出会OutOfMemory。
    我们现在的做法是,每8K条记录导出到一个Excel的一个Sheet,为一个文件;写成多个文件,最后把生成的多个文件打包成一个压缩包反回客户端。但是现在的需求是,只要生成一个Excel文件,希望能达到20W行,在内存512的范围内,求解决方案。如果有知道POI Event 生成的方式,希望提供些指导性文章或者Demo。能找到的资料不多。


求有经验的高手指导!!
2014年6月08日 23:57

5个答案 按时间排序 按投票排序

0 0

加个内存会死人吗?

2014年6月10日 17:58
0 0

请导出 csv 省事。。

2014年6月10日 09:10
0 0

mkkkkkkkkkkkkkkkk

2014年6月09日 23:40
0 0

首先确定一下你的格式,到底是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的作法应该能搞定你的需求。

2014年6月09日 16:53
0 0

能使用xls格式的吗? 如果可以就简单了

2014年6月09日 13:53

相关推荐

Global site tag (gtag.js) - Google Analytics