一、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. Java实现短信验证码

    前言 本人使用的是阿里短信服务,一开始尝试了许多不同的第三方短信服务平台,比如秒滴科技.梦网云通讯.当初开始为什么会选择这两个,首先因为,他们注册就送10元钱(#^.^#),但是后来却发现他们都需要认 ...

  2. (转载+新增)Win7下安装配置gVim

    转载自 http://www.cnblogs.com/zhcncn/p/4151701.html.而后安装过程中加入自己遇到的问题解决方案. 本文根据vim官网的<Simple Steps to ...

  3. jenkins集成spring boot持续化构建代码

    我个人使用的是阿里云的云服务器,项目采用的是spring boot为框架,现在要做的功能就是将本地开发的代码提交到github中,通过jenkins自动化集成部署到云服务器.接下来开始步骤. 1 首先 ...

  4. 为何选择spark!

    随着大数据处理的应用场景越来越多,人们对Hadoop的要求也越来越高,开发出的对应的系统也越来越多,人们迫切的需要一个综合的计算框架,Spark应运而生,我们可以看看Spark可以干些什么. 那么为什 ...

  5. Java 变量及运算符

    Java概述 Java的发展可以归纳如下的几个阶段: (1)第一阶段(完善期):JDK 1.0 ( 1995年推出)一JDK 1.2 (1998年推出,Java更名为Java 2): (2)第二阶段( ...

  6. 19c新环境安装补丁(三)_推荐

    本次安装Oracle RAC 19.3 版本 Linux red-hat 7.8  DB安装补丁  RUR 20200717. 本次安装Oracle补丁的方法类似于11G RAC打补丁的方法.  [可 ...

  7. python设计模式之责任链模式

    python设计模式之责任链模式 开发一个应用时,多数时候我们都能预先知道哪个方法能处理某个特定请求.然而,情况并非总是如此.例如,想想任意一种广播计算机网络,例如最早的以太网实现.在广播计算机网络中 ...

  8. 【算法•日更•第二十三期】数据结构:two-pointer(尺取法)&莫队

    ▎引入 ☞『例题』 一道十分easy的题: 洛谷P1638 长度为n的序列,m种数 找一个最短区间,使得所有数出现一遍 n≤1e6 ,m≤2e3. ☞『分析』 这道题非常的简单,但是如果不会two-p ...

  9. extJS--尚

    ExtJS依赖JavaScript,JavaScript推荐两本书:<JavaScript高级程序设计>初阶阶段, <JavaScript设计模式>中级阶段 fun1();// ...

  10. Spring注解驱动开发04(给容器中注册组件的方式)

    给容器中注册组件的方式 1. 组件注解标注 + 包扫描(适用于自己写的类) //控制层组件 @Controller public class PersonController { } //业务逻辑层组 ...