现在网上基本方法是:
1.使用CSV下载。
2.调大JVM ,Tomcat的内存。
目前这两种方法客户都不同意,大家还有什么方法吗?这问题 哥曾经遇到过,客户非要所有的数据都导出来,有时候数据量很大,甚至超过了EXCEL的最大行数,实在变态,后来的思路是:分割成多个小EXCEL文件,然后用Java的 ZIP类库的方法压缩成XXX.zip文件导出下载。管理hibernate的缓存机制,hibernate的session中有flush,clear等方法,可以让内存消耗小一点Excel 2010 和 Excel 2007 中 (即xlsx格式)工作表的大小为 16,384 列 × 1,048,576 行。
不知道能不能满足要求,不能的话就txt保存,不过可能文件过大,打开较慢内存溢出是因为加载的数据太多导致的。
既然这样,你可以将数据分开加载出来,然后分别导出到多个表单或多个文件中。
也就是说按分页查询来进行导出。这个问题我也研究过,最终也是生成多个excel文件打zip包得。内存溢出的原因是由于数据量太大了,说白了就是由于创建的cell对象太多了,导致内存溢出,我没有找到更好的解决方案,jxl也可以导出excel,不过会不会溢出,不过excel2003最大行数为65535,你的数据量如果溢出的话,还是需要生成2007的。
我觉得内存溢出是因为加载了太多的Model,而非加载Excel文件导致的。
一个Excel文件才多大啊。我曾经加载过一个3G左右的电影文件都没有问题。
对了,你要先确定是Java报的内存溢出,而不是数据库报的内存溢出,Oracle加载的数据多的话也可能报内存溢出的。
如果是Java报的内存溢出,那么就按我的思路解决应该就可以。
你用的是Hibernate之类的框架,查询出来一个List的吧。List里边存放的是封装的Java对象,是这样吗?可以生成多个临时excel文件。。然后合并成一个excel文件。。写一个合并的类。。。不知楼主的数据库支持导出数据位excel不,如果支持的话,可以先讲数据插入临时表,然后导出。这个方法有点烂。
那应该也不难。你可以每次都加载那一个Excel文件,并加载第一个Sheet,分页加载的数据每次都从这个Sheet的最后一行开始添加,这样就OK了。