最近用XSSFWorkbook做Excel导出时遇到了一个问题:当数据达到几万行会出现java.lang.OutOfMemoryError: GC overhead limit exceeded错误。

解决办法:

SXSSF(包:org.apache.poi.xssf.streaming)是XSSF的API兼容流式扩展,用于在必须生成非常大的电子表格时使用,并且堆空间有限。SXSSF通过限制对滑动窗口内行的访问来实现其低内存占用,而XSSF允许访问文档中的所有行。不再在窗口中的旧行变得不可访问,因为它们被写入磁盘。

详细介绍请查看:http://poi.apache.org/components/spreadsheet/how-to.html#sxssf

测试类:

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;/*** SXSSFWorkbook测试** @author 王晓安*/
public class SXSSFWorkbookTest {private static SXSSFWorkbook getWorkbook(List<String> title, List<? extends List<?>> data) {SXSSFWorkbook workbook = new SXSSFWorkbook();// 添加一个sheetfinal Sheet sheet = workbook.createSheet();// 构建titlefinal Row titleRow = sheet.createRow(0);for (int i = 0; i < title.size(); i++) {final Cell titleRowCell = titleRow.createCell(i);titleRowCell.setCellValue(title.get(i));}// 填充数据for (int i = 0; i < data.size(); i++) {final Row row = sheet.createRow(i + 1);final List<?> dataRow = data.get(i);for (int j = 0; j < dataRow.size(); j++) {final Cell cell = row.createCell(j);final Object value = dataRow.get(j);cell.setCellValue(value == null ? "" : String.valueOf(value));}}return workbook;}public static void main(String[] args) {int col = 10;int row = 100_0000;final List<String> title = IntStream.rangeClosed(1, col).mapToObj(value -> "第" + value + "列").collect(Collectors.toList());final List<List<Double>> data = IntStream.range(0, row).mapToObj(value ->IntStream.range(0, col).mapToObj(ignore -> Math.random()).collect(Collectors.toList())).collect(Collectors.toList());final LocalDateTime start = LocalDateTime.now();final SXSSFWorkbook workbook = getWorkbook(title, data);try (OutputStream outputStream = new FileOutputStream("/data/temp/测试.xlsx")) {workbook.write(outputStream);// 丢弃在磁盘上备份此工作簿的临时文件workbook.dispose();} catch (IOException e) {e.printStackTrace();}final LocalDateTime end = LocalDateTime.now();final Duration duration = Duration.between(start, end);System.out.println("生成Excel花费时间:" + duration);}
}

生成一百万行的Excel时间大约32秒:

生成的Excel大小如下:

算上标题和数据共一百万零一行:

POI 生成百万行Excel防止OOM相关推荐

  1. POI和EasyExcel操作Excel

    POI和EasyExcel操作Excel 常用场景 1.将用户信息导出为excel表格(导出数据- ) 2.将Excel表中的信息录入到网站数据库(文件数据上传- ) 开发中经常会设计到excel的处 ...

  2. springboot+poi导出百万级数据避免OOM内存溢出

    springboot+poi导出百万级数据避免OOM内存溢出 文章目录 springboot+poi导出百万级数据避免OOM内存溢出 前言 一.具体实现 二.代码实现 1.引入poi包 2.功能代码 ...

  3. Java使用POI读取和写入Excel指南

    Java使用POI读取和写入Excel指南 做项目时经常有通过程序读取Excel数据,或是创建新的Excel并写入数据的需求: 网上很多经验教程里使用的POI版本都比较老了,一些API在新版里已经废弃 ...

  4. Java:Java的jar包之POI的简介、安装、使用方法(基于POI将Word、Excel、PPT转换为html)之详细攻略

    Java:Java的jar包之POI的简介.安装.使用方法(基于POI的转换-Word.Excel.Ppt等转html)之详细攻略 目录 POI的简介 1.基本功能 POI的安装 POI的使用方法(基 ...

  5. Java程序员从笨鸟到菜鸟之(一百零四)java操作office和pdf文件(二)利用POI实现数据导出excel报表...

    在上一篇博客中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式.不仅仅简单的读取office中的数据.尤其是在生 ...

  6. java 往excel中写数据库,poi将数据写入excel表格-怎么用java把数据库里的数据写入到excel表中...

    怎么用java把数据库里的数据写入到excel表中 你是想读取excel内容,然后整合一下数据,然后再生成一个新的excel吧 package aa; import java.io.FileInput ...

  7. Java中使用poi导入、导出Excel

    Java中使用poi导入.导出Excel 学习了:http://www.cnblogs.com/Damon-Luo/p/5919656.html 转载于:https://www.cnblogs.com ...

  8. POI事件模式读取Excel 2003文件

    一.概述 1. Excel 2003文件(即后缀为xls)是二进制文件,存储结构为复合文档,POI读取xls文件有两种方式 用户模式(usermodel):一次性将xls文件读入到内存,创建dom结构 ...

  9. java导出excel带图片_JAVA的poi实现模版导出excel(带图片).doc

    JAVA的poi实现模版导出excel(带图片) 下面是本人使用java的poi实现使用模板到处excel,内容包含图片,使用两种不同的方式实现其到处excel.但是使用jxl实现到处excel只能到 ...

最新文章

  1. 聊聊性能测试、操作系统优化对性能测试的影响,以及如何优化操作系统
  2. android 重启app_[Boot]Android系统启动-zygote篇
  3. 系统启动与内核管理 ;AWK部分 重要内容 (实验及awk的常见面试题)
  4. tp5类的属性不存在_thinkPHP5.1框架中Request类四种调用方式示例
  5. SpringMVC搭建+实例
  6. Nodejs学习笔记(七)——接口API
  7. (转)【自动语音识别课程】
  8. JavaScript中Array 对象相关的几个方法
  9. AutoDesk CAD 2014安装VBA Enabler图文教程(附AutoCAD_2014_VBA_Win_64bit下载)
  10. 这 10 个 Python 可视化工具,你用过哪些?
  11. 【转载】太完美_Windows XP SP3 极度精简克隆版 【2014】
  12. 酷派的新机、心机、心悸
  13. steam怎么共享计算机游戏,steam怎么共享游戏给好友?steam向好友共享游戏教程
  14. Dart Web开发环境搭建及新建运行项目
  15. Redis 惰性删除
  16. ORA-03113和ORA-00204问题处理
  17. Kuang_spring笔记
  18. 机器学习从零到入门 集成学习
  19. UI设计中的App标签栏中的设计细节
  20. 华为云大数据BI 解决方案的超高性价比

热门文章

  1. BAT 机器学习 1000 题 301-400(转)
  2. 开源的动态人脸识别项目
  3. SAP BW/4HANA学习笔记2
  4. 服务器ios文件夹是否存在,ios – 如何确定iCloud文件夹中是否存在文件?
  5. 无线蓝牙运动耳机什么牌子好、最好的无线蓝牙运动耳机品牌
  6. IDEA——教你mybatis的使用(小白教程)
  7. 蜷缩在泡沫里的机器人
  8. 使用Glide加载图片时出现条纹和颜色混乱
  9. 【命名实体识别(NER)】(1):命名实体识别综述
  10. Java面试通关要点汇总集(山东数漫江湖)