POI 生成百万行Excel防止OOM
最近用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相关推荐
- POI和EasyExcel操作Excel
POI和EasyExcel操作Excel 常用场景 1.将用户信息导出为excel表格(导出数据- ) 2.将Excel表中的信息录入到网站数据库(文件数据上传- ) 开发中经常会设计到excel的处 ...
- springboot+poi导出百万级数据避免OOM内存溢出
springboot+poi导出百万级数据避免OOM内存溢出 文章目录 springboot+poi导出百万级数据避免OOM内存溢出 前言 一.具体实现 二.代码实现 1.引入poi包 2.功能代码 ...
- Java使用POI读取和写入Excel指南
Java使用POI读取和写入Excel指南 做项目时经常有通过程序读取Excel数据,或是创建新的Excel并写入数据的需求: 网上很多经验教程里使用的POI版本都比较老了,一些API在新版里已经废弃 ...
- Java:Java的jar包之POI的简介、安装、使用方法(基于POI将Word、Excel、PPT转换为html)之详细攻略
Java:Java的jar包之POI的简介.安装.使用方法(基于POI的转换-Word.Excel.Ppt等转html)之详细攻略 目录 POI的简介 1.基本功能 POI的安装 POI的使用方法(基 ...
- Java程序员从笨鸟到菜鸟之(一百零四)java操作office和pdf文件(二)利用POI实现数据导出excel报表...
在上一篇博客中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式.不仅仅简单的读取office中的数据.尤其是在生 ...
- java 往excel中写数据库,poi将数据写入excel表格-怎么用java把数据库里的数据写入到excel表中...
怎么用java把数据库里的数据写入到excel表中 你是想读取excel内容,然后整合一下数据,然后再生成一个新的excel吧 package aa; import java.io.FileInput ...
- Java中使用poi导入、导出Excel
Java中使用poi导入.导出Excel 学习了:http://www.cnblogs.com/Damon-Luo/p/5919656.html 转载于:https://www.cnblogs.com ...
- POI事件模式读取Excel 2003文件
一.概述 1. Excel 2003文件(即后缀为xls)是二进制文件,存储结构为复合文档,POI读取xls文件有两种方式 用户模式(usermodel):一次性将xls文件读入到内存,创建dom结构 ...
- java导出excel带图片_JAVA的poi实现模版导出excel(带图片).doc
JAVA的poi实现模版导出excel(带图片) 下面是本人使用java的poi实现使用模板到处excel,内容包含图片,使用两种不同的方式实现其到处excel.但是使用jxl实现到处excel只能到 ...
最新文章
- 聊聊性能测试、操作系统优化对性能测试的影响,以及如何优化操作系统
- android 重启app_[Boot]Android系统启动-zygote篇
- 系统启动与内核管理 ;AWK部分 重要内容 (实验及awk的常见面试题)
- tp5类的属性不存在_thinkPHP5.1框架中Request类四种调用方式示例
- SpringMVC搭建+实例
- Nodejs学习笔记(七)——接口API
- (转)【自动语音识别课程】
- JavaScript中Array 对象相关的几个方法
- AutoDesk CAD 2014安装VBA Enabler图文教程(附AutoCAD_2014_VBA_Win_64bit下载)
- 这 10 个 Python 可视化工具,你用过哪些?
- 【转载】太完美_Windows XP SP3 极度精简克隆版 【2014】
- 酷派的新机、心机、心悸
- steam怎么共享计算机游戏,steam怎么共享游戏给好友?steam向好友共享游戏教程
- Dart Web开发环境搭建及新建运行项目
- Redis 惰性删除
- ORA-03113和ORA-00204问题处理
- Kuang_spring笔记
- 机器学习从零到入门 集成学习
- UI设计中的App标签栏中的设计细节
- 华为云大数据BI 解决方案的超高性价比