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文档的更多相关文章

  1. struts2中利用POI导出Excel文档并下载

    1.项目组负责人让我实现这个接口,因为以前做过类似的,中间并没有遇到什么太困难的事情.其他不说,先上代码: package com.tydic.eshop.action.feedback; impor ...

  2. 转:ASP.NET MVC 将IList<T>导出Excel文档的泛型类

    /// <summary> /// 提供将泛型集合数据导出Excel文档. /// </summary> /// <typeparam name="T" ...

  3. Java之Poi导出Excel文档

    一.Poi简介 在后台管理系统中,我们经常要做的导出操作,通常导出为Excel文档的形式,而Poi则提供了这种需要的支持. 二.Workbook/HSSFWorkbook/XSSFWorkbook 1 ...

  4. asp.net mvc4使用NPOI 数据处理之快速导出Excel文档

    一.背景 在之前做的小项目里有一需求是:要求将一活动录入的数据进行统计,并以excel表格形式导出来,并且对表格格式要求并不高. 二.问题分析 鉴于用户只要求最终将数据库中的数据导出excel,对于格 ...

  5. POI导出Excel文档通用工具方法

    import java.lang.reflect.InvocationTargetException; import java.util.List; import java.util.Map; imp ...

  6. Asp.net中导出Excel文档(Gridview)

    主要思路,通过GridView来导出文档. 新建一个Aspx页面,页面创建GridView控件,后台绑定好数据源.然后load中直接打印即可导出 前台的GridView <asp:GridVie ...

  7. C# NPOI 导入与导出Excel文档 兼容xlsx, xls

    之前写了个小程序,导出一些数据成Excel,程序使用的是Microsoft.Office.Interop.Excel类来操作Excel. 在本机测试的时候都好好的,但是将生成文件放到其他电脑上却怎样也 ...

  8. [转]C# NPOI 导入与导出Excel文档 兼容xlsx, xls

    本文转自:https://www.cnblogs.com/lazyneal/p/6148912.html 参考:http://www.cnblogs.com/restran/p/3889479.htm ...

  9. 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中包含文 ...

随机推荐

  1. Nginx配置详细

    ######Nginx配置文件nginx.conf中文详解##### #定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_ ...

  2. [原创]MSP430FR4133练习(一):GPIO输入电平状态判断

    硬件环境:MSP430FR4133 LANCHPAD开发板 软件环境:IARV7.10 For 430 源代码: #include "driverlib.h" void main( ...

  3. Springframework和Hibernate版本对应关系

    org.springframework 3.0.x对应org.hibernate4.0.x版本 org.springframework 3.2.x对应org.hibernate4.2.x版本 org. ...

  4. Guava学习笔记(三):集合

    添加Maven依赖 ListsTest import com.google.common.collect.Lists; import org.hamcrest.core.Is; import org. ...

  5. 追踪go语言(golang)的新版本新特性【摘抄】

    Go 2.0 新特性展望:详细 go2.0 会有什么新特性呢?下图是一个老外的调侃,他不希望发生这样的事情(please don't make it happen).我倒是希望其中一些实现,比如泛型和 ...

  6. ios开发之--valueForKeyPath的用法

    1.获取数组中的平均值,最大值,最小值,总和,代码如下: NSArray *ary = @[@,@,@,@,@,@,@]; [self caculateArray:ary]; -(NSString * ...

  7. 编译你的第一个Java虚拟机--Centos 7 编译openJdk1.7源码

    一.前言 最近在看<深入java虚拟机>,看完后,打算自己实际编译一个jvm出来看看,实践一下. 书上提到了Oracle JDK和OpenJdk的关系,Oracle Jdk7 和OpenJ ...

  8. MyEclipse启动Tomcat缓慢的原因及解决办法

    不知道朋友们是否有一种烦恼:有时候使用MyEclipse启动Tomcat十分缓慢,可能在几分钟前20秒以内,但现在却需要200秒开外:其间内存和CPU都被占用地厉害,而控制台的输出似乎有重复的迹象:而 ...

  9. 学习mongoDB的网站

  10. IDEA中将WEB-INF\lib下的Jar包添加到项目中

    打开Project Structure[可以使用快捷键:Ctrl+Alt+Shift+S]左侧选中Modules,在Dependecies中,点击右侧“+”号,选择JARS or directorie ...