场景:
最近在做项目时,需要使用解析excel数据,我使用的是poi,这个时候遇到 poi 的大坑,读取数据时,不会过滤空行!是的,不会过滤空行,比如一份excel,原来有30条数据,从底下往上删除了20条,但当使用poi 解析的时候,还是读取到30行,阿西吧类,导致我后面的业务代码报错,网上的多个方法试了都无效,最终使用最土的方法暂时性的解决了这个问题。
解决思路:
解析excel时,因为我们是有模板的,只要解析前面的几列,所以,我就想,既然我不能识别你空行,那我总能识别你一行里有几个空的单元格吧?如果这行的空单元格数量等于我需要判断的列数,那我就判定你这行是空的,说干就干,下面就是我的解决代码:
/**
* 判断是否是空行
* @param row 行对象
* @param rowNum 需要判断的列数
* @return
*/
private static int getRowIsNull(Row row,int rowNum) {
int num = 0; //空单元格的数量
for (int i = 0 ; i < rowNum ; i ++ ){
Cell cell = row.getCell(i);
if (null == cell){ //判断这个行是否为空
num ++;
}else if (cell.getCellType() == HSSFCell.CELL_TYPE_BLANK){ //空值
num ++;
}
}
return num;
}
如上面那样判断,如果还有“漏网之鱼”,还可以继续添加条件进行判断,这种方法虽然土,但是暂时可以解决我的问题 啊哈哈哈
的Row 是 org.apache.poi.ss.usermodel.Row 对象,获取方式
Workbook wb0 = null;
//判断当前excel是什么版本的文件
if (url.substring(url.length() - 4, url.length()).equals(".xls")) {
wb0 = new HSSFWorkbook(fileIn);
}else if (url.substring(url.length() - 5, url.length()).equals(".xlsx")) {
wb0 = new XSSFWorkbook(fileIn);
}else{
throw new ValidatorException("您上传的文件格式错误,请根据模板填写上传");
}
//获取第一个表单数据
Sheet sht0 = wb0.getSheetAt(0);
for (Row r : sht0) {
//处理每一行的数据
}
2020-12-16 后续更新:
execl空行校验方法:
//判断row是否为空
public static boolean isRowEmpty(Row row) {
if (null == row) {
return true;
}
int firstCellNum = row.getFirstCellNum(); //第一个列位置
int lastCellNum = row.getLastCellNum(); //最后一列位置
int nullCellNum = 0; //空列数量
for (int c = firstCellNum; c < lastCellNum; c++) {
Cell cell = row.getCell(c);
if (null == cell || Cell.CELL_TYPE_BLANK == cell.getCellType()) {
nullCellNum ++;
continue;
}
cell.setCellType(Cell.CELL_TYPE_STRING);
String cellValue = cell.getStringCellValue().trim();
if (StringUtils.isEmpty(cellValue)) {
nullCellNum ++;
}
}
//所有列都为空
if (nullCellNum == (lastCellNum - firstCellNum)) {
return true;
}
return false;
}
循环判断当前行的每一个列是否为空,如果均为空,则为空行,否则为非空行。
tips:
for循环中的Row获取它在excel 中的真实行数 : r.getRowNum() + 1