diff --git a/src/main/java/com/taover/easyexcel/ExcelReader.java b/src/main/java/com/taover/easyexcel/ExcelReader.java index 9d7d2a6..1b81e1c 100644 --- a/src/main/java/com/taover/easyexcel/ExcelReader.java +++ b/src/main/java/com/taover/easyexcel/ExcelReader.java @@ -159,7 +159,14 @@ public class ExcelReader { * Parse all sheet content by default */ public void readAll() { - excelAnalyser.analysis(null, Boolean.TRUE); + excelAnalyser.analysis(null, Boolean.TRUE, Boolean.FALSE); + } + + /** + * Parse select sheet content by default + */ + public void readSelected() { + excelAnalyser.analysis(null, Boolean.FALSE, Boolean.TRUE); } /** @@ -179,7 +186,7 @@ public class ExcelReader { * @return */ public ExcelReader read(List readSheetList) { - excelAnalyser.analysis(readSheetList, Boolean.FALSE); + excelAnalyser.analysis(readSheetList, Boolean.FALSE, Boolean.FALSE); return this; } diff --git a/src/main/java/com/taover/easyexcel/analysis/ExcelAnalyser.java b/src/main/java/com/taover/easyexcel/analysis/ExcelAnalyser.java index 74fbdd3..45ec2b1 100644 --- a/src/main/java/com/taover/easyexcel/analysis/ExcelAnalyser.java +++ b/src/main/java/com/taover/easyexcel/analysis/ExcelAnalyser.java @@ -19,7 +19,7 @@ public interface ExcelAnalyser { * @param readAll * The readSheetList parameter is ignored, and all sheets are read. */ - void analysis(List readSheetList, Boolean readAll); + void analysis(List readSheetList, Boolean readAll, Boolean readSelected); /** * Complete the entire read file.Release the cache and close stream diff --git a/src/main/java/com/taover/easyexcel/analysis/ExcelAnalyserImpl.java b/src/main/java/com/taover/easyexcel/analysis/ExcelAnalyserImpl.java index 642992a..1fb6c8f 100644 --- a/src/main/java/com/taover/easyexcel/analysis/ExcelAnalyserImpl.java +++ b/src/main/java/com/taover/easyexcel/analysis/ExcelAnalyserImpl.java @@ -104,24 +104,14 @@ public class ExcelAnalyserImpl implements ExcelAnalyser { } @Override - public void analysis(List readSheetList, Boolean readAll) { + public void analysis(List readSheetList, Boolean readAll, Boolean readSelected) { try { - if (!readAll && CollectionUtils.isEmpty(readSheetList)) { + if (CollectionUtils.isEmpty(readSheetList) && !readAll && !readSelected) { throw new IllegalArgumentException("Specify at least one read sheet."); } analysisContext.readWorkbookHolder().setParameterSheetDataList(readSheetList); analysisContext.readWorkbookHolder().setReadAll(readAll); - analysisContext.readWorkbookHolder().setReadJustSelected(false); - - if(readSheetList != null) { - for(ReadSheet item: readSheetList) { - if(item.getSheetSelected() != null && item.getSheetSelected()) { - analysisContext.readWorkbookHolder().setReadJustSelected(true); - analysisContext.readWorkbookHolder().setReadAll(true); - break; - } - } - } + analysisContext.readWorkbookHolder().setReadJustSelected(readSelected); try { excelReadExecutor.execute(); diff --git a/src/main/java/com/taover/easyexcel/analysis/v03/XlsSaxAnalyser.java b/src/main/java/com/taover/easyexcel/analysis/v03/XlsSaxAnalyser.java index ae5541c..f5bede0 100644 --- a/src/main/java/com/taover/easyexcel/analysis/v03/XlsSaxAnalyser.java +++ b/src/main/java/com/taover/easyexcel/analysis/v03/XlsSaxAnalyser.java @@ -148,6 +148,8 @@ public class XlsSaxAnalyser implements HSSFListener, ExcelReadExecutor { @Override public void processRecord(Record record) { + System.out.println(record); + //flush global data this.initGlobalXlsData(xlsReadContext, record); @@ -182,7 +184,7 @@ public class XlsSaxAnalyser implements HSSFListener, ExcelReadExecutor { } } - public boolean needSkip(XlsReadContext xlsReadContext, Record record) { + private boolean needSkip(XlsReadContext xlsReadContext, Record record) { if(record.getSid() == RowRecord.sid) { RowRecord rowRec = (RowRecord) record; Boolean readHiddenRow = xlsReadContext.xlsReadWorkbookHolder().getReadHiddenRow(); diff --git a/src/main/java/com/taover/easyexcel/analysis/v07/XlsxSaxAnalyser.java b/src/main/java/com/taover/easyexcel/analysis/v07/XlsxSaxAnalyser.java index e0079e1..40e85f9 100644 --- a/src/main/java/com/taover/easyexcel/analysis/v07/XlsxSaxAnalyser.java +++ b/src/main/java/com/taover/easyexcel/analysis/v07/XlsxSaxAnalyser.java @@ -33,6 +33,8 @@ import org.xml.sax.XMLReader; import com.taover.easyexcel.analysis.ExcelReadExecutor; import com.taover.easyexcel.analysis.v07.handlers.sax.SharedStringsTableHandler; import com.taover.easyexcel.analysis.v07.handlers.sax.XlsxRowHandler; +import com.taover.easyexcel.analysis.v07.workbook.WorkbookAnalyser; +import com.taover.easyexcel.analysis.v07.workbook.WorkbookAnalyserImpl; import com.taover.easyexcel.cache.ReadCache; import com.taover.easyexcel.context.xlsx.XlsxReadContext; import com.taover.easyexcel.enums.CellExtraTypeEnum; @@ -40,10 +42,10 @@ import com.taover.easyexcel.exception.ExcelAnalysisException; import com.taover.easyexcel.exception.SheetNotSelectedException; import com.taover.easyexcel.metadata.CellExtra; import com.taover.easyexcel.read.metadata.ReadSheet; +import com.taover.easyexcel.read.metadata.holder.ReadWorkbookHolder; import com.taover.easyexcel.read.metadata.holder.xlsx.XlsxReadWorkbookHolder; import com.taover.easyexcel.util.CollectionUtils; import com.taover.easyexcel.util.FileUtils; -import com.taover.easyexcel.util.SheetUtils; import com.taover.easyexcel.util.StringUtils; /** @@ -92,9 +94,13 @@ public class XlsxSaxAnalyser implements ExcelReadExecutor { if (!ite.hasNext()) { throw new ExcelAnalysisException("Can not find any sheet!"); } - while (ite.hasNext()) { + + WorkbookAnalyser wbAnalyser = new WorkbookAnalyserImpl(xssfReader.getWorkbookData()); + while (ite.hasNext()) { InputStream inputStream = ite.next(); - sheetList.add(new ReadSheet(index, ite.getSheetName())); + boolean isHidden = wbAnalyser.isHiddenSheet(index); + boolean isActive = (index == wbAnalyser.getActiveTabIndexInSheetList()); + sheetList.add(new ReadSheet(index, ite.getSheetName(), isActive, isHidden)); sheetMap.put(index, inputStream); if (xlsxReadContext.readWorkbookHolder().getExtraReadSet().contains(CellExtraTypeEnum.COMMENT)) { CommentsTable commentsTable = ite.getSheetComments(); @@ -203,20 +209,61 @@ public class XlsxSaxAnalyser implements ExcelReadExecutor { @Override public void execute() { - 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); - // The last sheet is read - xlsxReadContext.analysisEventProcessor().endSheet(xlsxReadContext); - } + List readSheetList = this.filterSheetList(sheetList, xlsxReadContext); + for (ReadSheet readSheet : readSheetList) { + xlsxReadContext.currentSheet(readSheet); + parseXmlSource(sheetMap.get(readSheet.getSheetNo()), new XlsxRowHandler(xlsxReadContext)); + // Read comments + readComments(readSheet); + // The last sheet is read + xlsxReadContext.analysisEventProcessor().endSheet(xlsxReadContext); } } - private void readComments(ReadSheet readSheet) { + private List filterSheetList(List sheetList, XlsxReadContext analysisContext) { + ReadWorkbookHolder readWorkbookHolder = analysisContext.readWorkbookHolder(); + List sheetData = this.sheetList; + List result = new ArrayList(); + if(sheetData.isEmpty()) { + return result; + } + for(ReadSheet item: sheetData) { + if(readWorkbookHolder.getReadAll()) { + if(!item.getSheetHidden()) { + result.add(item); + } + }else if(readWorkbookHolder.getReadJustSelected()) { + if(item.getSheetSelected()) { + result.add(item); + } + }else { + for(ReadSheet innerItem: sheetList) { + boolean match = (item.getSheetNo() != null && item.getSheetNo().equals(innerItem.getSheetNo())); + if (!match) { + String parameterSheetName = item.getSheetName(); + if (!StringUtils.isEmpty(parameterSheetName)) { + boolean autoTrim = (item.getAutoTrim() != null && item.getAutoTrim()) + || (item.getAutoTrim() == null && analysisContext.readWorkbookHolder().getGlobalConfiguration().getAutoTrim()); + if (autoTrim) { + parameterSheetName = parameterSheetName.trim(); + } + match = parameterSheetName.equals(innerItem.getSheetName()); + } + } + if (match) { + item.copyBasicParameter(innerItem); + result.add(innerItem); + } + } + } + } + if(result.isEmpty()) { + result.add(sheetData.get(0)); + } + return result; + } + + private void readComments(ReadSheet readSheet) { if (!xlsxReadContext.readWorkbookHolder().getExtraReadSet().contains(CellExtraTypeEnum.COMMENT)) { return; } diff --git a/src/main/java/com/taover/easyexcel/analysis/v07/handlers/sax/XlsxRowHandler.java b/src/main/java/com/taover/easyexcel/analysis/v07/handlers/sax/XlsxRowHandler.java index 540a4a0..cde1ba8 100644 --- a/src/main/java/com/taover/easyexcel/analysis/v07/handlers/sax/XlsxRowHandler.java +++ b/src/main/java/com/taover/easyexcel/analysis/v07/handlers/sax/XlsxRowHandler.java @@ -3,8 +3,6 @@ package com.taover.easyexcel.analysis.v07.handlers.sax; import java.util.HashMap; import java.util.Map; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; @@ -26,7 +24,6 @@ import com.taover.easyexcel.context.xlsx.XlsxReadContext; * @author jipengfei */ public class XlsxRowHandler extends DefaultHandler { - private static final Logger LOGGER = LoggerFactory.getLogger(XlsxRowHandler.class); private static final boolean XLSX_DEBUG_PRINT_INFO = false; private XlsxReadContext xlsxReadContext; private static final Map XLSX_CELL_HANDLER_MAP = new HashMap(32); @@ -82,15 +79,15 @@ public class XlsxRowHandler extends DefaultHandler { } private void printElement(String title, String uri, String localName, String name, Attributes attributes) { - LOGGER.debug("======"+title+"======"); - LOGGER.debug("> uri:"+uri); - LOGGER.debug("> localName:"+localName); - LOGGER.debug("> name:"+name); + System.out.println("======"+title+"======"); + System.out.println("> uri:"+uri); + System.out.println("> localName:"+localName); + System.out.println("> name:"+name); if(attributes == null) { return; } for(int i=0; i> attributes["+i+"]->uri:"+attributes.getURI(i)+",qName:"+attributes.getQName(i)+",value:"+attributes.getValue(i)); + System.out.println(">> attributes["+i+"]->uri:"+attributes.getURI(i)+",localname:"+attributes.getLocalName(i)+",qName:"+attributes.getQName(i)+",type:"+attributes.getType(i)+",value:"+attributes.getValue(i)); } } @@ -113,8 +110,8 @@ public class XlsxRowHandler extends DefaultHandler { } private void printCharacters(char[] ch, int start, int length) { - LOGGER.debug(">>>>>>characters>>>>>>"); - LOGGER.debug(new String(ch, start, length)); + System.out.println(">>>>>>characters>>>>>>"); + System.out.println(new String(ch, start, length)); } @Override diff --git a/src/main/java/com/taover/easyexcel/analysis/v07/metadata/WorkbookSheet.java b/src/main/java/com/taover/easyexcel/analysis/v07/metadata/WorkbookSheet.java new file mode 100644 index 0000000..0a37f6b --- /dev/null +++ b/src/main/java/com/taover/easyexcel/analysis/v07/metadata/WorkbookSheet.java @@ -0,0 +1,58 @@ +package com.taover.easyexcel.analysis.v07.metadata; + +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; + +public class WorkbookSheet { + private String name; + private String sheetId; + private String state; + + public WorkbookSheet(String name, String sheetId, String state) { + super(); + this.name = name; + this.sheetId = sheetId; + this.state = state; + } + + public WorkbookSheet(Node node) { + NamedNodeMap attrs = node.getAttributes(); + Node nameNode = attrs.getNamedItem("name"); + Node sheetIdNode = attrs.getNamedItem("sheetId"); + Node stateNode = attrs.getNamedItem("state"); + if(nameNode != null) { + this.name = nameNode.getNodeValue(); + }else { + this.name = ""; + } + if(sheetIdNode != null) { + this.sheetId = sheetIdNode.getNodeValue(); + }else { + this.sheetId = ""; + } + if(stateNode != null) { + this.state = stateNode.getNodeValue(); + }else { + this.state = ""; + } + } + + public String getState() { + return state; + } + public void setState(String state) { + this.state = state; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getSheetId() { + return sheetId; + } + public void setSheetId(String sheetId) { + this.sheetId = sheetId; + } +} diff --git a/src/main/java/com/taover/easyexcel/analysis/v07/workbook/WorkbookAnalyser.java b/src/main/java/com/taover/easyexcel/analysis/v07/workbook/WorkbookAnalyser.java new file mode 100644 index 0000000..3d541b5 --- /dev/null +++ b/src/main/java/com/taover/easyexcel/analysis/v07/workbook/WorkbookAnalyser.java @@ -0,0 +1,13 @@ +package com.taover.easyexcel.analysis.v07.workbook; + +import java.util.List; + +import com.taover.easyexcel.analysis.v07.metadata.WorkbookSheet; + +public interface WorkbookAnalyser { + int getActiveTabIndexInSheetList(); + + List getSheetList(); + + boolean isHiddenSheet(int sheetIndex); +} diff --git a/src/main/java/com/taover/easyexcel/analysis/v07/workbook/WorkbookAnalyserImpl.java b/src/main/java/com/taover/easyexcel/analysis/v07/workbook/WorkbookAnalyserImpl.java new file mode 100644 index 0000000..562a7ec --- /dev/null +++ b/src/main/java/com/taover/easyexcel/analysis/v07/workbook/WorkbookAnalyserImpl.java @@ -0,0 +1,123 @@ +package com.taover.easyexcel.analysis.v07.workbook; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.w3c.dom.Document; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import com.taover.easyexcel.analysis.v07.metadata.WorkbookSheet; + +public class WorkbookAnalyserImpl implements WorkbookAnalyser { + private static String TAG_NAME_WORKBOOK = "workbook"; + private static String TAG_NAME_WORKBOOKVIEW = "workbookView"; + private static String TAG_NAME_ACTIVETAB = "activeTab"; + private static String TAG_NAME_SHEETS = "sheets"; + private static String TAG_NAME_BOOKVIEWS = "bookViews"; + private static String ATTR_STATE_V_HIDDEN = "hidden"; + + private int activeTabIndex; + private List sheetList; + + public WorkbookAnalyserImpl(InputStream workbookInputStream) throws SAXException, IOException, ParserConfigurationException { + Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(workbookInputStream); + NodeList nList = doc.getElementsByTagName(TAG_NAME_WORKBOOK); + Node workbookNode = nList.item(0); + this.initSheetList(this.getSheetsDoc(workbookNode.getOwnerDocument())); + this.initActiveTabIndex(this.getWorkbookViewDoc(workbookNode.getOwnerDocument())); + } + + private void initSheetList(List sheetsDoc) { + this.sheetList = new ArrayList(); + if(sheetsDoc == null || sheetsDoc.isEmpty()) { + return; + } + for(int i=0; i workbookViewDoc) { + if(workbookViewDoc == null || workbookViewDoc.isEmpty()) { + this.activeTabIndex = 0; + } + Integer activeTab = null; + for(int i=0; i getSheetsDoc(Document workbook) { + NodeList sheetsNodeList = workbook.getElementsByTagName(TAG_NAME_SHEETS); + Node sheetsNode = sheetsNodeList.item(0); + NodeList sheetNodeList = sheetsNode.getChildNodes(); + List result = new ArrayList(); + for(int i=0; i getWorkbookViewDoc(Document workbook) { + NodeList sheetsNodeList = workbook.getElementsByTagName(TAG_NAME_BOOKVIEWS); + Node sheetsNode = sheetsNodeList.item(0); + NodeList sheetNodeList = sheetsNode.getChildNodes(); + List result = new ArrayList(); + for(int i=0; i getSheetList() { + return sheetList; + } + + @Override + public boolean isHiddenSheet(int sheetIndex) { + if(sheetIndex < 0 || sheetIndex >= this.sheetList.size()) { + return false; + } + return this.sheetList.get(sheetIndex).getState().equals(ATTR_STATE_V_HIDDEN); + } + +} diff --git a/src/main/java/com/taover/easyexcel/read/builder/ExcelReaderBuilder.java b/src/main/java/com/taover/easyexcel/read/builder/ExcelReaderBuilder.java index 2717364..fe7592d 100644 --- a/src/main/java/com/taover/easyexcel/read/builder/ExcelReaderBuilder.java +++ b/src/main/java/com/taover/easyexcel/read/builder/ExcelReaderBuilder.java @@ -231,6 +231,20 @@ public class ExcelReaderBuilder extends AbstractExcelReaderParameterBuilder List doReadSelectedSync() { + SyncReadListener syncReadListener = new SyncReadListener(); + registerReadListener(syncReadListener); + ExcelReader excelReader = build(); + excelReader.readSelected(); + excelReader.finish(); + return (List)syncReadListener.getList(); + } + + /** + * Synchronous reads return results + * + * @return + */ public Map>> doReadAllSyncForMap() { SyncReadAllSheetToMapListener syncReadListener = new SyncReadAllSheetToMapListener(); registerReadListener(syncReadListener); @@ -241,26 +255,18 @@ public class ExcelReaderBuilder extends AbstractExcelReaderParameterBuilder