使用POI读取excel文件,识别空行

场景:

         最近在做项目时,需要使用解析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

  • 14
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值