[alibaba/easyexcel]空白行的坑

2024-06-20 887 views
1

对excel表格的数据直接delete,这一行数据空了,但是easyexcel依然把那些空白行进行解析了,封装对象。这造成两个问题:①:根据行数限制上传excel 不准确、②、对某些字段做非空校验时,因为有空白对象(对象不为null,属性全为null)的存在,做出错误提示

回答

3

遇到这个问题+1

6

空白行的问题,不好处理啊,作者底层也是优化POI的sax模式,sax模式对于空白行就没有处理好,要么去解决sax模式的底层,要么你自己的业务代码做出适当的处理。

1

如果你深入了解excel,那就会知道excel有物理删除和逻辑删除,所谓的空白行问题就是,你的那行是逻辑删除,并没有做物理删除,这个是读一行写入内存一行,主要是避免内存溢出,提高性能,不可能去循环判断该行是否为空,为空就不添加进去。如果不添加空的那一行,那么之后的行号就和内容对应不上了。清楚吗? 你要是有这种需求,要么模板告诉用户操作注意,要么拿到解析的数据后,自己去循环判断。

6

有没有什么解决办法呀,读取文件的时候会一直读,把excel末尾的空白行全部读入了

1

POI库,可以过滤掉逻辑删除这部分数据。

5

POI库,可以过滤掉逻辑删除这部分数据。

9

新版本 已经过滤了这些数据。请尝试升级版本

5

新版本 已经过滤了这些数据。请尝试升级版本

你好,我poi和easyExcel 都是最新版,目前还有问题

3

遇到了相同的问题

6

重写hasNext方法,判断取出来的数据,如果为空返回false就可以了

@Override
public boolean hasNext(AnalysisContext context) {
    Map<Integer, Cell> cellMap =context.readRowHolder().getCellMap();
    return !CollectionUtils.isEmpty(cellMap);
}
9

不起作用,只有第一行进入了方法判断,

9

下面是判断某行是不是空行的函数。可以判断后选择如何操作。无论是空白行在什么位置都没关系。 image

4

解决了吗?

8

Map<Integer, Cell> cellMap =analysisContext.readRowHolder().getCellMap(); boolean atLeastOneCellNotNull = cellMap.values().stream() .anyMatch(this::isCellNotNull); if (!atLeastOneCellNotNull) { // 跳过包含空单元格的行 return; }

/**

  • 判断该单元格的值是否为null
  • @param cell
  • @return */ private boolean isCellNotNull(Cell cell) { CellData cellData = (CellData) cell; Object cellValue = cellData.getData(); String stringValue = cellData.getStringValue(); BigDecimal numberValue = cellData.getNumberValue(); log.info("cellV:{}",cellValue); log.info("stringValue:{}",stringValue); log.info("numberValue:{}",numberValue); return (cellValue!=null&&!"".equals(cellValue))||(StringUtils.isNotBlank(stringValue))||(numberValue!=null); }

    ? no thanks

    private static boolean isRowEmpty(Row row) { if (row == null || row.getLastCellNum() <= 0) { return true; } for (int cellNum = row.getFirstCellNum(); cellNum <= row.getLastCellNum(); cellNum++) { Cell cell = row.getCell(cellNum); if (cell != null && cell.getCellType() != CellType.BLANK) { //此时非空行 return false; } } return true; }

3

private static boolean isRowEmpty(Row row) { if (row == null || row.getLastCellNum() <= 0) { return true; } for (int cellNum = row.getFirstCellNum(); cellNum <= row.getLastCellNum(); cellNum++) { Cell cell = row.getCell(cellNum); if (cell != null && cell.getCellType() != CellType.BLANK) { //此时非空行 return false; } } return true; }