HSSF与XSSF导出excel文档
Apache POI
Apache POI 是用Java编写的免费开源的跨平台的 Java API,它可以创建和维护操作各种符合Office Open XML(OOXML)标准和微软的OLE 2复合文档格式(OLE2)的Java API。
用它可以使用Java读取和创建,修改MS Excel文件.而且,还可以使用Java读取和创建MS Word和MSPowerPoint文件。Apache POI 提供Java操作Excel解决方案(适用于Excel97-2008)。
HSSF and XSSF for Excel Documents
需要以下jar 包
<!-- office文档组件 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>2.4.0</version>
</dependency>
一、HSSF:支持 excel97—2003之间的,(.xls)
注意:97—2003excel一个sheet最多65536行。
创建步骤:
1、New Workbook//创建一个工作簿
2、New Sheet//创建一个工作表
3、createRow//创建一个行
4、row.createCell(index)//index是指定哪一列
5、cell.setCellValue(1);//向单元格设置内容
分析:WriteExcelHSSF 的代码
是按照上边步骤执行,最后进行写操作。
测试代码:
package yycg.poi; import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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 java.io.FileOutputStream; /**
* poi测试导出excel文件,数据量大出现内存溢出
*/
public class WriteExcelHSSF {
public static void main(String[] args) throws Exception {
//创建一个文件输出 流
FileOutputStream out = new FileOutputStream("d:/workbook.xls");
//创建一个工作薄
Workbook wb = new HSSFWorkbook();
for (int j = 0; j < 11; j++) {
Sheet s = wb.createSheet();//创建一个sheet
wb.setSheetName(j, "sheet"+j);//指定sheet的名称
//xls文件最大支持65536行
for (int rownum = 0; rownum < 65536; rownum++) {//创建行,.xls一个sheet中的行数最大65535
//创建一行
Row row = s.createRow(rownum);
for (int cellnum = 0; cellnum < 10; cellnum++) {//一行创建10个单元格
// 在行里边创建单元格
Cell cell = row.createCell(cellnum);
//向单元格写入数据
cell.setCellValue(cellnum);
}
}
}
System.out.println("int .......");
wb.write(out);//输出 文件内容 try {
Thread.sleep(2000);
}catch (InterruptedException e){
e.printStackTrace();
}
out.close();
System.out.println("创建excel文件成功!。。。。。。。。。。。。");
}
}
通过执行大数据抛出异常:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
内存溢出
总结:HSSF 在使用将excel数据加载到内容再写磁盘,如果是大数据量操作,会导致内存溢出。
二、XSSF:支持2007以上版本,Excel 2007 OOXML (.xlsx)
excel文件格式是基于是xml存储,这是与03版本最大的区别。
XSSF对HSSF性能更好,对内存消耗不高。
可以解决HSSF操作大数据内存溢出问题。
原理:
在创建XSSFworkbook时需要设置构造函数的参数:
SXSSFWorkbook wb = new SXSSFWorkbook(-1); //设置为-1,关闭自动写入磁盘时机,由手动进行控制
SXSSFWorkbook wb = new SXSSFWorkbook(100); //SXSSF设置100表示,只保持100个记录在内存,超过记录则写入磁盘。
创建workbook的过程和HSSF一样,先后创建workbook、sheet、row、cell
测试代码如下:
package yycg.poi; 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.util.CellReference;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook; import java.io.FileOutputStream; public class WriterExcelXSSF1 {
public static void main(String[] args) throws Exception{
//创建一个SXSSFWorkbook
//关闭自动刷新
SXSSFWorkbook wb = new SXSSFWorkbook(-1);
//创建一sheet
Sheet sheet = wb.createSheet();
for(int rownum=0;rownum<100000;rownum++){
//创建一个行
Row row = sheet.createRow(rownum);
for (int cellnum=0;cellnum<10;cellnum++){
//创建单元格
Cell cell = row.createCell(cellnum);
//单元格地址
String adress = new CellReference(cell).formatAsString();
cell.setCellValue(adress);//向单元格中写入数据
}
//手动控制行刷新到磁盘的方式
if (rownum%10000==0){//一万行向磁盘写一次
((SXSSFSheet)sheet).flushRows(100);//保留最后100行并刷新所有其他行
//Thread.sleep(1000);
System.out.println("写入....");
// ((SXSSFSheet)sh).flushRows() is a shortcut for ((SXSSFSheet)sh).flushRows(0),
// this method flushes all rows
}
} FileOutputStream out=new FileOutputStream("d:/testxssf.xlsx");
wb.write(out);//将临时文件合并,写入最终文件
out.close();
wb.dispose();
}
}
package yycg.poi; 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.util.CellReference;
import org.apache.poi.xssf.streaming.SXSSFWorkbook; public class WriteExcelSXSSF2 { public static void main(String[] args) throws Throwable {
SXSSFWorkbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory,
// exceeding rows will be
// flushed to disk
Sheet sh = wb.createSheet();
for (int rownum = 0; rownum < 1000; rownum++) {
Row row = sh.createRow(rownum);
for (int cellnum = 0; cellnum < 10; cellnum++) {
Cell cell = row.createCell(cellnum);
String address = new CellReference(cell).formatAsString();
cell.setCellValue(address);
} } FileOutputStream out = new FileOutputStream("d:/test2222.xlsx");
wb.write(out);
out.close(); // dispose of temporary files backing this workbook on disk
wb.dispose();
} }
通过跟踪发现,使用XSSF在导出大数据时,手动控制进行写磁盘,写在了临时文件中,我的电脑是:
(C:\Users\Thinkpad\AppData\Local\Temp\poi-sxssf-sheet1910970138657434208.xml 该目录有很多临时文件)
最终待导出完成将临时合并成最终文件写入磁盘。
总结:使用XSSF导出数据,将数据写入内存一部分,超过的则立即写磁盘,所以内存占有量有限不会导致内存溢出。
HSSF与XSSF导出excel文档的更多相关文章
- struts2中利用POI导出Excel文档并下载
1.项目组负责人让我实现这个接口,因为以前做过类似的,中间并没有遇到什么太困难的事情.其他不说,先上代码: package com.tydic.eshop.action.feedback; impor ...
- 转:ASP.NET MVC 将IList<T>导出Excel文档的泛型类
/// <summary> /// 提供将泛型集合数据导出Excel文档. /// </summary> /// <typeparam name="T" ...
- Java之Poi导出Excel文档
一.Poi简介 在后台管理系统中,我们经常要做的导出操作,通常导出为Excel文档的形式,而Poi则提供了这种需要的支持. 二.Workbook/HSSFWorkbook/XSSFWorkbook 1 ...
- asp.net mvc4使用NPOI 数据处理之快速导出Excel文档
一.背景 在之前做的小项目里有一需求是:要求将一活动录入的数据进行统计,并以excel表格形式导出来,并且对表格格式要求并不高. 二.问题分析 鉴于用户只要求最终将数据库中的数据导出excel,对于格 ...
- POI导出Excel文档通用工具方法
import java.lang.reflect.InvocationTargetException; import java.util.List; import java.util.Map; imp ...
- Asp.net中导出Excel文档(Gridview)
主要思路,通过GridView来导出文档. 新建一个Aspx页面,页面创建GridView控件,后台绑定好数据源.然后load中直接打印即可导出 前台的GridView <asp:GridVie ...
- C# NPOI 导入与导出Excel文档 兼容xlsx, xls
之前写了个小程序,导出一些数据成Excel,程序使用的是Microsoft.Office.Interop.Excel类来操作Excel. 在本机测试的时候都好好的,但是将生成文件放到其他电脑上却怎样也 ...
- [转]C# NPOI 导入与导出Excel文档 兼容xlsx, xls
本文转自:https://www.cnblogs.com/lazyneal/p/6148912.html 参考:http://www.cnblogs.com/restran/p/3889479.htm ...
- C# NPOI 导入与导出Excel文档 兼容xlsx, xls(xf13中已经引用了xlsx的npoi)
这里使用的NPOI版本为: 2.1.3.1 官方下载地址: http://npoi.codeplex.com/releases 版本内包含.Net 2.0 与.Net 4.0 .Net 4.0中包含文 ...
随机推荐
- Gson - 学习
Google 的 Gson 库,Gson 是一个非常强大的库,可以将 JSON 格式的数据转化成 Java 对象,也支持将 Java 对象转成 JSON 数据格式. Gson 依赖 本文将会快速开始使 ...
- windows 同时启动多个Tomcat 控制台日志(startup.bat)输出到指定文件中
1 .修改startup.bat第42行 call "%EXECUTABLE%" start %CMD_LINE_ARGS% 为 call "%EXECUTABLE%&q ...
- mybatis 传入多个参数
一.单个参数: public List<XXBean> getXXBeanList(@param("id")String id); <select id=&quo ...
- [Hinton] Neural Networks for Machine Learning - Hopfield Nets and Boltzmann Machine
Lecture 11 — Hopfield Nets Lecture 12 — Boltzmann machine learning Ref: 能量模型(EBM).限制波尔兹曼机(RBM) 高大上的模 ...
- MySQL临时表创建及旧表建新表
1.创建临时表 临时表是一张表,用来临时保存一些数据 特点: 只对创建该临时表的用户可见: 当会话结束时,MySQL自动删除临时表. 临时表的核心:建表和删表消耗资源极其少 创建临时表的基本格式: C ...
- ehcache缓存配置与参数说明
<diskStore path="java.io.tmpdir" /> <defaultCache eternal="false" maxEl ...
- echarts - 使用echarts过程中遇到的问题(pending...)
1. 配合tab切换时,被display:none的元素init设置echarts失败 2018-11-09 18:09:35 现象描述:有一个tabs选项卡,每个切换项A.B中都有使用echart ...
- Tiobe最新编程语言排行
https://www.tiobe.com/tiobe-index/
- 实验一:基于STM32F1的流水灯实验(库函数)
参考原子哥学习程序 条件:实验板STM32103ZET6:固件库STM32F10x_StdPeriph_Lib_V3.5.0:环境MDK5: 目的:了解STM32 的 IO 口如何作为输出使用 :以两 ...
- MYSQL 如何完全卸载数据库
有时候MySQL不能完全卸载,这时候必须通过一些途径删除掉注册表和一些残余的文件,然后才能重新安装才可以成功! 1.控制面板——>所有控制面板项——>程序和功能,卸载mysql serve ...