对excel表格的数据直接delete,这一行数据空了,但是easyexcel依然把那些空白行进行解析了,封装对象。这造成两个问题:①:根据行数限制上传excel 不准确、②、对某些字段做非空校验时,因为有空白对象(对象不为null,属性全为null)的存在,做出错误提示
[alibaba/easyexcel]空白行的坑
回答
遇到这个问题+1
空白行的问题,不好处理啊,作者底层也是优化POI的sax模式,sax模式对于空白行就没有处理好,要么去解决sax模式的底层,要么你自己的业务代码做出适当的处理。
如果你深入了解excel,那就会知道excel有物理删除和逻辑删除,所谓的空白行问题就是,你的那行是逻辑删除,并没有做物理删除,这个是读一行写入内存一行,主要是避免内存溢出,提高性能,不可能去循环判断该行是否为空,为空就不添加进去。如果不添加空的那一行,那么之后的行号就和内容对应不上了。清楚吗? 你要是有这种需求,要么模板告诉用户操作注意,要么拿到解析的数据后,自己去循环判断。
有没有什么解决办法呀,读取文件的时候会一直读,把excel末尾的空白行全部读入了
POI库,可以过滤掉逻辑删除这部分数据。
POI库,可以过滤掉逻辑删除这部分数据。
新版本 已经过滤了这些数据。请尝试升级版本
新版本 已经过滤了这些数据。请尝试升级版本
你好,我poi和easyExcel 都是最新版,目前还有问题
遇到了相同的问题
重写hasNext
方法,判断取出来的数据,如果为空返回false
就可以了
@Override
public boolean hasNext(AnalysisContext context) {
Map<Integer, Cell> cellMap =context.readRowHolder().getCellMap();
return !CollectionUtils.isEmpty(cellMap);
}
不起作用,只有第一行进入了方法判断,
下面是判断某行是不是空行的函数。可以判断后选择如何操作。无论是空白行在什么位置都没关系。
解决了吗?
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
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; }