一、操作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博客;