diff --git a/README.md b/README.md
index 421ffb28..d860e19f 100644
--- a/README.md
+++ b/README.md
@@ -28,7 +28,7 @@ easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析
com.alibaba
easyexcel
- 3.3.3
+ 3.3.4
```
diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/analysis/csv/CsvExcelReadExecutor.java b/easyexcel-core/src/main/java/com/alibaba/excel/analysis/csv/CsvExcelReadExecutor.java
index 6afabe34..5a901b5b 100644
--- a/easyexcel-core/src/main/java/com/alibaba/excel/analysis/csv/CsvExcelReadExecutor.java
+++ b/easyexcel-core/src/main/java/com/alibaba/excel/analysis/csv/CsvExcelReadExecutor.java
@@ -16,6 +16,8 @@ import com.alibaba.excel.enums.ByteOrderMarkEnum;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.enums.RowTypeEnum;
import com.alibaba.excel.exception.ExcelAnalysisException;
+import com.alibaba.excel.exception.ExcelAnalysisStopException;
+import com.alibaba.excel.exception.ExcelAnalysisStopSheetException;
import com.alibaba.excel.metadata.Cell;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.read.metadata.ReadSheet;
@@ -69,12 +71,18 @@ public class CsvExcelReadExecutor implements ExcelReadExecutor {
if (readSheet == null) {
continue;
}
- csvReadContext.currentSheet(readSheet);
-
- int rowIndex = 0;
-
- for (CSVRecord record : csvParser) {
- dealRecord(record, rowIndex++);
+ try {
+ csvReadContext.currentSheet(readSheet);
+
+ int rowIndex = 0;
+
+ for (CSVRecord record : csvParser) {
+ dealRecord(record, rowIndex++);
+ }
+ } catch (ExcelAnalysisStopSheetException e) {
+ if (log.isDebugEnabled()) {
+ log.debug("Custom stop!", e);
+ }
}
// The last sheet is read
diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/XlsSaxAnalyser.java b/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/XlsSaxAnalyser.java
index f18fab05..2866a7de 100644
--- a/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/XlsSaxAnalyser.java
+++ b/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/XlsSaxAnalyser.java
@@ -5,6 +5,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.eventusermodel.EventWorkbookBuilder;
import org.apache.poi.hssf.eventusermodel.FormatTrackingHSSFListener;
import org.apache.poi.hssf.eventusermodel.HSSFEventFactory;
@@ -57,6 +58,7 @@ import com.alibaba.excel.analysis.v03.handlers.TextObjectRecordHandler;
import com.alibaba.excel.context.xls.XlsReadContext;
import com.alibaba.excel.exception.ExcelAnalysisException;
import com.alibaba.excel.exception.ExcelAnalysisStopException;
+import com.alibaba.excel.exception.ExcelAnalysisStopSheetException;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.alibaba.excel.read.metadata.holder.xls.XlsReadWorkbookHolder;
@@ -70,10 +72,13 @@ import com.alibaba.excel.read.metadata.holder.xls.XlsReadWorkbookHolder;
*
* * To turn an excel file into a CSV or similar, then see * the XLS2CSVmra example *
*
- * * * @see XLS2CSVmra
+ * * * @see XLS2CSVmra
*
* @author jipengfei
*/
+@Slf4j
public class XlsSaxAnalyser implements HSSFListener, ExcelReadExecutor {
private static final Logger LOGGER = LoggerFactory.getLogger(XlsSaxAnalyser.class);
@@ -158,7 +163,16 @@ public class XlsSaxAnalyser implements HSSFListener, ExcelReadExecutor {
if (!handler.support(xlsReadContext, record)) {
return;
}
- handler.processRecord(xlsReadContext, record);
+
+ try {
+ handler.processRecord(xlsReadContext, record);
+ } catch (ExcelAnalysisStopSheetException e) {
+ if (log.isDebugEnabled()) {
+ log.debug("Custom stop!", e);
+ }
+ xlsReadContext.xlsReadWorkbookHolder().setIgnoreRecord(Boolean.TRUE);
+ xlsReadContext.xlsReadWorkbookHolder().setCurrentSheetStopped(Boolean.TRUE);
+ }
}
}
diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/BofRecordHandler.java b/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/BofRecordHandler.java
index 3e6713c4..a05568ee 100644
--- a/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/BofRecordHandler.java
+++ b/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/BofRecordHandler.java
@@ -49,6 +49,7 @@ public class BofRecordHandler extends AbstractXlsRecordHandler {
} else {
xlsReadContext.xlsReadWorkbookHolder().setIgnoreRecord(Boolean.TRUE);
}
+ xlsReadContext.xlsReadWorkbookHolder().setCurrentSheetStopped(Boolean.FALSE);
// Go read the next one
xlsReadWorkbookHolder.setReadSheetIndex(xlsReadWorkbookHolder.getReadSheetIndex() + 1);
}
diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/EofRecordHandler.java b/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/EofRecordHandler.java
index 448dcb49..6e162028 100644
--- a/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/EofRecordHandler.java
+++ b/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/EofRecordHandler.java
@@ -10,19 +10,30 @@ import com.alibaba.excel.enums.RowTypeEnum;
import com.alibaba.excel.metadata.Cell;
import com.alibaba.excel.read.metadata.holder.ReadRowHolder;
import com.alibaba.excel.read.metadata.holder.xls.XlsReadSheetHolder;
+import com.alibaba.excel.util.BooleanUtils;
/**
* Record handler
*
* @author Dan Zheng
*/
-public class EofRecordHandler extends AbstractXlsRecordHandler implements IgnorableXlsRecordHandler {
+public class EofRecordHandler extends AbstractXlsRecordHandler {
@Override
public void processRecord(XlsReadContext xlsReadContext, Record record) {
if (xlsReadContext.readSheetHolder() == null) {
return;
}
+
+ //Represents the current sheet does not need to be read or the user manually stopped reading the sheet.
+ if (BooleanUtils.isTrue(xlsReadContext.xlsReadWorkbookHolder().getIgnoreRecord())) {
+ // When the user manually stops reading the sheet, the method to end the sheet needs to be called.
+ if (BooleanUtils.isTrue(xlsReadContext.xlsReadWorkbookHolder().getCurrentSheetStopped())) {
+ xlsReadContext.analysisEventProcessor().endSheet(xlsReadContext);
+ }
+ return;
+ }
+
// Sometimes tables lack the end record of the last column
if (!xlsReadContext.xlsReadSheetHolder().getCellMap().isEmpty()) {
XlsReadSheetHolder xlsReadSheetHolder = xlsReadContext.xlsReadSheetHolder();
diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java b/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java
index 5104b1e3..a2bf163d 100644
--- a/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java
+++ b/easyexcel-core/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java
@@ -22,6 +22,8 @@ import com.alibaba.excel.cache.ReadCache;
import com.alibaba.excel.context.xlsx.XlsxReadContext;
import com.alibaba.excel.enums.CellExtraTypeEnum;
import com.alibaba.excel.exception.ExcelAnalysisException;
+import com.alibaba.excel.exception.ExcelAnalysisStopException;
+import com.alibaba.excel.exception.ExcelAnalysisStopSheetException;
import com.alibaba.excel.metadata.CellExtra;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.alibaba.excel.read.metadata.holder.xlsx.XlsxReadWorkbookHolder;
@@ -256,10 +258,16 @@ public class XlsxSaxAnalyser implements ExcelReadExecutor {
for (ReadSheet readSheet : sheetList) {
readSheet = SheetUtils.match(readSheet, xlsxReadContext);
if (readSheet != null) {
- xlsxReadContext.currentSheet(readSheet);
- parseXmlSource(sheetMap.get(readSheet.getSheetNo()), new XlsxRowHandler(xlsxReadContext));
- // Read comments
- readComments(readSheet);
+ try {
+ xlsxReadContext.currentSheet(readSheet);
+ parseXmlSource(sheetMap.get(readSheet.getSheetNo()), new XlsxRowHandler(xlsxReadContext));
+ // Read comments
+ readComments(readSheet);
+ } catch (ExcelAnalysisStopSheetException e) {
+ if (log.isDebugEnabled()) {
+ log.debug("Custom stop!", e);
+ }
+ }
// The last sheet is read
xlsxReadContext.analysisEventProcessor().endSheet(xlsxReadContext);
}
diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/exception/ExcelAnalysisStopException.java b/easyexcel-core/src/main/java/com/alibaba/excel/exception/ExcelAnalysisStopException.java
index fd66d5c1..fd05ff84 100644
--- a/easyexcel-core/src/main/java/com/alibaba/excel/exception/ExcelAnalysisStopException.java
+++ b/easyexcel-core/src/main/java/com/alibaba/excel/exception/ExcelAnalysisStopException.java
@@ -2,8 +2,11 @@ package com.alibaba.excel.exception;
/**
* Throw the exception when you need to stop
+ * This exception will stop the entire excel parsing. If you only want to stop the parsing of a certain sheet, please
+ * use ExcelAnalysisStopSheetException.
*
* @author Jiaju Zhuang
+ * @see ExcelAnalysisStopException
*/
public class ExcelAnalysisStopException extends ExcelAnalysisException {
diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/exception/ExcelAnalysisStopSheetException.java b/easyexcel-core/src/main/java/com/alibaba/excel/exception/ExcelAnalysisStopSheetException.java
new file mode 100644
index 00000000..44ca9679
--- /dev/null
+++ b/easyexcel-core/src/main/java/com/alibaba/excel/exception/ExcelAnalysisStopSheetException.java
@@ -0,0 +1,30 @@
+package com.alibaba.excel.exception;
+
+/**
+ * Throw the exception when you need to stop
+ * This exception will only stop the parsing of the current sheet. If you want to stop the entire excel parsing, please
+ * use ExcelAnalysisStopException.
+ *
+ * The com.alibaba.excel.read.listener.ReadListener#doAfterAllAnalysed(com.alibaba.excel.context.AnalysisContext) method
+ * is called after the call is stopped.
+ *
+ * @author Jiaju Zhuang
+ * @see ExcelAnalysisStopException
+ * @since 3.3.4
+ */
+public class ExcelAnalysisStopSheetException extends ExcelAnalysisException {
+
+ public ExcelAnalysisStopSheetException() {}
+
+ public ExcelAnalysisStopSheetException(String message) {
+ super(message);
+ }
+
+ public ExcelAnalysisStopSheetException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public ExcelAnalysisStopSheetException(Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/read/metadata/holder/xls/XlsReadWorkbookHolder.java b/easyexcel-core/src/main/java/com/alibaba/excel/read/metadata/holder/xls/XlsReadWorkbookHolder.java
index a8c86a75..da7d87e0 100644
--- a/easyexcel-core/src/main/java/com/alibaba/excel/read/metadata/holder/xls/XlsReadWorkbookHolder.java
+++ b/easyexcel-core/src/main/java/com/alibaba/excel/read/metadata/holder/xls/XlsReadWorkbookHolder.java
@@ -3,6 +3,10 @@ package com.alibaba.excel.read.metadata.holder.xls;
import java.util.ArrayList;
import java.util.List;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
import org.apache.poi.hssf.eventusermodel.FormatTrackingHSSFListener;
import org.apache.poi.hssf.record.BoundSheetRecord;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
@@ -17,6 +21,10 @@ import com.alibaba.excel.support.ExcelTypeEnum;
*
* @author Jiaju Zhuang
*/
+@Getter
+@Setter
+@EqualsAndHashCode
+@NoArgsConstructor
public class XlsReadWorkbookHolder extends ReadWorkbookHolder {
/**
* File System
@@ -47,6 +55,11 @@ public class XlsReadWorkbookHolder extends ReadWorkbookHolder {
*/
private Boolean ignoreRecord;
+ /**
+ * Has the current sheet already stopped
+ */
+ private Boolean currentSheetStopped;
+
public XlsReadWorkbookHolder(ReadWorkbook readWorkbook) {
super(readWorkbook);
this.boundSheetRecordList = new ArrayList();
@@ -56,61 +69,6 @@ public class XlsReadWorkbookHolder extends ReadWorkbookHolder {
getGlobalConfiguration().setUse1904windowing(Boolean.FALSE);
}
ignoreRecord = Boolean.FALSE;
- }
-
- public POIFSFileSystem getPoifsFileSystem() {
- return poifsFileSystem;
- }
-
- public void setPoifsFileSystem(POIFSFileSystem poifsFileSystem) {
- this.poifsFileSystem = poifsFileSystem;
- }
-
- public FormatTrackingHSSFListener getFormatTrackingHSSFListener() {
- return formatTrackingHSSFListener;
- }
-
- public void setFormatTrackingHSSFListener(FormatTrackingHSSFListener formatTrackingHSSFListener) {
- this.formatTrackingHSSFListener = formatTrackingHSSFListener;
- }
-
- public HSSFWorkbook getHssfWorkbook() {
- return hssfWorkbook;
- }
-
- public void setHssfWorkbook(HSSFWorkbook hssfWorkbook) {
- this.hssfWorkbook = hssfWorkbook;
- }
-
- public List getBoundSheetRecordList() {
- return boundSheetRecordList;
- }
-
- public void setBoundSheetRecordList(List boundSheetRecordList) {
- this.boundSheetRecordList = boundSheetRecordList;
- }
-
- public Boolean getNeedReadSheet() {
- return needReadSheet;
- }
-
- public void setNeedReadSheet(Boolean needReadSheet) {
- this.needReadSheet = needReadSheet;
- }
-
- public Integer getReadSheetIndex() {
- return readSheetIndex;
- }
-
- public void setReadSheetIndex(Integer readSheetIndex) {
- this.readSheetIndex = readSheetIndex;
- }
-
- public Boolean getIgnoreRecord() {
- return ignoreRecord;
- }
-
- public void setIgnoreRecord(Boolean ignoreRecord) {
- this.ignoreRecord = ignoreRecord;
+ currentSheetStopped = Boolean.TRUE;
}
}
diff --git a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/exception/ExcelAnalysisStopSheetExceptionDataListener.java b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/exception/ExcelAnalysisStopSheetExceptionDataListener.java
new file mode 100644
index 00000000..8a216d56
--- /dev/null
+++ b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/exception/ExcelAnalysisStopSheetExceptionDataListener.java
@@ -0,0 +1,52 @@
+package com.alibaba.easyexcel.test.core.exception;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.alibaba.excel.exception.ExcelAnalysisStopException;
+import com.alibaba.excel.exception.ExcelAnalysisStopSheetException;
+import com.alibaba.excel.util.ListUtils;
+import com.alibaba.excel.util.MapUtils;
+import com.alibaba.fastjson2.JSON;
+
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.SetUtils;
+import org.assertj.core.internal.Maps;
+import org.junit.jupiter.api.Assertions;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author Jiaju Zhuang
+ */
+@Getter
+@Slf4j
+public class ExcelAnalysisStopSheetExceptionDataListener extends AnalysisEventListener {
+
+ private Map> dataMap = MapUtils.newHashMap();
+
+
+ @Override
+ public void invoke(ExceptionData data, AnalysisContext context) {
+ List sheetDataList = dataMap.computeIfAbsent(context.readSheetHolder().getSheetNo(),
+ key -> ListUtils.newArrayList());
+ sheetDataList.add(data.getName());
+ if (sheetDataList.size() >= 5) {
+ throw new ExcelAnalysisStopSheetException();
+ }
+ }
+
+ @Override
+ public void doAfterAllAnalysed(AnalysisContext context) {
+ List sheetDataList = dataMap.get(context.readSheetHolder().getSheetNo());
+ Assertions.assertNotNull(sheetDataList);
+ Assertions.assertEquals(5, sheetDataList.size());
+ }
+}
diff --git a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/exception/ExceptionDataTest.java b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/exception/ExceptionDataTest.java
index b06a105e..0d3fe12e 100644
--- a/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/exception/ExceptionDataTest.java
+++ b/easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/exception/ExceptionDataTest.java
@@ -5,10 +5,15 @@ import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
+import com.alibaba.easyexcel.test.demo.write.DemoData;
import com.alibaba.easyexcel.test.util.TestFileUtil;
import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import org.assertj.core.util.Lists;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.MethodOrderer;
@@ -23,15 +28,20 @@ public class ExceptionDataTest {
private static File file07;
private static File file03;
+ private static File fileCsv;
+ private static File fileExcelAnalysisStopSheetException07;
+ private static File fileExcelAnalysisStopSheetException03;
+ private static File fileExcelAnalysisStopSheetExceptionCsv;
private static File fileException07;
private static File fileException03;
- private static File fileCsv;
@BeforeAll
public static void init() {
file07 = TestFileUtil.createNewFile("exception.xlsx");
file03 = TestFileUtil.createNewFile("exception.xls");
fileCsv = TestFileUtil.createNewFile("exception.csv");
+ fileExcelAnalysisStopSheetException07 = TestFileUtil.createNewFile("excelAnalysisStopSheetException.xlsx");
+ fileExcelAnalysisStopSheetException03 = TestFileUtil.createNewFile("excelAnalysisStopSheetException.xls");
fileException07 = TestFileUtil.createNewFile("exceptionThrow.xlsx");
fileException03 = TestFileUtil.createNewFile("exceptionThrow.xls");
}
@@ -61,6 +71,44 @@ public class ExceptionDataTest {
readAndWriteException(fileException03);
}
+ @Test
+ public void t21ReadAndWrite07() throws Exception {
+ readAndWriteExcelAnalysisStopSheetException(fileExcelAnalysisStopSheetException07);
+ }
+
+ @Test
+ public void t22ReadAndWrite03() throws Exception {
+ readAndWriteExcelAnalysisStopSheetException(fileExcelAnalysisStopSheetException03);
+ }
+
+
+ private void readAndWriteExcelAnalysisStopSheetException(File file) throws Exception {
+ try (ExcelWriter excelWriter = EasyExcel.write(file, ExceptionData.class).build()) {
+ for (int i = 0; i < 5; i++) {
+ String sheetName = "sheet" + i;
+ WriteSheet writeSheet = EasyExcel.writerSheet(i, sheetName).build();
+ List data = data(sheetName);
+ excelWriter.write(data, writeSheet);
+ }
+ }
+
+ ExcelAnalysisStopSheetExceptionDataListener excelAnalysisStopSheetExceptionDataListener
+ = new ExcelAnalysisStopSheetExceptionDataListener();
+ EasyExcel.read(file, ExceptionData.class, excelAnalysisStopSheetExceptionDataListener).doReadAll();
+ Map> dataMap = excelAnalysisStopSheetExceptionDataListener.getDataMap();
+ Assertions.assertEquals(5, dataMap.size());
+ for (int i = 0; i < 5; i++) {
+ List sheetDataList = dataMap.get(i);
+ Assertions.assertNotNull(sheetDataList);
+ Assertions.assertEquals(5, sheetDataList.size());
+ String sheetName = "sheet" + i;
+
+ for (String sheetData : sheetDataList) {
+ Assertions.assertTrue(sheetData.startsWith(sheetName));
+ }
+ }
+ }
+
private void readAndWriteException(File file) throws Exception {
EasyExcel.write(new FileOutputStream(file), ExceptionData.class).sheet().doWrite(data());
ArithmeticException exception = Assertions.assertThrows(ArithmeticException.class, () -> EasyExcel.read(
@@ -83,4 +131,14 @@ public class ExceptionDataTest {
}
return list;
}
+
+ private List data(String prefix) {
+ List list = Lists.newArrayList();
+ for (int i = 0; i < 10; i++) {
+ ExceptionData simpleData = new ExceptionData();
+ simpleData.setName(prefix + "-姓名" + i);
+ list.add(simpleData);
+ }
+ return list;
+ }
}
diff --git a/pom.xml b/pom.xml
index 1cece2ae..358a2846 100644
--- a/pom.xml
+++ b/pom.xml
@@ -20,7 +20,7 @@
- 3.3.3
+ 3.3.4
UTF-8
1.8
true
diff --git a/update.md b/update.md
index 402f69dd..a8f95564 100644
--- a/update.md
+++ b/update.md
@@ -1,3 +1,7 @@
+# 3.3.4
+
+* 支持停止单个`sheet`以后继续读取其他`sheet`,使用`ExcelAnalysisStopSheetException`
+
# 3.3.3
* 兼容某些特殊的xls: 缺少每个sheet的终止符