说明:我的电脑 2.0CPU 2G内存 能够十秒钟导出 20W 条数据 ,12.8M的excel内容压缩后2.68M
我们知道在POI导出Excel时,数据量大了,很容易导致内存溢出。由于Excel 一个sheet允许的最大行数是65536这时我们想到分sheet进行导出;但是这种情况也不能解决内存溢出的问题。毕竟数据还是一次性在内存中进行保存的。这时我们想是不是可以导出多个excel呢?下面我就尝试着按照导出多个excel
首先:我们要确定数据量有多大,然后确定一个excel导出多少条数据,这样就可以确定导出的Excel的数量,于是我们就可以循环的导出excel并保存在任意的临时目录中。去这样如果内存不够的话虚拟机就会去进行回收已经保存的excel在内存中的空间。
假设我们我们已经成功的生成了多个excel,这时我们怎么把这N个excel文档传到客户端呢?其实一个一个的传也未尝不可,但是考虑那样对用户来说体验不够好,再次多个文件在网络上传输也比较慢。我们可以考虑对生成的几个文件进行压缩,然后传到客户端。
总结一下第一、分批次生成excel第二、压缩后到客户端
下面我把我的一个小实例贴上供大家参考
第一、Person.java 普通javabean
1 package bean; 2 /** 3 * 4 * @author 5 * 6 */ 7 public class Person { 8 9 private Integer id; 10 private String name; 11 private String address; 12 private String tel; 13 private Double money=0.0; 14 public Double getMoney() { 15 return money; 16 } 17 public void setMoney(Double money) { 18 this.money = money; 19 } 20 public Person(Integer id, String name, String address, String tel,Double money) { 21 super(); 22 this.id = id; 23 this.name = name; 24 this.address = address; 25 this.tel = tel; 26 this.money=money; 27 } 28 public Integer getId() { 29 return id; 30 } 31 public void setId(Integer id) { 32 this.id = id; 33 } 34 public String getName() { 35 return name; 36 } 37 public void setName(String name) { 38 this.name = name; 39 } 40 public String getAddress() { 41 return address; 42 } 43 public void setAddress(String address) { 44 this.address = address; 45 } 46 public String getTel() { 47 return tel; 48 } 49 public void setTel(String tel) { 50 this.tel = tel; 51 } 52 }
第二、PersonService模拟业务逻辑循环生成100023个Person对象