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. 修改Linux下的文件以及文件夹的权限

    如何在Linux中管理文件和文件夹的权限? 2014-02-12 10:58 布加迪编译 51CTO 字号:T | T Linux系统有严格的权限管理制度,操作者权限与文件权限不匹配时将无法对文件进行 ...

  2. Java如何根据主机名(域名)获取IP地址?

    在Java编程中,如何根据主机名(域名)获取IP地址? 以下示例显示了如何通过net.InetAddress类的InetAddress.getByName()方法将主机名更改为指定的IP地址. pac ...

  3. myeclipse创建hibernate工程

    1.创建数据库: from blog http://www.cnblogs.com/zhaocundang/p/9061959.html 使用navicat mysql IDE: 创建数据库 book ...

  4. react给一个div行内加背景图片并实现cover覆盖模式居中显示

    具体background简写可以参考这篇文章. 这里注意,如果简写里要写background-size,则这里必须写 /  ,否则整个背景图片样式没有解析出来. 它和font以及border-radi ...

  5. 一、K3 Cloud 实施指导《K3 Cloud实施手册》

    1.在BOS的单据体取不到序号字段 举例:单据体标识是FValueGrid,序号标识是FSeq,取到的序号标识要写成FValueGrid_FSeq才能识别到 2.k3 Cloud目前不支持在表头字段调 ...

  6. [转]openstack-kilo--issue(十四)Tunnel IP %(ip)s in use with host %(host)s'

    bug: http://lists.openstack.org/pipermail/openstack-operators/2015-August/007924.html https://bugs.l ...

  7. kafka+zookeeper环境配置(linux环境单机版)

    版本: CentOS-6.5-x86_64 zookeeper-3.4.6 kafka_2.10-0.10.1.0 一.zookeeper下载与安装 1)下载 $ wget http://mirror ...

  8. [转]CDN(内容分发网络)技术原理

    1. 前言 Internet的高速发展,给人们的工作和生活带来了极大的便利,对Internet的服务品质和访问速度要求越来越高,虽然带宽不断增加, 用户数量也在不断增加,受Web服务器的负荷和传输距离 ...

  9. CSS3 transition 属性过渡效果 详解

    CSS3 transition 允许 CSS 元素的属性值在一定的时间区间内平滑地过渡.我们可以在不使用 Flash 动画或 JavaScript 的情况下,在元素从一种样式变换为另一种样式时为元素添 ...

  10. hdparm命令(转)

    转自:http://man.linuxde.net/hdparm hdparm命令提供了一个命令行的接口用于读取和设置IDE或SCSI硬盘参数. 语法 hdparm(选项)(参数) 选项 -a< ...