package com.alibaba.excel.analysis.v03.handlers; import java.util.ArrayList; import java.util.List; import org.apache.poi.hssf.record.BOFRecord; import org.apache.poi.hssf.record.BoundSheetRecord; import org.apache.poi.hssf.record.Record; import com.alibaba.excel.analysis.v03.AbstractXlsRecordHandler; import com.alibaba.excel.context.XlsReadContext; import com.alibaba.excel.read.metadata.ReadSheet; import com.alibaba.excel.util.SheetUtils; /** * Record handler * * @author Dan Zheng */ public class BofRecordHandler extends AbstractXlsRecordHandler { private List boundSheetRecords = new ArrayList(); private BoundSheetRecord[] orderedBsrs; private int sheetIndex; private List sheets; private Boolean readAll; private List readSheetList; private boolean alreadyInit; private boolean needInitSheet; public BofRecordHandler(XlsReadContext analysisContext, List sheets, boolean alreadyInit, boolean needInitSheet) { super(analysisContext); this.sheets = sheets; this.alreadyInit = alreadyInit; this.needInitSheet = needInitSheet; } @Override public boolean support(Record record) { return BoundSheetRecord.sid == record.getSid() || BOFRecord.sid == record.getSid(); } @Override public void processRecord(Record record) { if (record.getSid() == BoundSheetRecord.sid) { boundSheetRecords.add((BoundSheetRecord)record); } else if (record.getSid() == BOFRecord.sid) { BOFRecord br = (BOFRecord)record; if (br.getType() == BOFRecord.TYPE_WORKSHEET) { if (orderedBsrs == null) { orderedBsrs = BoundSheetRecord.orderByBofPosition(boundSheetRecords); } String sheetName = orderedBsrs[sheetIndex].getSheetname(); // Find the currently read sheet ReadSheet readSheet = null; if (!alreadyInit) { readSheet = new ReadSheet(sheetIndex, sheetName); sheets.add(readSheet); } if (needInitSheet) { if (readSheet == null) { for (ReadSheet sheet : sheets) { if (sheet.getSheetNo() == sheetIndex) { readSheet = sheet; break; } } } assert readSheet != null : "Can't find the sheet."; analysisContext.readWorkbookHolder().setIgnoreRecord03(Boolean.TRUE); // Copy the parameter to the current sheet readSheet = SheetUtils.match(readSheet, readSheetList, readAll, analysisContext.readWorkbookHolder().getGlobalConfiguration()); if (readSheet != null) { if (readSheet.getSheetNo() != 0 && analysisContext.readSheetHolder() != null) { // Prompt for the end of the previous form read analysisContext.readSheetHolder().notifyAfterAllAnalysed(analysisContext); } analysisContext.currentSheet(readSheet); analysisContext.readWorkbookHolder().setIgnoreRecord03(Boolean.FALSE); } } sheetIndex++; } } } @Override public void init() { sheetIndex = 0; orderedBsrs = null; boundSheetRecords.clear(); if (!alreadyInit) { sheets.clear(); } } public void init(List readSheetList, Boolean readAll) { this.readSheetList = readSheetList; this.readAll = readAll; } @Override public int getOrder() { return 0; } }