在之前我们知道处理xls的excel用的workbook是HSSFWorkbook,处理xlsx的excel用的是XSSFWorkbook。

  上面两个类导出excel的时候数据会驻留在内存中,所以当数据量大的时候容易造成内存溢出。SXSSFWorkbook是用来生成海量excel数据文件,主要原理是借助临时存储空间生成excel。POI要求3.8以上,生成的文件格式要求是07及以上版本,因为excel07级以上版本的行数1048576,量很大,而03版本的只有6万多。

  读取07及以上版本的excel仍然是“XSSFWorkbook”,写入则为“SXSSFWorkbook ”。

导出的代码:(一个简单的测试,如果想封装工具类,参考:https://www.cnblogs.com/qlqwjy/p/9974212.html)

package cn.xm.exam.utils;

import java.io.File;
import java.io.FileOutputStream; 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.ss.usermodel.Workbook;
import org.apache.poi.xssf.streaming.SXSSFWorkbook; public class SXSSFExcelUtil {
public static void main(String[] args) {
String[] title = { "id", "name", "sex" };
// 创建一个工作簿
Workbook workbook = new SXSSFWorkbook();
// 创建一个工作表sheet
Sheet sheet = workbook.createSheet();
// 创建第一行
Row row = sheet.createRow(0);
// 创建一个单元格
Cell cell = null;
// 创建表头
for (int i = 0; i < title.length; i++) {
cell = row.createCell(i);
cell.setCellValue(title[i]);
}
// 从第二行开始追加数据
for (int i = 1; i <= 10000; i++) {
// 创建第i行
Row nextRow = sheet.createRow(i);
// 参数代表第几列
Cell cell2 = nextRow.createCell(0);
cell2.setCellValue("a" + i);
cell2 = nextRow.createCell(1);
cell2.setCellValue("user" + i);
cell2 = nextRow.createCell(2);
cell2.setCellValue("男");
}
// 创建一个文件
File file = new File("G:/tt1.xls");
try {
file.createNewFile();
// 打开文件流
FileOutputStream outputStream = new FileOutputStream(file);
workbook.write(outputStream);
outputStream.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } }

补充:SXFFSWoorkbook导出的excel相比于XSSFWoorkbook导出的更节省空间:

下面分别是SXXFS\XFFS\HFFS导出上面1万条数据的excel的文件大小:

补充:测试HSSF\XSSF导出的数据占用内存,而SXFFS导出的数据不容易造成内存溢出

数据改为5万条并且写入之后查看内存信息:

 (1)查看XSSF导出的时候占用JVM内存

package cn.xm.exam.utils;

import java.io.File;
import java.io.FileOutputStream; 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.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class SXSSFExcelUtil {
public static void main(String[] args) {
String[] title = { "id", "name", "sex" };
// 创建一个工作簿
Workbook workbook = new XSSFWorkbook();
// 创建一个工作表sheet
Sheet sheet = workbook.createSheet();
// 创建第一行
Row row = sheet.createRow(0);
// 创建一个单元格
Cell cell = null;
// 创建表头
for (int i = 0; i < title.length; i++) {
cell = row.createCell(i);
cell.setCellValue(title[i]);
}
// 从第二行开始追加数据
for (int i = 1; i <= 50000; i++) {
// 创建第i行
Row nextRow = sheet.createRow(i);
// 参数代表第几列
Cell cell2 = nextRow.createCell(0);
cell2.setCellValue("a" + i);
cell2 = nextRow.createCell(1);
cell2.setCellValue("user" + i);
cell2 = nextRow.createCell(2);
cell2.setCellValue("男");
}
// 创建一个文件
File file = new File("G:/tt1.xls");
try {
file.createNewFile();
// 打开文件流
FileOutputStream outputStream = new FileOutputStream(file);
workbook.write(outputStream);
outputStream.close();
// dispose of temporary files backing this workbook on disk
// ((SXSSFWorkbook) workbook).dispose();
System.out.println("创建完成");
System.out.println("总的内存->" + Runtime.getRuntime().totalMemory() / 1024 / 1024 + "MB");
System.out.println("剩余的内存->" + Runtime.getRuntime().freeMemory() / 1024 / 1024 + "MB");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } }

结果:

创建完成
总的内存->883MB
剩余的内存->550MB

(2)查看SXSSF导出的时候占用JVM内存

将上面XSSF改为SXFFS查看结果:

创建完成
总的内存->182MB
剩余的内存->175MB

POI 海量数据/大数据文件生成SXSSFWorkbook使用简介的更多相关文章

  1. POI实现大数据EXCLE导入导出,解决内存溢出问题

    使用POI能够导出大数据保证内存不溢出的一个重要原因是SXSSFWorkbook生成的EXCEL为2007版本,修改EXCEL2007文件后缀为ZIP打开可以看到,每一个Sheet都是一个xml文件, ...

  2. sqlcmd导入大数据文件

    sqlcmd导入大数据文件 SQLCMD 允许在Windows命令窗中通过命令行提示符运行脚本. 语法如下: sqlcmd  [  { { -U <login id> [ -P <p ...

  3. POI读写大数据量EXCEL

    另一篇文章http://www.cnblogs.com/tootwo2/p/8120053.html里面有xml的一些解释. 大数据量的excel一般都是.xlsx格式的,网上使用POI读写的例子比较 ...

  4. POI读写大数据量excel,解决超过几万行而导致内存溢出的问题

    1. Excel2003与Excel2007 两个版本的最大行数和列数不同,2003版最大行数是65536行,最大列数是256列,2007版及以后的版本最大行数是1048576行,最大列数是16384 ...

  5. phpmyadmin导入导出大数据文件的办法

    在phpmyadmin的使用中,经常需要进行导入导出数据库的操作. 但是在导入导出大型数据库文件的时候经常会只是部分导出或者部分导入. 或者是导入导出不成功. 原因就是服务器和php.mysql限制了 ...

  6. 使用distcp并行拷贝大数据文件

    以前我们介绍的访问HDFS的方法都是单线程的,Hadoop中有一个工具可以让我们并行的拷贝大量数据文件,这个工具就是distcp. distcp的典型应用就是在两个HDFS集群中拷贝文件,如果两个集群 ...

  7. 阿里云Mysql导入大数据文件

    1.查询数据保存为CSV文件 select * from account into outfile '/root/account.csv' fields terminated by ',' enclo ...

  8. orcle导入大数据文件

    0,创建ctl文件  内容为 OPTIONS (skip=0) LOAD DATA  CHARACTERSET 'UTF8' INFILE 'F:\anhui_data\20180814\shangh ...

  9. Day1 - 认识大数据& 企业需求分析 & 北风网简介

    上午: 介绍: 海量的乱七八糟的数据中快速的计算出某些有用的信息 刑侦视频追踪 云栖大会 大数据分析/挖掘 ==>  python  <== 重点关注 大数据运维   ==> 运服务 ...

随机推荐

  1. 【清北学堂2018-刷题冲刺】Contest 7

    Task 1:小奇采药 [问题描述]  小奇是只天资聪颖的喵,他的梦想是成为世界上最伟⼤的医师.  为此,他想拜喵星球最有威望的医师为师.  医师为了判断他的资质,给他出了⼀个难题.  医师把他带到⼀ ...

  2. windows server 2008 远程连接

    1.win2008如何开启远程桌面 原文:https://zhidao.baidu.com/question/745350052927250652.html 正常的开启操作: 在桌面上右点" ...

  3. 将二维list某列组成新的list

    # encoding: utf-8 import decimal import requests import logging import logging.config import random ...

  4. spring boot 返回json字符串 null值转空字符串

    @Configuration public class JacksonConfig { @Bean @Primary @ConditionalOnMissingBean(ObjectMapper.cl ...

  5. beego 实现API自动化文档

    安装beego和bee工具 1.beego安装 go get -u github.com/astaxie/beego 2.安装bee工具 go get -u github.com/beego/bee ...

  6. Struts2_参数获得方式

    1.属性驱动 /** * @ClassName: Demo8Action * @Description: struts2如何获得参数 * 每次请求action时都会创建新的action实例对象 * @ ...

  7. Docker CE 各安装方法

    1.Docker CE 镜像源站 使用官方安装脚本自动安装 curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 2.U ...

  8. Hadoop完全分布式安装

    一.软件版本 Hadoop版本号:hadoop-2.6.0.tar: VMWare版本号:VMware-workstation-full-11.0.0-2305329 Ubuntu版本号:ubuntu ...

  9. Groovy 设计模式 -- null对象模式

    Null Object Pattern http://groovy-lang.org/design-patterns.html#_loan_my_resource_pattern 对于一些场景获得的对 ...

  10. redis的常用命令及实例讲解

    使用命令行操作redis 数据类型 字符串String 列表list 使用双向循序链表实现(LinkedList) 散列 Hash 一般应用于将redis作为分布式缓存,存储数据库中的数据对象 集合s ...