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内核学习(一)之内核介绍

    内核与操作系统: 内核是操作系统的核心部分,包含了系统运行的核心过程,决定系统的性能,操作系统启动内核被装入到RAM中: 操作系统与底层硬件设备交互和为运行应用程序提供执行环境. Linux内核与微内 ...

  2. Go指南练习_图像

    https://tour.go-zh.org/methods/25 一.题目描述 还记得之前编写的图片生成器吗?我们再来编写另外一个,不过这次它将会返回一个 image.Image 的实现而非一个数据 ...

  3. 【DL】梯度下降小结

    温故知新 https://www.cnblogs.com/pinard/p/5970503.html

  4. 利用Google开源Java容器化工具Jib构建镜像

    转载:https://blog.csdn.net/u012562943/article/details/80995373 一.前言 容器的出现让Java开发人员比以往任何时候都更接近“编写一次,到处运 ...

  5. dokcer使用--link 让容器相连

    在使用Docker的时候我们会常常碰到这么一种应用,就是我需要两个或多个容器,其中某些容器需要使用另外一些容器提供的服务.比如这么一种情况:我们需要一个容器来提供MySQL的数据库服务,而另外两个容器 ...

  6. Nginx安装及配置免费HTTPS证书

    第一步:安装Nginx 安装Nginx 第二步:安装HTTPS证书( Let's Encrypt) 安装HTTPS证书 第三步骤:浏览器验证 Chrome浏览器打开开发者工具->Security ...

  7. linux环境变量配置,转载地址:http://blog.sina.com.cn/rss/1650981242.xml

    学习总结 1.Linux的变量种类按变量的生存周期来划分,Linux变量可分为两类:1.     永久的:需要修改配置文件,变量永久生效.2.     临时的:使用export命令行声明即可,变量在关 ...

  8. js 去掉花括号

    "asd {{name}} {{age}}".replace(/{{(.*?)}}/g,'$1'); // "asd name age" "asd { ...

  9. 关于ICO的一些理解

    第一次看到ICO,估计很多人都处于懵逼的状态,感觉很抽象. 提到IOC可能想到的下一个词语就是DI IOC:控制反转 DI:依赖注入 那么什么是控制反转呢? 我以前对这个概念也很模糊,最近在知乎上看到 ...

  10. 洛谷P1101 单词方阵【暴力】【字符串】

    题目描述 给一n×nn \times nn×n的字母方阵,内可能蕴含多个“yizhong”单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着 888 个方向的任一方向,同一单词摆放时不再改变方向, ...