Java 利用POI导出Excel文件,以及CSV科学计数法问题

一、研究背景

CSV文件问题

项目之前都使用CSV文件导出,导致过长的数字会显示为科学计数法,或者数值显示偏差;

解决办法

  • 在数字前加入英文符号的单引号',如此可以解决科学计数法的问题,但是用户打开CSV文件一般都是使用Microsoft Excel,此时在Excel文件中展示时,数字前会显示单引号'
  • 在数字前加入tab符号\t,如此可以解决科学计数法的问题,数据展示也没问题了;

新的问题

但对于本项目新的问题是:这些数字数据,客户可能会复制出来,进行二次操作使用,以上解决办法都无法使得复制出来的数值不带额外的符号,影响用户使用;所以我决定为了用户体验,更换导出工具为POI

二、CSV与Excel的对比

  • 由于CSV文件是纯文本文档,.xls和.xlsx文件是二进制文件,所以在导出excel确实比CSV麻烦,不能流式处理,导致占用比较大的内存,且耗时多一些;
  • 而且对于数据量的限制上,CSV是没有限制的,而Excel系列的文件都有一定的限制。
  • 不过,csv方式导出也存在问题。首先,如果用excel来打开csv,超过一定行数的数据都会看不见,这就是excel导出数据量限制的问题。 其次,如果你要导出一个身份证号码,手机号码,邮政编码等,纯数字构成的字符串,在excel中打开csv时,这些字段很容易被识别成数字,造成科学计数法等问题。

对于选择CSV还是Excel,各位大大可以根据自己的导出数据的需求选择,各有优势;我为了用户操作体验选择了POI,下面介绍一下几种常用的POI工具,我的使用选择以及它们之间等一个对比。

三、POI介绍

简介

目前常见读写Excel的工具类开源javaAPI有两种方式:(JXL只能实现对Excel 2003以下版本的支持)

  • JXL(Java Excel API) 官网地址:http://jexcelapi.sourceforge.net/
  • Apache的POI(Poor Obfuscation Implementation)官网地址:http://poi.apache.org/

Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。 Apache POI 是创建和维护操作各种符合:

  • Office Open XML(OOXML,即Office 2007以上版本)标准,.xlsx是07版Office,新建Excel默认保存的的Excel文件格式后缀是.xlsx;
  • 微软的OLE 2复合文档格式(OLE2,即Office 2003及以下版本)的Java API。.xls是03版Office,新建Excel默认保存的Excel文件格式的后缀是.xls。

下面是对一些常见的POI对象的列举:

HSSF - 提供读写Microsoft Excel XLS格式档案的功能。
XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能。
SXSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能。(大数据量)
HWPF - 提供读写Microsoft Word DOC格式档案的功能。
HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
HDGF - 提供读Microsoft Visio格式档案的功能。
HPBF - 提供读Microsoft Publisher格式档案的功能。
HSMF - 提供读Microsoft Outlook格式档案的功能。

POI导出Excel的数据量限制

  • sheet限制数量:256个(0~255)
  • 对于2003版,.xls后缀文件,一个Sheet工作表它的行最多支持到65536行,列支持到256列;
  • 对于2007版,.xlsx后缀文件,一个Sheet工作表它的行支持到1048576行,列支持到65536列。

HSSF、XSSF、SXSSF的区别

  • 一般来说HSSFWorkbook 导出的.xls,虽然数据量不大只有六万多行,但是够用就行,所以相对来说比较常用;
  • XSSFWookbook 对应的是EXCEL2007以后的版本,扩展名.xlsx,每个Sheet最多可以导出104万行,可以针对大数据量进行导出。不过这样就伴随着一个内存溢出(OOM)的问题,原因是你所创建的sheet、row、cell 等,先是存在内存中然后生成Excel导出的,随着数据量增大 ,内存的需求量也就增大,那么很大可能就是要OOM了;
  • 从POI 3.8版本开始,提供了一种基于XSSFWorkbook的低内存占用的工作簿SXSSFWorkbook,但是它没有提供读取文件流的方法。因此读入大数据量的时候还是只能使用XSSFWorkbook来读取;

下面详细介绍一下HSSF和SXSSF的使用,本项目大部分导出数据为几十万,所以最终选择了SXSSF

四、HSSFWorkbook具体使用

五、SXSSFWorkbook具体使用


References:

参考1、参考2、参考3、参考4

你可能感兴趣的:(Java 利用POI导出Excel文件,以及CSV科学计数法问题)