之前有写过运用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. Ubuntu设置程序开机自启或者开机禁止加载

    先说说ubuntu,它有运行级别这个概念 0:停机 1:单用户形式,只root进行维护 2:多用户,不能使用net file system 3:完全多用户 5:图形化 6:重启 例子:按指定顺序.在指 ...

  2. while循环写3次用户名密码验证程序

    #变量来自原始用户名和密码 username = 'admin' password = 'nimda' #变量来自计数器 count = 0 #循环条件计数器小于3,则执行while代码块 while ...

  3. [转载]常见slave 延迟原因以及解决方法

    一  序言在运维线上M-M 架构的MySQL数据库时,接收的比较多关于主备延时的报警: 点击(此处)折叠或打开 check_ins_slave_lag (err_cnt:1)critical-slav ...

  4. 《跟我学IDEA》六、插件(编码利器)

    idea的另一个可爱之处,就是它的强大的插件,下面我以CodeGlance插件为例,这个可以快速定位代码. 第一节:安装插件 ● All plugins 显示所有插件. ● Enabled 显示当前所 ...

  5. 持续更新:从零开始的php学习生活

    其实也不是真的从零开始,在此之前我还是一边研究博学(博客美化)一边学的CSS.HTML.JavaScript的,相关内容可以戳这里. 看本文之前你最好稍微熟悉一下HTML.JavaScript什么的. ...

  6. HDU 5752 Sqrt Bo【枚举,大水题】

    Sqrt Bo Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total S ...

  7. C++面向对象作业1

    #include <iostream> #include <stdlib.h> using namespace std; class Tdate { public: Tdate ...

  8. malloc函数用法

    malloc函数用法 函数声明(函数原型): void *malloc(int size); 说明:malloc 向系统申请分配指定size个字节的内存空间.返回类型是 void* 类型.void* ...

  9. 《TensorFlow深度学习应用实践》

    http://product.dangdang.com/25207334.html 内容 简 介 本书总的指导思想是在掌握深度学习的基本知识和特性的基础上,培养使用TensorFlow进行实际编程以解 ...

  10. [OpenCV][ARM9下移植OpenCV]

    [OpenCV][ARM9下移植OpenCV]   安装环境 宿主机: Red Hat Enterprise Linux Server 6.3 开发板: mini2440 相关软件: cmake-3. ...