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中包含文 ...
随机推荐
- A Tour of ParallelExtensionsExtras
Throughout the development of Parallel Extensions for the .NET Framework 4, we've come across a myri ...
- 关于Unity中NGUI的Pivot和锚点
Pivot 1.创建一个Sprite类型的Sprite1节点,关联一个图集和一张贴图,用图中的六个按钮调整这个贴图的Pivot点,一共有八个点可以选择 2.再创建一个Sprite类型的Sprite2节 ...
- psd页面切割成html技巧总结
关键字:psd切割技巧 生成html图片要点 css样式要点 rem 与高手切割后的代码对比学习提高(考察点:切割后的页面质量,源码大小及图片大小,js技术,动画技术,开发和命名规范等) 一.psd切 ...
- Mysql EF 触发器生成主键id 存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。刷新 ObjectStateManager 项 ;System.Data.Entity.Infrastructure.DbUpdateConcurrencyException
http://stackoverflow.com/questions/24725261/how-to-use-a-custom-identity-column-in-sql-with-entity-f ...
- JAVA常用基础知识点[继承,抽象,接口,静态,枚举,反射,泛型,多线程...]
类的继承 Java只支持单继承,不允许多重继承- 一个子类只能有一个父类- 一个父类可以派生出多个子类这里写图片描述子类继承了父类,就继承了父类的方法和属性.在子类中,可以使用父类中定义的方法和属性, ...
- 【代码审计】五指CMS_v4.1.0 copyfrom.php 页面存在SQL注入漏洞分析
0x00 环境准备 五指CMS官网:https://www.wuzhicms.com/ 网站源码版本:五指CMS v4.1.0 UTF-8 开源版 程序源码下载:https://www.wuzhi ...
- 显示windows的音频的输入输出设备
#include "stdafx.h" /************************音频的输入输出设备**************************/ #include ...
- sencha touch datepicker/datepickerfield(时间选择控件)扩展
参考资料: https://market.sencha.com/extensions/datetimepicker 适用于2.4.1版本 uxPickerTime 使用方法参考:datepicker控 ...
- day_6.16网络编程
单线程服务器select版: select ---->最多1024个 poll ----->解决了套接字上限的问题----->轮询检测 关于 sys模块: 通过fd找套接字 协程: ...
- A股行情记录
14年:券商 + 高铁 15年:大牛 16年:钢铁,煤炭(去产能) 17年:消费,大白马(去杠杆) 18年:科技股,垃圾股(股权质押),科创板 19年:券商 + 大金融 + 科技股 ?