之前有写过运用POI的HSSF方式导出数据到Excel(见:springMVC中使用POI方式导出excel至客户端、服务器实例),但这种方式当数据量大到一定程度时容易出现内存溢出等问题。

  首先,POI提供了HSSF、XSSF以及SXSSF三种方式操作Excel。他们的区别如下:

HSSF:是操作Excel97-2003版本,扩展名为.xls。

XSSF:是操作Excel2007版本开始,扩展名为.xlsx。

SXSSF:是在XSSF基础上,POI3.8版本开始提供的一种支持低内存占用的操作方式,扩展名为.xlsx。

  其次,大家需要了解下Excel不同版本的一些区别,这些限制其实间接的局限了POI提供的API功能。

1、支持的行数、列数

Excel97-2003版本,一个sheet最大行数65536,最大列数256。

Excel2007版本开始,一个sheet最大行数1048576,最大列数16384。

2、文件大小

.xlsx文件比.xls的压缩率高,也就是相同数据量下,.xlsx的文件会小很多。

3、兼容性

Excel97-2003版本是不能打开.xlsx文件的。

Excel2007开始的版本是可以打开.xls文件的。

  根据以上内容,大家可以根据自己的需求进行选择,当然海量数据的导出肯定是推荐SXSSF的方式。编码过程中,其实不同方式的使用方式基本相同,所以互相切换也是比较简单的,只要把带有前缀的接口改成对应的就行了。如:

HSSF对应:HSSFWorkbook、HSSFSheet、HSSFRow、HSSFCell……

XSSF对应:XSSFWorkbook、XSSFSheet、XSSFRow、XSSFCell……

SXSSF对应:SXSSFWorkbook、Sheet、Row、Cell……

  规律还是挺明显的吧,除了workbook,SXSSF的接口都不带前缀,另外两种方式的各个接口都带有对应的前缀。

  另外,前面有提到SXSSF是一种低内存占用的操作方式,因为其提供了一个新的方法:

SXSSFWorkbook w3= new SXSSFWorkbook(100);//内存中保留100条数据,其余写入硬盘临时文件

在数据量超过设置的值时,会在硬盘生成临时文件保存之前的数据,而且POI会根据规则自动删除生成的这些临时文件。

  其实到这里已经结束了,但在好奇心的驱使下,个人想看看POI生成的临时文件。所以查了一下,大家说是在系统的缓存文件夹下会产生类似的临时文件,如:

poi-sxssf-sheet6849116696956134782.xml

根据操作系统的不同,通常目录如下:

Windows7: C:\Users\xxxx\AppData\Local\Temp  (xxxx为windows用户名)

Linux: /var/tmp/

但并没有找到,后来在tomcat的临时文件夹下找到了,如:D:\Tomcat_7.0.42\temp。

于是又科普了一下,发现是tomcat的原因,因为在tomcat上运行的应用会通过java.io.tmpdir系统变量获取到临时文件的目录。

大家可以通过下面的语句查看自己应用的临时文件目录:

System.out.println(System.getProperty("java.io.tmpdir"));

虽然POI会根据规则自动删除临时文件,但是知道了文件路径,大家也可以根据实际情况,看是否删除这些临时文件。

HSSF、XSSF和SXSSF区别以及Excel导出优化的更多相关文章

  1. 百万级别数据Excel导出优化

    前提 这篇文章不是标题党,下文会通过一个仿真例子分析如何优化百万级别数据Excel导出. 笔者负责维护的一个数据查询和数据导出服务是一个相对远古的单点应用,在上一次云迁移之后扩展为双节点部署,但是发现 ...

  2. HSSF,XSSF和SXSSF的区别

    HSSF是POI工程对Excel 97(-2007)文件操作的纯Java实现 XSSF是POI工程对Excel 2007 OOXML (.xlsx)文件操作的纯Java实现 从POI 3.8版本开始, ...

  3. 关于Excel导出实例(适合新手,比较详细)

    需要源代码的可以加我微信好友gqljxg1514 1,首先配置依赖pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0&q ...

  4. java excel导出(基于注解)

    小白,做日志只是为了方便自己查看,能帮到别人当然更好,不喜勿喷. 上代码 依赖: <dependency> <groupId>org.apache.poi</groupI ...

  5. 使用NPOI实现简单的Excel导出功能

    [1]NPOI是啥? NPOI是指构建在POI 3.x版本之上的一个程序,NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作. POI是一个开源的Java读写Excel. ...

  6. 记一次针对excel导出的优化

    最近发现我们系统导出excel文件时由于是导出百万级数据导出,速度过慢并且内存占用多,故进行了下面的一次优化. 我们使用apache的poi进行excel文件操作 主要耗时: 1.从数据库得到需要导出 ...

  7. 转:POI操作Excel导出

    package com.rd.lh.util.excel; import java.beans.PropertyDescriptor; import java.io.FileOutputStream; ...

  8. 用SpringMvc实现Excel导出功能

    以前只知道用poi导出Excel,最近用了SpringMvc的Excel导出功能,结合jxl和poi实现,的确比只用Poi好,两种实现方式如下: 一.结合jxl实现: 1.引入jxl的所需jar包: ...

  9. 基于jdk1.7实现的excel导出工具类

    通用excel导出工具类,基于泛型.反射.hashmap 以及基于泛型.反射.bean两种方式 import java.io.*;import java.lang.reflect.Field;impo ...

随机推荐

  1. [转载]MySQL运行状态show status详解

    要查看MySQL运行状态,要优化MySQL运行效率都少不了要运行show status查看各种状态,下面是参考官方文档及网上资料整理出来的中文详细解释,不管你是初学mysql还是你是mysql专业级的 ...

  2. es6 的循环

    for-of  循环 for-of 不能直接用来遍历对象的属性,如果你想遍历对象的属性,你可以使用 for-in 语句(for-in 就是用来干这个的),或者使用下面的方式: for (let key ...

  3. springboot整合mybaits注解开发

    springboot整合mybaits注解开发时,返回json或者map对象时,如果一个字段的value为空,需要更改springboot的配置文件 mybatis: configuration: c ...

  4. 解决前端开发sublime text 3编辑器无法安装插件的问题

    今天在笔记本电脑上安装了个sublime,但是却出现无法装插件的问题.于是稍微在网上查了些资料,并试验了一番,写了如下文章. 安装插件的步骤: 弹出 选中install package 如果出现如下问 ...

  5. linux 安装MySql 5.7.21 操作步骤

    一:到mysql官网下载最新的mysql包 mysql-5.7.21-linux-glibc2.12-x86_64 https://dev.mysql.com/downloads/mysql/ 二:在 ...

  6. linux(二)之linux常用命令一

    linux的命令非常之多,命令多就算了关键每个命令还有很多的参数.不过其实并不要去害怕它.你只要常去用,并且的话,大部分你只要记住命令,参数不记得我们可以去查帮助文档.加油吧!老帖们. 一.登入\登出 ...

  7. bzoj:1230: [Usaco2008 Nov]lites 开关灯

    Description Farmer John尝试通过和奶牛们玩益智玩具来保持他的奶牛们思维敏捷. 其中一个大型玩具是牛栏中的灯. N (2 <= N <= 100,000) 头奶牛中的每 ...

  8. [51nod1425]减减数

    初始给定一个整数n.每次可以对其做一个操作,这个操作是将n减去他其中的某一位.得到新的一个数字n',然后继续操作,直到他变成0为止. 比如24这个例子,24 → 20 → 18 → 10 → 9 → ...

  9. Big Event in HDU(多重背包套用模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=1171 Big Event in HDU Time Limit: 10000/5000 MS (Java/Othe ...

  10. 来说说datatype

    今天敲代码一直卡在一个问题上面好久那就是--datatype的未定义,起初不晓得datatype的含义,遇到这种情况首先想到的就是自己又忘记加上面头文件了.随即写了个stdlib.h上去.可是问题并没 ...