Java POI关于EXCEL拆分合并单元格并重新赋值,以及空行移除

业务资料Excel为主,要导入数据库的时候发现还得先去除合并单元格
---------------------------以下理解不可避免出现谬误-------------------------------
Excel单元格的“空”有两种。一种是Null,可以getCell再判断,直接getvalue会报错
还有一种是CellType.BLANK(旧版是Cell.CELL_TYPE_BLANK)

POI的Region操作是读一个sheet(页)的所有合并单元格
相当于你有多少划分好的区域,存在方法进行统计和遍历

每个合并单元格,默认对应区域的第一行第一列的Cell有效,值为合并单元格显示的值
用removeRegion,原区域的其他Cell会变成CellType.BLANK(也有可能是null?)

去除单列多行的合并单元格可以这样操作:

//合并单元格数量
int sheetMergeCount = hssfSheet.getNumMergedRegions();
//合并单元格位置(地址)
CellRangeAddress range = (CellRangeAddress) hssfSheet.getMergedRegion(k);
//移除,有余的会变为BLANK
hssfSheet.removeMergedRegion(k);
HSSFCell cfirst = hssfSheet.getRow(firstRow).getCell(firstColumn);
for (int m = firstRow + 1; m <= lastRow; m++) {
	HSSFCell tc = hssfSheet.getRow(m).getCell(firstColumn);
	copyCell(hssfWorkbook, cfirst, tc, true);//也可以在下面直接用CreateCell覆盖空的Cell

	FileOutputStream fos = new FileOutputStream(filePath);
	hssfWorkbook.write(fos);
	fos.close();
}

--------------------------------------------空行移除----------------------------------------------
网上看了很多资料,多是直接告诉你对应行什么的
这里说一种常用的情况:

if (probe == null || probe.equals("")) {
	hssfSheet.removeRow(row);
	if ((i+1) <= lrn) {
		hssfSheet.shiftRows(i+1, lrn, -1);
		lrn--;
		i--;
	}
}

删一行,下面的行往上移位
i+1相当于被移除行的下一行,lrn是表的总长,-1向上移动一行。
行移动相当于行覆盖。如同便利贴的尾部堆叠,或者牛皮癣广告的覆盖贴合。

你可能感兴趣的:(工作日常)