Browse Source

* 支持停止单个`sheet`以后继续读取其他`sheet`,使用`ExcelAnalysisStopSheetException`

pull/3720/head
是仪 9 months ago
parent
commit
5d02c43f82
  1. 1
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/XlsSaxAnalyser.java
  2. 1
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/BofRecordHandler.java
  3. 13
      easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/EofRecordHandler.java
  4. 70
      easyexcel-core/src/main/java/com/alibaba/excel/read/metadata/holder/xls/XlsReadWorkbookHolder.java

1
easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/XlsSaxAnalyser.java

@ -171,6 +171,7 @@ public class XlsSaxAnalyser implements HSSFListener, ExcelReadExecutor {
log.debug("Custom stop!", e); log.debug("Custom stop!", e);
} }
xlsReadContext.xlsReadWorkbookHolder().setIgnoreRecord(Boolean.TRUE); xlsReadContext.xlsReadWorkbookHolder().setIgnoreRecord(Boolean.TRUE);
xlsReadContext.xlsReadWorkbookHolder().setCurrentSheetStopped(Boolean.TRUE);
} }
} }

1
easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/BofRecordHandler.java

@ -49,6 +49,7 @@ public class BofRecordHandler extends AbstractXlsRecordHandler {
} else { } else {
xlsReadContext.xlsReadWorkbookHolder().setIgnoreRecord(Boolean.TRUE); xlsReadContext.xlsReadWorkbookHolder().setIgnoreRecord(Boolean.TRUE);
} }
xlsReadContext.xlsReadWorkbookHolder().setCurrentSheetStopped(Boolean.FALSE);
// Go read the next one // Go read the next one
xlsReadWorkbookHolder.setReadSheetIndex(xlsReadWorkbookHolder.getReadSheetIndex() + 1); xlsReadWorkbookHolder.setReadSheetIndex(xlsReadWorkbookHolder.getReadSheetIndex() + 1);
} }

13
easyexcel-core/src/main/java/com/alibaba/excel/analysis/v03/handlers/EofRecordHandler.java

@ -24,9 +24,18 @@ public class EofRecordHandler extends AbstractXlsRecordHandler {
if (xlsReadContext.readSheetHolder() == null) { if (xlsReadContext.readSheetHolder() == null) {
return; 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 // Sometimes tables lack the end record of the last column
if (BooleanUtils.isNotTrue(xlsReadContext.xlsReadWorkbookHolder().getIgnoreRecord()) if (!xlsReadContext.xlsReadSheetHolder().getCellMap().isEmpty()) {
&& !xlsReadContext.xlsReadSheetHolder().getCellMap().isEmpty()) {
XlsReadSheetHolder xlsReadSheetHolder = xlsReadContext.xlsReadSheetHolder(); XlsReadSheetHolder xlsReadSheetHolder = xlsReadContext.xlsReadSheetHolder();
// Forge a termination data // Forge a termination data
xlsReadContext.readRowHolder(new ReadRowHolder(xlsReadContext.xlsReadSheetHolder().getRowIndex() + 1, xlsReadContext.readRowHolder(new ReadRowHolder(xlsReadContext.xlsReadSheetHolder().getRowIndex() + 1,

70
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.ArrayList;
import java.util.List; 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.eventusermodel.FormatTrackingHSSFListener;
import org.apache.poi.hssf.record.BoundSheetRecord; import org.apache.poi.hssf.record.BoundSheetRecord;
import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.usermodel.HSSFWorkbook;
@ -17,6 +21,10 @@ import com.alibaba.excel.support.ExcelTypeEnum;
* *
* @author Jiaju Zhuang * @author Jiaju Zhuang
*/ */
@Getter
@Setter
@EqualsAndHashCode
@NoArgsConstructor
public class XlsReadWorkbookHolder extends ReadWorkbookHolder { public class XlsReadWorkbookHolder extends ReadWorkbookHolder {
/** /**
* File System * File System
@ -47,6 +55,11 @@ public class XlsReadWorkbookHolder extends ReadWorkbookHolder {
*/ */
private Boolean ignoreRecord; private Boolean ignoreRecord;
/**
* Has the current sheet already stopped
*/
private Boolean currentSheetStopped;
public XlsReadWorkbookHolder(ReadWorkbook readWorkbook) { public XlsReadWorkbookHolder(ReadWorkbook readWorkbook) {
super(readWorkbook); super(readWorkbook);
this.boundSheetRecordList = new ArrayList<BoundSheetRecord>(); this.boundSheetRecordList = new ArrayList<BoundSheetRecord>();
@ -56,61 +69,6 @@ public class XlsReadWorkbookHolder extends ReadWorkbookHolder {
getGlobalConfiguration().setUse1904windowing(Boolean.FALSE); getGlobalConfiguration().setUse1904windowing(Boolean.FALSE);
} }
ignoreRecord = Boolean.FALSE; ignoreRecord = Boolean.FALSE;
} currentSheetStopped = Boolean.TRUE;
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<BoundSheetRecord> getBoundSheetRecordList() {
return boundSheetRecordList;
}
public void setBoundSheetRecordList(List<BoundSheetRecord> 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;
} }
} }

Loading…
Cancel
Save