一、HSSFWorkbook与SXSSFWorkbook的区别:

HSSFWorkbook是对Excel2003以前的版本进行操作的,即后缀名为.xls

SXSSFWorkbook时对Excel2007的版本就行操作,即后缀名为.xlsx

ps:

1、SXSSFWorkbook是在POI3.8版本开始提供基于XSSF低内存占用的SXSSF

SXSSF通过一个滑动窗口来限制访问Row的数量从而达到低内存占用的目录,XSSF可以访问所有行。SXSSF通过设置rowAccessWindowSize的大小实现滑动窗口中存储数据量的row数量,当行数超过滑动窗口设定的值时,此时旧的数据不再出现在滑动窗口且不可对此进行

访问,同时将此数据写入磁盘。也可通过flushRow(int keepRows)设定行数通过周期性的调用来修改。

注意:针对 SXSSF Beta 3.8下,会有临时文件产生,比如:

poi-sxssf-sheet4654655121378979321.xml

文件位置:java.io.tmpdir这个环境变量下的位置

Windows 7下是C:\Users\xxxxxAppData\Local\Temp

Linux下是 /var/tmp/

2、当数据量超出65536条后,在使用HSSFWorkbook或XSSFWorkbook,程序会报OutOfMemoryError:Javaheap space;内存溢出错误。这时应该用SXSSFworkbook

二、所需jar包

1、SXSSFWorkbook所需jar包

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.1</version>
</dependency>
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>2.6.0</version>
</dependency>

2、HSSFWorkbook所需jar

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>

三、代码实例:

1、SXSSFWorkbook:

package com.test.excel;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List; import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook; public class SXSSFExecelPOI { public static void main(String[] args) {
try {
boolean createExcelFile = createExcelFile();
if (createExcelFile) {
System.out.println("SXSSF_excel导出成功");
} else {
System.out.println("SXSSFexcel导出失败");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} private static boolean createExcelFile() throws Exception { boolean state = false;
OutputStream os = null;
FileOutputStream fos = null;
String resultFileName = null;
String fileName = "";
try {
org.apache.poi.ss.usermodel.Workbook wb;
fileName = "kemu.xlsx";
wb = createReportWorkbook(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
resultFileName = "E:\\" + File.separator + "excel" + File.separator + sdf.format(new Date())
+ File.separator + fileName;
resultFileName = resultFileName.replaceAll("\\\\", "/");
File file = new File(resultFileName);
if (!file.exists()) {
file.getParentFile().mkdirs();
}
fos = new FileOutputStream(file);
os = new BufferedOutputStream(fos, 1024);
wb.write(os);
os.flush();
state = true;
} finally {
if (os != null)
os.close();
}
return state;
} private static Workbook createReportWorkbook() {
String[] titles = { "时间", "科目", "科目", "科目", "科目", "备注" };
String[] handClum = { "0,1,0,0", "0,0,1,4", "0,1,5,5" }; String[] titles2 = { "时间", "科目一", "科目二", "科目三", "科目四", "备注" }; // 100 指定Excel在屏幕尺寸下可滑动数据为100条
SXSSFWorkbook wb = new SXSSFWorkbook(100);
CellStyle style = wb.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER);// 设置单元格水平居中
style.setVerticalAlignment(VerticalAlignment.CENTER);// 设置单元格垂直居中
Sheet sheet = wb.createSheet("sheet1");
for (int i = 0; i < titles.length; i++) {
sheet.setColumnWidth(i, 5000);
} Row row = sheet.createRow(0);// 创建表头1
for (int i = 0; i < titles.length; i++) {
Cell cell = row.createCell(i);
cell.setCellStyle(style);
cell.setCellValue(titles[i]);
} // 动态合并单元格
for (int i = 0; i < handClum.length; i++) { // sheet.autoSizeColumn(i, true);
String[] temp = handClum[i].split(",");
Integer startrow = Integer.parseInt(temp[0]);
Integer overrow = Integer.parseInt(temp[1]);
Integer startcol = Integer.parseInt(temp[2]);
Integer overcol = Integer.parseInt(temp[3]);
sheet.addMergedRegion(new CellRangeAddress(startrow, overrow, startcol, overcol));
} row = sheet.createRow(1);// 创建表头2 for (int i = 0; i < titles2.length; i++) {
Cell cell = row.createCell(i);
cell.setCellStyle(style);
cell.setCellValue(titles2[i]);
} List<keMu> kemus = new ArrayList<keMu>();
for (int i = 0; i < 1000; i++) {
keMu kemu = new keMu();
kemu.setCreateDate("2018/11/06");
kemu.setKe1("理论" + i);
kemu.setKe2("模拟" + i);
kemu.setKe3("上机" + i);
kemu.setKe4("实操" + i);
kemu.setRemark("通过");
kemus.add(kemu);
}
// 填充数据
if (kemus != null && kemus.size() > 0) {
for (int i = 0; i < kemus.size(); i++) {
Row contentRow = sheet.createRow(i + 2);// 填充类容,从第2行开始,0行给表头
if (i % 100 == 0) {
try {
((SXSSFSheet) sheet).flushRows(100);
} catch (IOException e) {
e.printStackTrace();
}
} for (int j = 0; j < titles2.length; j++) {
Cell cell = contentRow.createCell(j);
cell.setCellStyle(style);
keMu content = kemus.get(i);
switch (j) {
case 0:
cell.setCellValue(content.getCreateDate());
break;
case 1:
cell.setCellValue(content.getKe1());
break;
case 2:
cell.setCellValue(content.getKe2());
break;
case 3:
cell.setCellValue(content.getKe3());
break;
case 4:
cell.setCellValue(content.getKe4());
break;
case 5:
cell.setCellValue(content.getRemark());
break;
}
}
}
} return wb;
} static class keMu {
private String createDate;
private String ke1;
private String ke2;
private String ke3;
private String ke4;
private String remark; public String getCreateDate() {
return createDate;
} public void setCreateDate(String createDate) {
this.createDate = createDate;
} public String getKe1() {
return ke1;
} public void setKe1(String ke1) {
this.ke1 = ke1;
} public String getKe2() {
return ke2;
} public void setKe2(String ke2) {
this.ke2 = ke2;
} public String getKe3() {
return ke3;
} public void setKe3(String ke3) {
this.ke3 = ke3;
} public String getKe4() {
return ke4;
} public void setKe4(String ke4) {
this.ke4 = ke4;
} public String getRemark() {
return remark;
} public void setRemark(String remark) {
this.remark = remark;
} }
}

2、HSSFWorkbook:

package com.test.excel;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List; import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress; public class HSSFExcel { public static void main(String[] args) {
try {
boolean createExcelFile = createExcelFile();
if (createExcelFile) {
System.out.println("HSSF_excel导出成功");
} else {
System.out.println("hssf_excel导出失败");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} private static boolean createExcelFile() throws Exception { boolean state = false;
OutputStream os = null;
FileOutputStream fos = null;
String resultFileName = null;
String fileName = "";
try {
org.apache.poi.ss.usermodel.Workbook wb;
fileName = "hkemu.xls";
wb = createReportWorkbook(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
resultFileName = "E:\\" + File.separator + "excel" + File.separator + sdf.format(new Date())
+ File.separator + fileName;
resultFileName = resultFileName.replaceAll("\\\\", "/");
File file = new File(resultFileName);
if (!file.exists()) {
file.getParentFile().mkdirs();
}
fos = new FileOutputStream(file);
os = new BufferedOutputStream(fos, 1024);
wb.write(os);
os.flush();
state = true;
} finally {
if (os != null)
os.close();
}
return state;
} private static Workbook createReportWorkbook() {
String[] titles = { "时间", "科目", "科目", "科目", "科目", "备注" };
String[] handClum = { "0,1,0,0", "0,0,1,4", "0,1,5,5" }; String[] titles2 = { "时间", "科目一", "科目二", "科目三", "科目四", "备注" }; // 创建HSSFWorkbook对象,对应一个Excel文件
HSSFWorkbook wb = new HSSFWorkbook();
// 在wb中添加一个sheet,对应Excel文件中的sheet
HSSFSheet sheet = wb.createSheet("test"); CellStyle style = wb.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER);// 设置单元格水平居中
style.setVerticalAlignment(VerticalAlignment.CENTER);// 设置单元格垂直居中 for (int i = 0; i < titles.length; i++) {
sheet.setColumnWidth(i, 5000);
} // 在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
HSSFRow row = sheet.createRow(0);// 创建表头1
for (int i = 0; i < titles.length; i++) {
HSSFCell cell = row.createCell(i);
cell.setCellStyle(style);
cell.setCellValue(titles[i]);
} // 动态合并单元格
for (int i = 0; i < handClum.length; i++) { // sheet.autoSizeColumn(i, true);
String[] temp = handClum[i].split(",");
Integer startrow = Integer.parseInt(temp[0]);
Integer overrow = Integer.parseInt(temp[1]);
Integer startcol = Integer.parseInt(temp[2]);
Integer overcol = Integer.parseInt(temp[3]);
sheet.addMergedRegion(new CellRangeAddress(startrow, overrow, startcol, overcol));
} row = sheet.createRow(1);// 创建表头2
for (int i = 0; i < titles2.length; i++) {
HSSFCell cell = row.createCell(i);
cell.setCellStyle(style);
cell.setCellValue(titles2[i]);
} List<keMu> kemus = new ArrayList<keMu>();
for (int i = 0; i < 1000; i++) {
keMu kemu = new keMu();
kemu.setCreateDate("2018/11/06");
kemu.setKe1("理论" + i);
kemu.setKe2("模拟" + i);
kemu.setKe3("上机" + i);
kemu.setKe4("实操" + i);
kemu.setRemark("通过");
kemus.add(kemu);
}
// 填充数据
if (kemus != null && kemus.size() > 0) {
for (int i = 0; i < kemus.size(); i++) {
HSSFRow contentRow = sheet.createRow(i + 2);// 填充类容,从第2行开始,0行给表头
for (int j = 0; j < titles2.length; j++) {
HSSFCell cell = contentRow.createCell(j);
cell.setCellStyle(style);
keMu content = kemus.get(i);
switch (j) {
case 0:
cell.setCellValue(content.getCreateDate());
break;
case 1:
cell.setCellValue(content.getKe1());
break;
case 2:
cell.setCellValue(content.getKe2());
break;
case 3:
cell.setCellValue(content.getKe3());
break;
case 4:
cell.setCellValue(content.getKe4());
break;
case 5:
cell.setCellValue(content.getRemark());
break;
}
}
}
} return wb;
} static class keMu {
private String createDate;
private String ke1;
private String ke2;
private String ke3;
private String ke4;
private String remark; public String getCreateDate() {
return createDate;
} public void setCreateDate(String createDate) {
this.createDate = createDate;
} public String getKe1() {
return ke1;
} public void setKe1(String ke1) {
this.ke1 = ke1;
} public String getKe2() {
return ke2;
} public void setKe2(String ke2) {
this.ke2 = ke2;
} public String getKe3() {
return ke3;
} public void setKe3(String ke3) {
this.ke3 = ke3;
} public String getKe4() {
return ke4;
} public void setKe4(String ke4) {
this.ke4 = ke4;
} public String getRemark() {
return remark;
} public void setRemark(String remark) {
this.remark = remark;
} }
}

Java使用POI的SXSSFWorkbook与HSSFWorkbook导出复杂表头的更多相关文章

  1. POI之SXSSFWorkbook大量数据导出至excel

    一:简介          SXSSFWorkbook是用来生成海量excel数据文件,主要原理是借助临时存储空间生成excel,          SXSSFWorkbook专门处理大数据,对于大型 ...

  2. Java集成POI进行Excele的导入导出,以及报错: java.lang.AbstractMethodError..........

    报错信息如下 java.lang.AbstractMethodError: org.apache.poi.xssf.usermodel.XSSFCell.setCellType(Lorg/apache ...

  3. poi实现excel的导入导出功能

    Java使用poi实现excel的导入导出功能: 工具类ExcelUtil,用于解析和初始化excel的数据:代码如下 package com.raycloud.kmmp.item.service.u ...

  4. Java利用POI导入导出Excel中的数据

         首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地 ...

  5. Java使用POI实现数据导出excel报表

    Java使用POI实现数据导出excel报表 在上篇文章中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式.不仅 ...

  6. java操作Excel之POI(5)利用POI实现使用模板批量导出数据

    后台导出方法: 在源文件夹src下面放个准备好的模板:/com/cy/template/userExportTemplate.xls,这个模板有头部一行: /** * 后台导出方法 * 利用POI实现 ...

  7. java操作Excel之POI(4)利用POI实现数据的批量导出

    后台导出方法: /** * 后台导出方法 * 利用POI实现数据的批量导出 */ public String export() throws Exception{ Connection con = n ...

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

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

  9. Java Struts2 POI创建Excel文件并实现文件下载

    Java Struts2 POI创建Excel文件并实现文件下载2013-09-04 18:53 6059人阅读 评论(1) 收藏 举报 分类: Java EE(49) Struts(6) 版权声明: ...

随机推荐

  1. python7.3客户端、服务端的建立

    import socket #创建客户端client=socket.socket() #生成socket连接对象client.connect("localhost",6969) # ...

  2. 改改Python代码,运行速度还能提升6万倍

    这份最新研究指出,在后摩尔定律时代,人类所获得的的算力提升将更大程度上来源于计算堆栈的「顶层」,即软件.算法和硬件架构,这将成为一个新的历史趋势. 很多人学习python,不知道从何学起.很多人学习p ...

  3. Java基础高级篇 NIO

    nio模型与io模型的对比 netty 是什么 怎么使用

  4. 解决drf_yasg中的SwaggerAPI无法正确分组问题

    swagger是后台开发中很好用的交互式文档,Django原本的Django-Swagger已经停止维护了,现在一般用drf_yasg这个包来实现文档,它里面支持swagger和redoc两种,red ...

  5. redis(一)内部机制的介绍和启动过程

    redis(一)内部机制的介绍和启动过程 redis的基本介绍 redis服务端 redis客户端 redis的持久化 redis中的文件事件和时间时间 redis的启动过程 redis的基本介绍 r ...

  6. C#开发笔记之06-为什么要尽可能的使用尾递归,编译器会为它做优化吗?

    C#开发笔记概述 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/962 访问. 从A函数跳转到B函数,在B函数执行完毕后 ...

  7. HBase存储及读写原理介绍

    一.HBase介绍及其特点 HBase是一个开源的非关系型分布式数据库,它参考了谷歌的BigTable建模,实现的编程语言为Java.它是Apache软件基金会的Hadoop项目的一部分,运行于HDF ...

  8. kafka-clients 1.0 内部请求接口文档

    AddOffsetsToTxnRequest version:0 name type defaultValue docString transactional_id STRING null The t ...

  9. 浏览器自动化的一些体会9 访问angular页面的一个问题

    发现浏览器自动化有一个重要方面没有提及,即所谓的无页面浏览器,不过最近没有需求,不想尝试,先记上一笔,以后有需求时,可以有个思路. 大约一两个月前(现在比较懒散,时间不知不觉过去,连今天是几号有时候都 ...

  10. 『JWT』,你必须了解的认证登录方案

    我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...