diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/analysis/ExcelAnalyserImpl.java b/easyexcel-core/src/main/java/com/alibaba/excel/analysis/ExcelAnalyserImpl.java index 8421a160..97e05fec 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/analysis/ExcelAnalyserImpl.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/analysis/ExcelAnalyserImpl.java @@ -12,14 +12,15 @@ import com.alibaba.excel.context.xlsx.DefaultXlsxReadContext; import com.alibaba.excel.context.xlsx.XlsxReadContext; import com.alibaba.excel.exception.ExcelAnalysisException; import com.alibaba.excel.exception.ExcelAnalysisStopException; +import com.alibaba.excel.read.listener.ReadListener; import com.alibaba.excel.read.metadata.ReadSheet; import com.alibaba.excel.read.metadata.ReadWorkbook; +import com.alibaba.excel.read.metadata.holder.ReadSheetHolder; import com.alibaba.excel.read.metadata.holder.ReadWorkbookHolder; import com.alibaba.excel.read.metadata.holder.csv.CsvReadWorkbookHolder; import com.alibaba.excel.read.metadata.holder.xls.XlsReadWorkbookHolder; import com.alibaba.excel.read.metadata.holder.xlsx.XlsxReadWorkbookHolder; import com.alibaba.excel.support.ExcelTypeEnum; -import com.alibaba.excel.util.ClassUtils; import com.alibaba.excel.util.DateUtils; import com.alibaba.excel.util.FileUtils; import com.alibaba.excel.util.NumberDataFormatterUtils; @@ -126,6 +127,7 @@ public class ExcelAnalyserImpl implements ExcelAnalyser { if (LOGGER.isDebugEnabled()) { LOGGER.debug("Custom stop!"); } + callBackCustomListener(analysisContext); } } catch (RuntimeException e) { finish(); @@ -213,7 +215,6 @@ public class ExcelAnalyserImpl implements ExcelAnalyser { private void removeThreadLocalCache() { NumberDataFormatterUtils.removeThreadLocalCache(); DateUtils.removeThreadLocalCache(); - ClassUtils.removeThreadLocalCache(); } private void clearEncrypt03() { @@ -233,4 +234,17 @@ public class ExcelAnalyserImpl implements ExcelAnalyser { public AnalysisContext analysisContext() { return analysisContext; } + + + /** + * custom listener call back should be execute when ExcelAnalysisStopException + * + * @see ExcelAnalysisStopException + **/ + private void callBackCustomListener(AnalysisContext analysisContext) { + ReadSheetHolder readSheetHolder = analysisContext.readSheetHolder(); + for (ReadListener readListener : readSheetHolder.readListenerList()) { + readListener.doAfterAllAnalysed(analysisContext); + } + } } diff --git a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/issue3195/Issue3159Test.java b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/issue3195/Issue3159Test.java new file mode 100644 index 00000000..ba9f6011 --- /dev/null +++ b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/temp/issue3195/Issue3159Test.java @@ -0,0 +1,55 @@ +package com.alibaba.easyexcel.test.temp.issue3195; + +import com.alibaba.easyexcel.test.util.TestFileUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.Map; + +@Slf4j +public class Issue3159Test { + + + /** + * 当用户手动停止执行时,doAfterAllAnalysed方法应该仍然回调 + **/ + @Test + public void callBackRead() { + String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx"; + ModifyHasNextListener listener = new ModifyHasNextListener(); + EasyExcel.read(fileName, listener).doReadAll(); + Assertions.assertTrue(listener.willTure); + } + + + public static class ModifyHasNextListener extends AnalysisEventListener> { + + boolean hasNext = true; + + boolean willTure = false; + + @Override + public void invoke(Map data, AnalysisContext context) { + if (!hasNext) { + return; + } + hasNext = false; + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + willTure = true; + } + + @Override + public boolean hasNext(AnalysisContext context) { + return hasNext; + } + } + +}