1
建议先去看文档
异常代码
public class DemoReadListener extends AnalysisEventListener<Map<Integer, String>> {
private List<Map<Integer, String>> dataList = new ArrayList<>();
private boolean hasNext = true;
private boolean processed = false;
@Override
public void invoke(Map<Integer, String> dataMap, AnalysisContext analysisContext) {
if(!StringUtils.hasText(dataMap.get(1))) {
hasNext = false;
return;
}
dataList.add(dataMap);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
// 模拟处理剩余的一批数据
System.out.println("解析到的数据条数: " + dataList.size());
processed = true;
}
@Override
public boolean hasNext(AnalysisContext context) {
return hasNext;
}
public boolean isProcessed() {
return processed;
}
}
@Test
void normallyQuitTest() {
// 没有提前退出读取, 执行了 doAfterAllAnalysed 在内部完成了对数据的操作
DemoReadListener normallyQuitReadListener = new DemoReadListener();
EasyExcel.read(this.getClass().getResourceAsStream("/测试导入文件-结尾无数据.xlsx"))
.excelType(ExcelTypeEnum.XLSX)
.registerReadListener(normallyQuitReadListener)
.headRowNumber(1)
.doReadAll();
Assertions.assertTrue(normallyQuitReadListener.isProcessed());
}
@Test
void earlyQuitTest() {
// 提前退出读取, 没执行 doAfterAllAnalysed 没有在内部完成对数据的操作
DemoReadListener earlyQuitReadListener = new DemoReadListener();
EasyExcel.read(this.getClass().getResourceAsStream("/测试导入文件-结尾有数据.xlsx"))
.excelType(ExcelTypeEnum.XLSX)
.registerReadListener(earlyQuitReadListener)
.headRowNumber(1)
.doReadAll();
Assertions.assertTrue(earlyQuitReadListener.isProcessed());
}
异常提示
无
问题描述 需求:客户方提供的excel文档, [可能在数据行的下方存在参考档案的描述或其他信息,我需要读取其中有效的数据
问题点:根据特定的判定数据行结束的逻辑结合hasNext方法实现了读取的提前退出, 但是如果数据行下方存在其他的参考档案时, 会导致 doAfterAllAnalysed 方法没有执行。
环境:JDK1.8, easyexcel3.2.1, springboot2.6.13