From 4e9847010b4269afb1265543d5a2031c8eeed8fd Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 4 Aug 2020 17:18:28 +0800 Subject: [PATCH] 1.提交代码 --- src/main/java/com/taover/easyexcel/analysis/ExcelAnalyserImpl.java | 15 ++++++++++----- src/main/java/com/taover/easyexcel/analysis/v07/XlsxSaxAnalyser.java | 27 ++++++++++++++++----------- src/main/java/com/taover/easyexcel/analysis/v07/handlers/AbstractXlsxTagHandler.java | 3 ++- src/main/java/com/taover/easyexcel/analysis/v07/handlers/SheetViewHandler.java | 29 +++++++++++++++++++++++++++++ src/main/java/com/taover/easyexcel/analysis/v07/handlers/XlsxTagHandler.java | 4 +++- src/main/java/com/taover/easyexcel/analysis/v07/handlers/sax/XlsxRowHandler.java | 43 ++++++++++++++++++++----------------------- src/main/java/com/taover/easyexcel/constant/ExcelXmlConstants.java | 2 ++ src/main/java/com/taover/easyexcel/exception/SheetNotSelectedException.java | 22 ++++++++++++++++++++++ src/main/java/com/taover/easyexcel/util/SheetUtils.java | 18 +++++++++++++++++- src/test/java/com/taover/easyexcel/test/demo/read/ReadTest.java | 2 +- 10 files changed, 122 insertions(+), 43 deletions(-) create mode 100644 src/main/java/com/taover/easyexcel/analysis/v07/handlers/SheetViewHandler.java create mode 100644 src/main/java/com/taover/easyexcel/exception/SheetNotSelectedException.java diff --git a/src/main/java/com/taover/easyexcel/analysis/ExcelAnalyserImpl.java b/src/main/java/com/taover/easyexcel/analysis/ExcelAnalyserImpl.java index f74c905..642992a 100644 --- a/src/main/java/com/taover/easyexcel/analysis/ExcelAnalyserImpl.java +++ b/src/main/java/com/taover/easyexcel/analysis/ExcelAnalyserImpl.java @@ -112,12 +112,17 @@ public class ExcelAnalyserImpl implements ExcelAnalyser { analysisContext.readWorkbookHolder().setParameterSheetDataList(readSheetList); analysisContext.readWorkbookHolder().setReadAll(readAll); analysisContext.readWorkbookHolder().setReadJustSelected(false); - for(ReadSheet item: readSheetList) { - if(item.getSheetSelected()) { - analysisContext.readWorkbookHolder().setReadJustSelected(true); - break; - } + + if(readSheetList != null) { + for(ReadSheet item: readSheetList) { + if(item.getSheetSelected() != null && item.getSheetSelected()) { + analysisContext.readWorkbookHolder().setReadJustSelected(true); + analysisContext.readWorkbookHolder().setReadAll(true); + break; + } + } } + try { excelReadExecutor.execute(); } catch (ExcelAnalysisStopException e) { 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 5ec6263..e0079e1 100644 --- a/src/main/java/com/taover/easyexcel/analysis/v07/XlsxSaxAnalyser.java +++ b/src/main/java/com/taover/easyexcel/analysis/v07/XlsxSaxAnalyser.java @@ -23,8 +23,11 @@ import org.apache.poi.xssf.usermodel.XSSFRelation; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbookPr; import org.openxmlformats.schemas.spreadsheetml.x2006.main.WorkbookDocument; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.xml.sax.ContentHandler; import org.xml.sax.InputSource; +import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import com.taover.easyexcel.analysis.ExcelReadExecutor; @@ -34,6 +37,7 @@ import com.taover.easyexcel.cache.ReadCache; import com.taover.easyexcel.context.xlsx.XlsxReadContext; import com.taover.easyexcel.enums.CellExtraTypeEnum; 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.xlsx.XlsxReadWorkbookHolder; @@ -46,7 +50,8 @@ import com.taover.easyexcel.util.StringUtils; * @author jipengfei */ public class XlsxSaxAnalyser implements ExcelReadExecutor { - + private static final Logger LOGGER = LoggerFactory.getLogger(XlsxSaxAnalyser.class); + private XlsxReadContext xlsxReadContext; private List sheetList; private Map sheetMap; @@ -177,6 +182,10 @@ public class XlsxSaxAnalyser implements ExcelReadExecutor { xmlReader.setContentHandler(handler); xmlReader.parse(inputSource); inputStream.close(); + } catch (SAXException e) { + if(e.getException() instanceof SheetNotSelectedException) { + LOGGER.warn(e.getMessage()); + } } catch (ExcelAnalysisException e) { throw e; } catch (Exception e) { @@ -197,16 +206,12 @@ public class XlsxSaxAnalyser implements ExcelReadExecutor { for (ReadSheet readSheet : sheetList) { readSheet = SheetUtils.match(readSheet, xlsxReadContext); if (readSheet != null) { - try { - xlsxReadContext.currentSheet(readSheet); - parseXmlSource(sheetMap.get(readSheet.getSheetNo()), new XlsxRowHandler(xlsxReadContext)); - // Read comments - readComments(readSheet); - // The last sheet is read - xlsxReadContext.analysisEventProcessor().endSheet(xlsxReadContext); - }catch (Exception e) { - e.printStackTrace(); - } + xlsxReadContext.currentSheet(readSheet); + parseXmlSource(sheetMap.get(readSheet.getSheetNo()), new XlsxRowHandler(xlsxReadContext)); + // Read comments + readComments(readSheet); + // The last sheet is read + xlsxReadContext.analysisEventProcessor().endSheet(xlsxReadContext); } } } diff --git a/src/main/java/com/taover/easyexcel/analysis/v07/handlers/AbstractXlsxTagHandler.java b/src/main/java/com/taover/easyexcel/analysis/v07/handlers/AbstractXlsxTagHandler.java index f806d75..199cbb9 100644 --- a/src/main/java/com/taover/easyexcel/analysis/v07/handlers/AbstractXlsxTagHandler.java +++ b/src/main/java/com/taover/easyexcel/analysis/v07/handlers/AbstractXlsxTagHandler.java @@ -1,6 +1,7 @@ package com.taover.easyexcel.analysis.v07.handlers; import org.xml.sax.Attributes; +import org.xml.sax.SAXException; import com.taover.easyexcel.context.xlsx.XlsxReadContext; @@ -31,7 +32,7 @@ public abstract class AbstractXlsxTagHandler implements XlsxTagHandler { } @Override - public void startElement(XlsxReadContext xlsxReadContext, String name, Attributes attributes) { + public void startElement(XlsxReadContext xlsxReadContext, String name, Attributes attributes) throws SAXException { } diff --git a/src/main/java/com/taover/easyexcel/analysis/v07/handlers/SheetViewHandler.java b/src/main/java/com/taover/easyexcel/analysis/v07/handlers/SheetViewHandler.java new file mode 100644 index 0000000..f042acc --- /dev/null +++ b/src/main/java/com/taover/easyexcel/analysis/v07/handlers/SheetViewHandler.java @@ -0,0 +1,29 @@ +package com.taover.easyexcel.analysis.v07.handlers; + +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; + +import com.taover.easyexcel.constant.ExcelXmlConstants; +import com.taover.easyexcel.context.xlsx.XlsxReadContext; +import com.taover.easyexcel.exception.SheetNotSelectedException; + +/** + * Cell Handler + * + * @author jipengfei + */ +public class SheetViewHandler extends AbstractXlsxTagHandler { + + @Override + public void startElement(XlsxReadContext xlsxReadContext, String name, Attributes attributes) throws SAXException { + //whether just read selected sheet + Boolean readJustSelected = xlsxReadContext.readWorkbookHolder().getReadJustSelected(); + if(ExcelXmlConstants.SHEET_VIEW_TAG.equals(name) + && readJustSelected != null + && readJustSelected + && !"1".equals(attributes.getValue(ExcelXmlConstants.ATTRIBUTE_TAB_SELECTED))) { + throw new SAXException("not selected sheet, just read selected sheet", new SheetNotSelectedException()); + } + } + +} diff --git a/src/main/java/com/taover/easyexcel/analysis/v07/handlers/XlsxTagHandler.java b/src/main/java/com/taover/easyexcel/analysis/v07/handlers/XlsxTagHandler.java index c8915fa..32697ba 100644 --- a/src/main/java/com/taover/easyexcel/analysis/v07/handlers/XlsxTagHandler.java +++ b/src/main/java/com/taover/easyexcel/analysis/v07/handlers/XlsxTagHandler.java @@ -1,6 +1,7 @@ package com.taover.easyexcel.analysis.v07.handlers; import org.xml.sax.Attributes; +import org.xml.sax.SAXException; import com.taover.easyexcel.context.xlsx.XlsxReadContext; @@ -28,8 +29,9 @@ public interface XlsxTagHandler { * Tag name * @param attributes * Tag attributes + * @throws SAXException */ - void startElement(XlsxReadContext xlsxReadContext, String name, Attributes attributes); + void startElement(XlsxReadContext xlsxReadContext, String name, Attributes attributes) throws SAXException; /** * End handle 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 b9ac4e8..540a4a0 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,6 +3,8 @@ 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; @@ -15,6 +17,7 @@ import com.taover.easyexcel.analysis.v07.handlers.CountTagHandler; import com.taover.easyexcel.analysis.v07.handlers.HyperlinkTagHandler; import com.taover.easyexcel.analysis.v07.handlers.MergeCellTagHandler; import com.taover.easyexcel.analysis.v07.handlers.RowTagHandler; +import com.taover.easyexcel.analysis.v07.handlers.SheetViewHandler; import com.taover.easyexcel.analysis.v07.handlers.XlsxTagHandler; import com.taover.easyexcel.constant.ExcelXmlConstants; import com.taover.easyexcel.context.xlsx.XlsxReadContext; @@ -23,7 +26,8 @@ import com.taover.easyexcel.context.xlsx.XlsxReadContext; * @author jipengfei */ public class XlsxRowHandler extends DefaultHandler { - private static final boolean XLSX_DEBUB_PRINT_INFO = false; + 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); @@ -52,6 +56,9 @@ public class XlsxRowHandler extends DefaultHandler { RowTagHandler rowTagHandler = new RowTagHandler(); XLSX_CELL_HANDLER_MAP.put(ExcelXmlConstants.ROW_TAG, rowTagHandler); XLSX_CELL_HANDLER_MAP.put(ExcelXmlConstants.X_ROW_TAG, rowTagHandler); + SheetViewHandler sheetViewHandler = new SheetViewHandler(); + XLSX_CELL_HANDLER_MAP.put(ExcelXmlConstants.SHEET_VIEW_TAG, sheetViewHandler); + XLSX_CELL_HANDLER_MAP.put(ExcelXmlConstants.X_SHEET_VIEW_TAG, sheetViewHandler); } public XlsxRowHandler(XlsxReadContext xlsxReadContext) { @@ -60,20 +67,10 @@ public class XlsxRowHandler extends DefaultHandler { @Override public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { - if(XLSX_DEBUB_PRINT_INFO) { + if(XLSX_DEBUG_PRINT_INFO) { this.printElement("startElement", uri, localName, name, attributes); } - //whether just read selected sheet - Boolean readJustSelected = this.xlsxReadContext.readWorkbookHolder().getReadJustSelected(); - if(ExcelXmlConstants.SHEET_VIEW_TAG.equals(name) - && readJustSelected != null - && readJustSelected - && !"1".equals(attributes.getValue("tabSelected"))) { - //throw new SAXException("not selected sheet, just read selected sheet"); - //return; - } - XlsxTagHandler handler = XLSX_CELL_HANDLER_MAP.get(name); if (handler == null || !handler.support(xlsxReadContext) @@ -85,22 +82,22 @@ public class XlsxRowHandler extends DefaultHandler { } private void printElement(String title, String uri, String localName, String name, Attributes attributes) { - System.out.println("======"+title+"======"); - System.out.println("> uri:"+uri); - System.out.println("> localName:"+localName); - System.out.println("> name:"+name); + LOGGER.debug("======"+title+"======"); + LOGGER.debug("> uri:"+uri); + LOGGER.debug("> localName:"+localName); + LOGGER.debug("> 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)); + LOGGER.debug(">> attributes["+i+"]->uri:"+attributes.getURI(i)+",qName:"+attributes.getQName(i)+",value:"+attributes.getValue(i)); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { - if(XLSX_DEBUB_PRINT_INFO) { - this.printCharacters(ch); + if(XLSX_DEBUG_PRINT_INFO) { + this.printCharacters(ch, start, length); } String currentTag = xlsxReadContext.xlsxReadSheetHolder().getTagDeque().peek(); if (currentTag == null) { @@ -115,14 +112,14 @@ public class XlsxRowHandler extends DefaultHandler { handler.characters(xlsxReadContext, ch, start, length); } - private void printCharacters(char[] ch) { - System.out.println(">>>>>>characters>>>>>>"); - System.out.println(new String(ch)); + private void printCharacters(char[] ch, int start, int length) { + LOGGER.debug(">>>>>>characters>>>>>>"); + LOGGER.debug(new String(ch, start, length)); } @Override public void endElement(String uri, String localName, String name) throws SAXException { - if(XLSX_DEBUB_PRINT_INFO) { + if(XLSX_DEBUG_PRINT_INFO) { this.printElement("endElement", uri, localName, name, null); } XlsxTagHandler handler = XLSX_CELL_HANDLER_MAP.get(name); diff --git a/src/main/java/com/taover/easyexcel/constant/ExcelXmlConstants.java b/src/main/java/com/taover/easyexcel/constant/ExcelXmlConstants.java index e2f8615..9bcd071 100644 --- a/src/main/java/com/taover/easyexcel/constant/ExcelXmlConstants.java +++ b/src/main/java/com/taover/easyexcel/constant/ExcelXmlConstants.java @@ -61,4 +61,6 @@ public class ExcelXmlConstants { * hidden attribute */ public static final String ATTRIBUTE_HIDDEN = "hidden"; + + public static final String ATTRIBUTE_TAB_SELECTED = "tabSelected"; } diff --git a/src/main/java/com/taover/easyexcel/exception/SheetNotSelectedException.java b/src/main/java/com/taover/easyexcel/exception/SheetNotSelectedException.java new file mode 100644 index 0000000..fbf313f --- /dev/null +++ b/src/main/java/com/taover/easyexcel/exception/SheetNotSelectedException.java @@ -0,0 +1,22 @@ +package com.taover.easyexcel.exception; + +/** + * + * @author Wang bin + */ +public class SheetNotSelectedException extends RuntimeException { + + public SheetNotSelectedException() {} + + public SheetNotSelectedException(String message) { + super(message); + } + + public SheetNotSelectedException(String message, Throwable cause) { + super(message, cause); + } + + public SheetNotSelectedException(Throwable cause) { + super(cause); + } +} diff --git a/src/main/java/com/taover/easyexcel/util/SheetUtils.java b/src/main/java/com/taover/easyexcel/util/SheetUtils.java index 8e64344..f29cd8d 100644 --- a/src/main/java/com/taover/easyexcel/util/SheetUtils.java +++ b/src/main/java/com/taover/easyexcel/util/SheetUtils.java @@ -27,9 +27,25 @@ public class SheetUtils { */ public static ReadSheet match(ReadSheet readSheet, AnalysisContext analysisContext) { ReadWorkbookHolder readWorkbookHolder = analysisContext.readWorkbookHolder(); - if (readWorkbookHolder.getReadAll() || readWorkbookHolder.getReadJustSelected()) { + //read all and not read just selected + if (readWorkbookHolder.getReadAll() && !readWorkbookHolder.getReadJustSelected()) { return readSheet; } + + //read just selected + if(readWorkbookHolder.getReadJustSelected()) { + for (ReadSheet parameterReadSheet : readWorkbookHolder.getParameterSheetDataList()) { + if (parameterReadSheet == null) { + continue; + } + if(parameterReadSheet.getSheetSelected() != null && parameterReadSheet.getSheetSelected()) { + readSheet.copyBasicParameter(parameterReadSheet); + return readSheet; + } + } + } + + //read by sheet no for (ReadSheet parameterReadSheet : readWorkbookHolder.getParameterSheetDataList()) { if (parameterReadSheet == null) { continue; diff --git a/src/test/java/com/taover/easyexcel/test/demo/read/ReadTest.java b/src/test/java/com/taover/easyexcel/test/demo/read/ReadTest.java index dabdce4..df0794e 100644 --- a/src/test/java/com/taover/easyexcel/test/demo/read/ReadTest.java +++ b/src/test/java/com/taover/easyexcel/test/demo/read/ReadTest.java @@ -253,7 +253,7 @@ public class ReadTest { // } // 这里 也可以不指定class,返回一个list,然后读取第一个sheet 同步读取会自动finish - List> listMap = EasyExcel.read("D://demo.xlsx").sheet(true).doReadSync(); + List> listMap = EasyExcel.read("D://demo.xlsx").headRowNumber(0).sheet(true).doReadSync(); for (Map data : listMap) { // 返回每条数据的键值对 表示所在的列 和所在列的值 LOGGER.info("读取到数据:{}", JSON.toJSONString(data)); -- libgit2 0.21.2