记录POI读取excel表格文件,空行校验

如题,前几天在使用poi读取excel表时,有效数据行数只有几百行,但表格行数有几千行,结果调用sheet.getLastNum时空行也算在内了!本来解析读取就慢,现在更是浪费时间。查了一下终于看到一位老哥多年前的好文,空行校验,话不多说,上菜!

excel空行校验方法


public String importMtrFile(MultipartFile file) throws IOException, BusinessException {
        int startRow = 0;
        int count = 0;
        if (file.isEmpty()) {
            throw new BusinessException(BusinessCodeEnum.PARAMETER_ERROR,"上传的文件不能为空");
        }

        InputStream inputStream = file.getInputStream();
        //文件的原名称
        long size = file.getSize();
        String originalFilename = file.getOriginalFilename();
        String fileExtName = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
        //String path = fdfsUtil.uploadFileStream(inputStream, size, originalFilename);
        logger.info("upload file path: " + originalFilename);
        Date date = new Date();
        ActiveUser activeUser = (ActiveUser) SecurityUtils.getSubject().getPrincipal();
        String operator = activeUser.getUser().getUsername();
        // 读取excel
        Workbook wb = null;
        try {
            wb = WorkbookFactory.create(inputStream);//new FileInputStream(inputStream)

            Sheet sheet = wb.getSheetAt(2);  // 这里是获取excel的的第几个sheet(工作表)
            
            startRow = 0;  //  行遍历起始索引  从0开始

//            int endRow = sheet.getLastRowNum();   // 有问题,获取到的空row也算在内
            int endRow = 598;   // 测试  被迫一开始手动定义遍历的行终点,哭唧唧

            while (startRow <= endRow) {

                Row row = sheet.getRow(startRow);  // 获取每一行数据
				...  // 对数据的查询或校验,如下举例
				// 方式①一个一个列数据读取
				String time = getCellValue(row, 0);  // 获取该行名为time的列数据,函数为自定义
				// 方式②循环读取所有列
				for(int i = 0; i < row.getLastCellNum(); i++){
					System.out.println(getCellValue(row, i));
				}
                startRow++;
                count++;
            }
        } catch (Exception e) {
            logger.error(e.getMessage());
        } finally {
            try {
                wb.close();
            } catch (Exception e) {
                logger.error(e.getMessage());
            }
        }
        //TODO
        return  "共导入" + count + "行数据";
    }


//判断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;
}

有了判空方法后,直接每次行row+1,然后判空,非空的时候执行while循环就可以。

放上getCellValue()方法:

private String getCellValue(Row row, int cellIndex) {
        logger.info("row: " + row.getRowNum() + " cellIndex: " + cellIndex);
        if (row.getCell(cellIndex) == null || row.getCell(cellIndex).getCellTypeEnum() == CellType.BLANK)
            return "";
        // formatter 格式化, 读取任何类型的cell数据
        DataFormatter formatter = new DataFormatter();
        logger.info(formatter.formatCellValue(row.getCell(cellIndex)));
        return formatter.formatCellValue(row.getCell(cellIndex));
}

前人栽树,后人乘凉~~

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值