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

得意时要看淡,失意时要看开。不论得意失意,切莫大意;不论成功失败,切莫止步。志得意满时,需要的是淡然,给自己留一条退路;失意落魄时,需要的是泰然,给自己觅一条出路记录POI读取excel表格文件,空行校验,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

如题,前几天在使用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));
}

前人栽树,后人乘凉~~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/157309.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!