Java POI操作Excel

POI是Apache软件基金会的开放源码函式库,提供API给Java程序对Microsoft Office格式档案读和写的功能。

本文只针对POI实现对Excel的读写功能给出一些指导,以及我在开发过程中踩过的“坑”,以供大家研究学习。

需要的maven依赖包:

一、首先要讲的是如何读取excel

这里有一点要非常注意,就是兼容性问题;Excel有两种文件格式,.xls和.xlsx。

获取文件:

获得文件流:

获取工作簿:

这里WorkBook要考虑兼容性问题:

以xls结尾的应是HSSFWorkBook,以xlsx结尾的应是XSSFWorkBook,

这里可以用以下方法进行兼容性判断:

获取sheet,两种方式:

获取行对象:

若要获取第一行表头信息则可直接sheet.getRow(0),这里还可以通过row0.getLastCellNum();获取到行数据的长度(这里可能会获取到大于有效长度的数值,因为编辑的时候可能会保留了空白单元格,但是其单元格格式还保留着,这些单元格也会被识别出来,因此后面获取数据的时候,需要做判空处理),然后可以遍历获取到每个单元格的数据;

当然,也可以通过sheet0.getPhysicalNumberOfRows();获取到有效行数(这里也可能会获取到大于有效长度的数值,原因和6相同,因此获取值的时候也需要做判空处理),然后再遍历获取到所有的行数据;

获取单元格数据:

比如要获取到第一列单元格:

获取值:

这里要考虑到单元格类型,包括字符型,布尔型,数值型(包含日期类型和纯数字类型)和公式类型,另外还可能出现空值或者错误的类型,其中公式类型必须做判断,不然取出来只是计算公式,而不是真正的数值;

可以通过cell.getCellType();获取到单元格的类型,再利用以下代码来进行取值(若直接获取可能会发生类型不一致的错误):

二、写入数据

获取文件:

获得文件流:

获取工作簿:

这里WorkBook要考虑兼容性问题:

以xls结尾的应是HSSFWorkBook,以xlsx结尾的应是XSSFWorkBook,

这里可以用以下方法进行兼容性判断:

获取sheet,三种方式:

若是新建文件,则需要新建sheet:

获取行对象:

如果没有row,则需要新建row

若要获取第一行表头信息则可直接sheet.getRow(0),这里还可以通过row0.getLastCellNum();获取到行数据的长度(这里可能会获取到大于有效长度的数值,因为编辑的时候可能会保留了空白单元格,但是其单元格格式还保留着,这些单元格也会被识别出来,因此后面获取数据的时候,需要做判空处理),然后可以遍历获取到每个单元格的数据;

当然,也可以通过sheet0.getPhysicalNumberOfRows();获取到有效行数(这里也可能会获取到大于有效长度的数值,原因和6相同,因此获取值的时候也需要做判空处理),然后再遍历获取到所有的行数据;

获取单元格:

写入数据:

写入数据也要注意数据类型:

如果数据类型对应不上的话,可能会导致数据显示和公式计算结果出错!

数据写完之后,需要刷新公式计算的值,不然公式类型的单元格的值不会刷新:

0

vue + springboot + poi 实现模板文件下载

前文《el-upload+springboot实现excel文件手动上传导入数据》讲了数据导入功能,但其实在导入之前一般都是要有个下载导入模板的功能。这篇文章介绍下这个功能。

element-ui的button代码

js代码

springboot的controller代码

0

vue+springboot+hutool-poi实现导出excel

vue

springboot

hutool-poi pom 依赖

总结

以上就是vue+springboot+hutool-poi实现导出excel核心代码

+2

Java里当POI导出Excel数据比较大时的优化方案

问题

在Java里绝大多数都是使用POI进行导入导出Excel,正常情况下也都没有问题。但当导出的数据量比较大时,我留意到我本机当数据量达到两三万条(二十个列)时,就会出现内存溢出,CPU飙升到95%以上的情况。

可能换到好点的服务器上会好点,但情况并不会好太多,还是会存在瓶颈。

解决

使用 SXSSFWorkbook 类代替原来的 XSSFWorkbook 类,SXSSFWorkbook 是3.8以上的POI才开始支持。SXSSFWorkbook 相对于 XSSFWorkbook 进行了一些优化,SXSSFWorkbook是streaming 版本的XSSFWorkbook,它只会保存最新的excel rows在内存里供查看,在此之前的excel rows都会被写入到硬盘里(Windows电脑是写入到C盘根目录下的temp文件夹)。被写入到硬盘里的rows是不可见的/不可访问的。只有还保存在内存里的才可以被访问到。在数据量超过设定的值时,它会用硬盘空间来大幅降低堆内存的占用,在系统的临时文件夹目录创建一个临时文件,然后将所有大于预设行数的数据都存入临时文件,这样就降低了内存的压力,从而实现以硬盘空间换取内存空间,避免内存溢出和频繁GC导致的CPU飙升。

注:HSSFWorkbook和XSSFWorkbook的Excel Sheet导出条数上限(<=2003版)是65535行、256列,(>=2007版)是1048576行,16384列。

使用

引入pom,需要注意的是4.0.0版本的JDK需要1.8以上,如果JDK是1.7的,那么就使用3.8或者3.9版本的依赖。

我们要注意SXSSFWorkbook构造器有一些参数,其中有一个rowAccessWindowSize,代表指定的内存中缓存记录数,默认为100,它代表能从Sheet窗口看到多少刚才Create了多少Row,超过的就都放到磁盘里了,如果你设置rowAccessWindowSize为1000,那么你只能看到1000条新创建的数据,如果设置为-1,就会看到全部创建的数据。

0