POI中EXCEL使用总结

本文介绍了Java中使用ApachePOI库操作Excel的三种对象——HSSFWorkbook、XSSFWorkbook和SXSSFWorkbook,它们分别适用于不同版本的Excel和数据量场景。对于单元格类型,文章详细阐述了各种类型及其可能的陷阱,如空值处理和数字与字符串类型的转换。此外,还讨论了设置默认样式、单元格换行以及在处理大量数据时如何避免内存溢出的问题。
摘要由CSDN通过智能技术生成

一、操作excel的有三种对象;HSSFWorkbook、XSSFWorkbook、SXSSFWorkbook三种对象

HSSFWorkbook:用于操作Excel2003及以前的版本,扩展名为.xls;单个sheet最多支持65536

行,256列

使用场景:导出的行数最多为65535行,一般不会出现内存溢出(OOM)

XSSFWorkbook:用于操作Excel2007及以上的版本,扩展名为.xlsx,可以导出行数为104万行,

弥 补.xls缺陷;最多支持1048576行,16384列;

使用场景:大数据量的导出,但是由于创建的book、sheet、row、cell保存在内存中,数据

量过 大会导致OOM

SXSSFWorkbook:解决上面的问题,导出根据行数可以持久化到磁盘-poi.jar 3.8+

使用场景:new SXSSFWorkbook(5000)设置最大内存量为5000行,行数达到500行时,会

把内存持久化写到文件中,逐步写入,解决OOM问题

二、单元格对象cell类型以及坑:

CELL_TYPE_NUMERIC 数值型 0

CELL_TYPE_STRING 字符串型 1

CELL_TYPE_FORMULA 公式型 2

CELL_TYPE_BLANK 空值 3

CELL_TYPE_BOOLEAN 布尔型 4

CELL_TYPE_ERROR 错误 5

日期既是CELL_TYPE_FORMULA 也是CELL_TYPE_STRING

数字既是CELL_TYPE_NUMERIC也可以是CELL_TYPE_FORMULA

在读取Cell内容时,遇到当CellType == CELL_BLANK_TYPE时

  a、按照cell.getNumericCellValue()读取,会读取到0.0

  b、按照cell.getStringCellValue()读取,会读取到empty的String

注意:

1.单元格中,内容为数字时;默认会按照CELL_TYPE_NUMERIC 数值型 0去读取,默认是还有一个小数点的,使用String.valueof()转化时,要切割掉“.”;当设置为文本类型时,则直接获取到是整数;

示例:单元格内容cell:14

CELL_TYPE_NUMERIC 数值型 0 ;String.valueof(cell)值为:14.0

CELL_TYPE_STRING 字符串型 1;String.valueof(cell)值为:14

可以使用org.apache.commons.lang3.StringUtils的API:StringUtils.substringBefore使用;

2.单元格cell读取的值,即根据cell进行空行的判断

/**空行判断代码*/
 for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) {
     Cell cell = row.getCell(i)
         //cell只有两种类型分别为:null CELL_TYPE_BLANK
          if (cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK) {
               rowEmpty = false;
       }
}
 rowEmpty = true;

3.在POI中使用excel的导入和导出POI为空情况分析

问题主要在于使用自定义的excel导出后,填写值导入的情况,读取判空情况

如下:

生成的excel中:

如果单元格即没有值也没有样式

Cell cell = row.getCell(i);//获取到的cell为null
row.getFirstCellNum();//调用获取下标时,如果在该cell之前之后没有样式,会忽略当前的cell

如果单元格有样式,则可以获取到该cell

导出excel中,给单元格赋值了,特别为("")时;获取单元格类型为该单元格的本身的类型值,不为CELL_TYPE_BLANK;

//导出excel
cell.setCellValue("");
//没有更改过这个cell,导入时
cell.getCellType() != Cell.CELL_TYPE_BLANK

但是如果对该单元格进行过赋值操作,最后excel中,该单元格无值,则获取的为

cell.getCellType() == Cell.CELL_TYPE_BLANK

三、API

1.设置默认的样式,参数是列下标,和设置的样式

setDefaultColumnStyle(int column, CellStyle style)

解读:1.设置的默认按照列设置的,如果在其中某单元格设置了其他的样式,就会覆盖默认样式

2.默认样式的单元格内没有设置其他的样式,也没有给值时,使用poi不会读取到该单元格;但是如果设置了样式,但是没有值,使用poi的api获取行数、单元格数时,则会读取到;

2.单元格文本换行

a.开启自动换行

style.setWrapText(true)

b.强制某个位置进行换行,与excel操作中的ALT+ENTER类似效果

"\n在要换行的位置前加斜杠n"

"\r\n在换行的位置前加斜杠r和斜杠n则是换两行"

设置excel单元格样式列宽API可参见:

(42条消息) POI 导出Excel实现合并单元格以及列自适应宽度_Mr_温少的博客-CSDN博客

(42条消息) 解决java poi之SXSSFWorkbook导出大数据量时自适应列宽效果异常问题_sxssfworkbook导出设置宽度并自动换行_逆水_行舟的博客-CSDN博客

POI使用详解 - 空谷幽澜 - 博客园 (cnblogs.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值