POI 海量数据/大数据文件生成SXSSFWorkbook使用简介
在之前我们知道处理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使用简介的更多相关文章
- POI实现大数据EXCLE导入导出,解决内存溢出问题
使用POI能够导出大数据保证内存不溢出的一个重要原因是SXSSFWorkbook生成的EXCEL为2007版本,修改EXCEL2007文件后缀为ZIP打开可以看到,每一个Sheet都是一个xml文件, ...
- sqlcmd导入大数据文件
sqlcmd导入大数据文件 SQLCMD 允许在Windows命令窗中通过命令行提示符运行脚本. 语法如下: sqlcmd [ { { -U <login id> [ -P <p ...
- POI读写大数据量EXCEL
另一篇文章http://www.cnblogs.com/tootwo2/p/8120053.html里面有xml的一些解释. 大数据量的excel一般都是.xlsx格式的,网上使用POI读写的例子比较 ...
- POI读写大数据量excel,解决超过几万行而导致内存溢出的问题
1. Excel2003与Excel2007 两个版本的最大行数和列数不同,2003版最大行数是65536行,最大列数是256列,2007版及以后的版本最大行数是1048576行,最大列数是16384 ...
- phpmyadmin导入导出大数据文件的办法
在phpmyadmin的使用中,经常需要进行导入导出数据库的操作. 但是在导入导出大型数据库文件的时候经常会只是部分导出或者部分导入. 或者是导入导出不成功. 原因就是服务器和php.mysql限制了 ...
- 使用distcp并行拷贝大数据文件
以前我们介绍的访问HDFS的方法都是单线程的,Hadoop中有一个工具可以让我们并行的拷贝大量数据文件,这个工具就是distcp. distcp的典型应用就是在两个HDFS集群中拷贝文件,如果两个集群 ...
- 阿里云Mysql导入大数据文件
1.查询数据保存为CSV文件 select * from account into outfile '/root/account.csv' fields terminated by ',' enclo ...
- orcle导入大数据文件
0,创建ctl文件 内容为 OPTIONS (skip=0) LOAD DATA CHARACTERSET 'UTF8' INFILE 'F:\anhui_data\20180814\shangh ...
- Day1 - 认识大数据& 企业需求分析 & 北风网简介
上午: 介绍: 海量的乱七八糟的数据中快速的计算出某些有用的信息 刑侦视频追踪 云栖大会 大数据分析/挖掘 ==> python <== 重点关注 大数据运维 ==> 运服务 ...
随机推荐
- STM32F103 ------ BOOT0 / BOOT1
BOOT0/BOOT1的状态只是在CPU复位之后的4个周期内,被用作启动的依据,系统启动之后,或是取得了复位向量之后,BOOT0/BOOT1的状态可以任意变化,而不影响CPU的运行. 所以只需要保证在 ...
- 数据库工具类 JdbcUtils
什么时候自己创建工具类 如果一个功能经常用到 我们建议把这个功能做成工具类 创建JdbcUtils包含三个方法 1: 把几个字符串 定义为常量 2:得到数据库连接getConnection(); 3 ...
- 使用WinPcap(SharpPcap)实现ARP抓包以实现设备IP修改功能
参考上一篇: 使用WinPcap(SharpPcap)实现ARP抓包以实现设备IP搜索功能 搜索出设备后,需要修改设备IP网关掩码等信息 继续采用ARP包 getBas类似之前的,根据用户电脑的网卡物 ...
- 上这个资源网站,让你轻松无忧找mac软件资源
之前分享过好几篇关于mac软件相关的文章(想要看其他的mac软件专题文章,可以关注我,点击进入查看发表的文章),有网友表示,优质的软件推荐清单有了,想要下载和获取mac软件,买一个正版软件在APP s ...
- Java通过Mybatis实现批量插入数据到Oracle中
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "- ...
- 如何再window下统计自己写的代码行
git log --since="2018-05-01" --before="2018-11-5" --author="$(git config -- ...
- C语言复习---找出报数最后一人
题意: 有n个人围成一圈 顺序排号 从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位. 算法实现: (一)一种是按照链表数据结构(一)线性表循环链表之约瑟夫环 ...
- Linux记录-监控系统开发
需求:使用shell定制各种个性化告警工具,但需要统一化管理.规范化管理.思路:指定一个脚本包,包含主程序.子程序.配置文件.邮件引擎.输出日志等.主程序:作为整个脚本的入口,是整个系统的命脉.配置文 ...
- .net导出Excel几种方式比较
数据原共400条数据,21列,我是双核cpu,4G内存1. Excel com组件要3秒左右,上千条30秒+这种方法比较慢,要引用Microsoft.Office.Interop.Excel #reg ...
- cocos-2dx 3.17 环境搭建 与 新建工程
由于上次在ubuntu中安装了cocos2dx的时候环境被破坏了,所以本文是基于 Windows 编写的 平台: OS : windows 10 compiler : VS 2015 下载 coc ...