一、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. JVM系列之:从汇编角度分析Volatile

    目录 简介 重排序 写的内存屏障 非lock和LazySet 读的性能 总结 简介 Volatile关键字对熟悉java多线程的朋友来说,应该很熟悉了.Volatile是JMM(Java Memory ...

  2. Nginx - location常见配置指令,alias、root、proxy_pass

    1.[alias]——别名配置,用于访问文件系统,在匹配到location配置的URL路径后,指向[alias]配置的路径.如: location /test/ { alias/first/secon ...

  3. SSM框架入门——整合SSM并实现对数据的增删改查功能(Eclipse平台)

    一.搭建框架环境 整个项目结构如下: 搭建SSM步骤如下: (1)准备好三大框架的jar包,如图所示 (2)在Eclipse中创建一个web project ,并把这些jar包粘贴到lib文件夹中. ...

  4. C#LeetCode刷题之#724-寻找数组的中心索引( Find Pivot Index)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3742 访问. 给定一个整数类型的数组 nums,请编写一个能够返 ...

  5. 攻防世界-web(进阶)-Training-WWW-Robots

    进行后台扫描,发现一个robots.txt,进入之后说存在fl0g.php,进入即可得flag. cyberpeace{73279bc0d3c28ba6da4d1d3d530e7c16}

  6. 【HAOI2015】树上染色 - 树形 DP

    题目描述 有一棵点数为 N 的树,树边有边权.给你一个在 0~ N 之内的正整数 K ,你要在这棵树中选择 K个点,将其染成黑色,并将其他 的N-K个点染成白色 . 将所有点染色后,你会获得黑点两两之 ...

  7. 图论算法(三) 最短路SPFA算法

    我可能要退役了…… 退役之前,写一篇和我一样悲惨的算法:SPFA 最短路算法(二)SPFA算法 Part 1:SPFA算法是什么 其实呢,SPFA算法只是在天朝大陆OIers的称呼,它的正统名字叫做: ...

  8. 第三章 kubernetes核心原理

    kubernetes API Server 提供了Kubernetes各类资源对象(如pod,re,service等)的增删改查及watch等Http Rest接口,成为集群内各个功能模块之间数据交互 ...

  9. JavaScript 空间坐标

    基础知识 首先参考画布分为视口(窗口)与文档的含义 网页很多都是多屏,所以文档尺寸一般大于视口尺寸 视口尺寸不包括浏览器工具条.菜单.标签.状态栏等 当打开控制台后,视口尺寸相应变小 文档像posit ...

  10. Spark QuantileDiscretizer 分位数离散器

    1.概念 接收具有连续特征的列,并输出具有合并分类特征的列.按分位数,对给出的数据列进行离散化分箱处理. 和Bucketizer(分箱处理)一样也是:将连续数值特征转换为离散类别特征.实际上Class ...