JAVA关于POI导出Excel内存溢出的解决方案

JAVA关于POI导出Excel内存溢出的解决方案

在我们使用JAVA开发过程中,经常要导出查询获得的数据,这些数据一般情况下都是以Excel存储的,因此我们在导出数据的时候要使用JAVA的POI库,其主要是对各种windows平台的数据格式进行操作,在这里,我们是对Excel操作。

生成Excel的过程原理是这样的,首先,我们对数据库进行查询,获取相应的结果集,一般是list集合,然后生成Workbook对象,根据生成的Workbook对象获取sheet对象,根据此sheet对象获取Row对象,再根据Row对象获取Cell对象,最后设置cell单元格的值,循环生成Row和Cell对象,将list中的值写入Cell中,写完后,将Workbook对象写入相应的流对象即可。

在上述过程中,若list集合的数据不多,不会出现问题,倘若list中的数据足够多(几万条以上),则会导致内存溢出,导出失败。

其解决方案就是我们分批导出,每次查询固定数量的list数据集合,将其中的数据写入一个Workbook对象中,依次循环,直至将所有的数据写如Workbook中,此解决方案会生成多个Workbook对象,在供浏览器下载的时候也会有问题,因此,我们还要对生成的多个Excel文件进行打包压缩,即调用操作系统的tar命令(一般来说应用都部署在linux环境下)生成一个压缩包,下载此压缩包即可。

注:在讲Workbook对象写入OutputStream流中,在构建OutputStream时其路径不能是web容器中的路径,否则永远只能生成一个Workbook对象,原因不明

你可能感兴趣的:(JAVA关于POI导出Excel内存溢出的解决方案)