日期:2014-05-17  浏览次数:20763 次

用POI制成EXCEL下载,数据量大时内存溢出,有什么样的解决办法?
现在网上基本方法是:
1.使用CSV下载。
2.调大JVM ,Tomcat的内存。

目前这两种方法客户都不同意,大家还有什么方法吗?
------解决方案--------------------
内存溢出是因为加载的数据太多导致的。
既然这样,你可以将数据分开加载出来,然后分别导出到多个表单或多个文件中。
也就是说按分页查询来进行导出。
------解决方案--------------------
Excel 2010 和 Excel 2007 中 (即xlsx格式)工作表的大小为 16,384 列 × 1,048,576 行。
不知道能不能满足要求,不能的话就txt保存,不过可能文件过大,打开较慢
------解决方案--------------------
引用:
最终用户要求一个sheet容纳所有数据,如何融合之前导出的多个sheet?


那应该也不难。你可以每次都加载那一个Excel文件,并加载第一个Sheet,分页加载的数据每次都从这个Sheet的最后一行开始添加,这样就OK了。
------解决方案--------------------
引用:
引用:

引用:
最终用户要求一个sheet容纳所有数据,如何融合之前导出的多个sheet?


那应该也不难。你可以每次都加载那一个Excel文件,并加载第一个Sheet,分页加载的数据每次都从这个Sheet的最后一行开始添加,这样就OK了。


大哥,先读后写,文件越搞越大,POI还是把以前的内容读进去了,最后……


我觉得内存溢出是因为加载了太多的Model,而非加载Excel文件导致的。
一个Excel文件才多大啊。我曾经加载过一个3G左右的电影文件都没有问题。
------解决方案--------------------
引用:
引用:
我觉得内存溢出是因为加载了太多的Model,




这句话能否延伸一下,不太明白。

另外数据嘛,我是取出来放list,别说六万,十万行都没有报溢出错。异常是在用POI做Excel文件时产生的。


对了,你要先确定是Java报的内存溢出,而不是数据库报的内存溢出,Oracle加载的数据多的话也可能报内存溢出的。

如果是Java报的内存溢出,那么就按我的思路解决应该就可以。

你用的是Hibernate之类的框架,查询出来一个List的吧。List里边存放的是封装的Java对象,是这样吗?
------解决方案--------------------
管理hibernate的缓存机制,hibernate的session中有flush,clear等方法,可以让内存消耗小一点
------解决方案--------------------
可以生成多个临时excel文件。。然后合并成一个excel文件。。写一个合并的类。。。
------解决方案--------------------
这问题 哥曾经遇到过,客户非要所有的数据都导出来,有时候数据量很大,甚至超过了EXCEL的最大行数,实在变态,后来的思路是:分割成多个小EXCEL文件,然后用Java的 ZIP类库的方法压缩成XXX.zip文件导出下载。
------解决方案--------------------
这个问题我也研究过,最终也是生成多个excel文件打zip包得。内存溢出的原因是由于数据量太大了,说白了就是由于创建的cell对象太多了,导致内存溢出,我没有找到更好的解决方案,jxl也可以导出excel,不过会不会溢出,不过excel2003最大行数为65535,你的数据量如果溢出的话,还是需要生成2007的。
------解决方案--------------------
不知楼主的数据库支持导出数据位excel不,如果支持的话,可以先讲数据插入临时表,然后导出。这个方法有点烂。