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