Commit 4e9847010b4269afb1265543d5a2031c8eeed8fd

Authored by unknown
1 parent 05ceff0f
Exists in master

1.提交代码

src/main/java/com/taover/easyexcel/analysis/ExcelAnalyserImpl.java
... ... @@ -112,12 +112,17 @@ public class ExcelAnalyserImpl implements ExcelAnalyser {
112 112 analysisContext.readWorkbookHolder().setParameterSheetDataList(readSheetList);
113 113 analysisContext.readWorkbookHolder().setReadAll(readAll);
114 114 analysisContext.readWorkbookHolder().setReadJustSelected(false);
115   - for(ReadSheet item: readSheetList) {
116   - if(item.getSheetSelected()) {
117   - analysisContext.readWorkbookHolder().setReadJustSelected(true);
118   - break;
119   - }
  115 +
  116 + if(readSheetList != null) {
  117 + for(ReadSheet item: readSheetList) {
  118 + if(item.getSheetSelected() != null && item.getSheetSelected()) {
  119 + analysisContext.readWorkbookHolder().setReadJustSelected(true);
  120 + analysisContext.readWorkbookHolder().setReadAll(true);
  121 + break;
  122 + }
  123 + }
120 124 }
  125 +
121 126 try {
122 127 excelReadExecutor.execute();
123 128 } catch (ExcelAnalysisStopException e) {
... ...
src/main/java/com/taover/easyexcel/analysis/v07/XlsxSaxAnalyser.java
... ... @@ -23,8 +23,11 @@ import org.apache.poi.xssf.usermodel.XSSFRelation;
23 23 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook;
24 24 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbookPr;
25 25 import org.openxmlformats.schemas.spreadsheetml.x2006.main.WorkbookDocument;
  26 +import org.slf4j.Logger;
  27 +import org.slf4j.LoggerFactory;
26 28 import org.xml.sax.ContentHandler;
27 29 import org.xml.sax.InputSource;
  30 +import org.xml.sax.SAXException;
28 31 import org.xml.sax.XMLReader;
29 32  
30 33 import com.taover.easyexcel.analysis.ExcelReadExecutor;
... ... @@ -34,6 +37,7 @@ import com.taover.easyexcel.cache.ReadCache;
34 37 import com.taover.easyexcel.context.xlsx.XlsxReadContext;
35 38 import com.taover.easyexcel.enums.CellExtraTypeEnum;
36 39 import com.taover.easyexcel.exception.ExcelAnalysisException;
  40 +import com.taover.easyexcel.exception.SheetNotSelectedException;
37 41 import com.taover.easyexcel.metadata.CellExtra;
38 42 import com.taover.easyexcel.read.metadata.ReadSheet;
39 43 import com.taover.easyexcel.read.metadata.holder.xlsx.XlsxReadWorkbookHolder;
... ... @@ -46,7 +50,8 @@ import com.taover.easyexcel.util.StringUtils;
46 50 * @author jipengfei
47 51 */
48 52 public class XlsxSaxAnalyser implements ExcelReadExecutor {
49   -
  53 + private static final Logger LOGGER = LoggerFactory.getLogger(XlsxSaxAnalyser.class);
  54 +
50 55 private XlsxReadContext xlsxReadContext;
51 56 private List<ReadSheet> sheetList;
52 57 private Map<Integer, InputStream> sheetMap;
... ... @@ -177,6 +182,10 @@ public class XlsxSaxAnalyser implements ExcelReadExecutor {
177 182 xmlReader.setContentHandler(handler);
178 183 xmlReader.parse(inputSource);
179 184 inputStream.close();
  185 + } catch (SAXException e) {
  186 + if(e.getException() instanceof SheetNotSelectedException) {
  187 + LOGGER.warn(e.getMessage());
  188 + }
180 189 } catch (ExcelAnalysisException e) {
181 190 throw e;
182 191 } catch (Exception e) {
... ... @@ -197,16 +206,12 @@ public class XlsxSaxAnalyser implements ExcelReadExecutor {
197 206 for (ReadSheet readSheet : sheetList) {
198 207 readSheet = SheetUtils.match(readSheet, xlsxReadContext);
199 208 if (readSheet != null) {
200   - try {
201   - xlsxReadContext.currentSheet(readSheet);
202   - parseXmlSource(sheetMap.get(readSheet.getSheetNo()), new XlsxRowHandler(xlsxReadContext));
203   - // Read comments
204   - readComments(readSheet);
205   - // The last sheet is read
206   - xlsxReadContext.analysisEventProcessor().endSheet(xlsxReadContext);
207   - }catch (Exception e) {
208   - e.printStackTrace();
209   - }
  209 + xlsxReadContext.currentSheet(readSheet);
  210 + parseXmlSource(sheetMap.get(readSheet.getSheetNo()), new XlsxRowHandler(xlsxReadContext));
  211 + // Read comments
  212 + readComments(readSheet);
  213 + // The last sheet is read
  214 + xlsxReadContext.analysisEventProcessor().endSheet(xlsxReadContext);
210 215 }
211 216 }
212 217 }
... ...
src/main/java/com/taover/easyexcel/analysis/v07/handlers/AbstractXlsxTagHandler.java
1 1 package com.taover.easyexcel.analysis.v07.handlers;
2 2  
3 3 import org.xml.sax.Attributes;
  4 +import org.xml.sax.SAXException;
4 5  
5 6 import com.taover.easyexcel.context.xlsx.XlsxReadContext;
6 7  
... ... @@ -31,7 +32,7 @@ public abstract class AbstractXlsxTagHandler implements XlsxTagHandler {
31 32 }
32 33  
33 34 @Override
34   - public void startElement(XlsxReadContext xlsxReadContext, String name, Attributes attributes) {
  35 + public void startElement(XlsxReadContext xlsxReadContext, String name, Attributes attributes) throws SAXException {
35 36  
36 37 }
37 38  
... ...
src/main/java/com/taover/easyexcel/analysis/v07/handlers/SheetViewHandler.java 0 → 100644
... ... @@ -0,0 +1,29 @@
  1 +package com.taover.easyexcel.analysis.v07.handlers;
  2 +
  3 +import org.xml.sax.Attributes;
  4 +import org.xml.sax.SAXException;
  5 +
  6 +import com.taover.easyexcel.constant.ExcelXmlConstants;
  7 +import com.taover.easyexcel.context.xlsx.XlsxReadContext;
  8 +import com.taover.easyexcel.exception.SheetNotSelectedException;
  9 +
  10 +/**
  11 + * Cell Handler
  12 + *
  13 + * @author jipengfei
  14 + */
  15 +public class SheetViewHandler extends AbstractXlsxTagHandler {
  16 +
  17 + @Override
  18 + public void startElement(XlsxReadContext xlsxReadContext, String name, Attributes attributes) throws SAXException {
  19 + //whether just read selected sheet
  20 + Boolean readJustSelected = xlsxReadContext.readWorkbookHolder().getReadJustSelected();
  21 + if(ExcelXmlConstants.SHEET_VIEW_TAG.equals(name)
  22 + && readJustSelected != null
  23 + && readJustSelected
  24 + && !"1".equals(attributes.getValue(ExcelXmlConstants.ATTRIBUTE_TAB_SELECTED))) {
  25 + throw new SAXException("not selected sheet, just read selected sheet", new SheetNotSelectedException());
  26 + }
  27 + }
  28 +
  29 +}
... ...
src/main/java/com/taover/easyexcel/analysis/v07/handlers/XlsxTagHandler.java
1 1 package com.taover.easyexcel.analysis.v07.handlers;
2 2  
3 3 import org.xml.sax.Attributes;
  4 +import org.xml.sax.SAXException;
4 5  
5 6 import com.taover.easyexcel.context.xlsx.XlsxReadContext;
6 7  
... ... @@ -28,8 +29,9 @@ public interface XlsxTagHandler {
28 29 * Tag name
29 30 * @param attributes
30 31 * Tag attributes
  32 + * @throws SAXException
31 33 */
32   - void startElement(XlsxReadContext xlsxReadContext, String name, Attributes attributes);
  34 + void startElement(XlsxReadContext xlsxReadContext, String name, Attributes attributes) throws SAXException;
33 35  
34 36 /**
35 37 * End handle
... ...
src/main/java/com/taover/easyexcel/analysis/v07/handlers/sax/XlsxRowHandler.java
... ... @@ -3,6 +3,8 @@ package com.taover.easyexcel.analysis.v07.handlers.sax;
3 3 import java.util.HashMap;
4 4 import java.util.Map;
5 5  
  6 +import org.slf4j.Logger;
  7 +import org.slf4j.LoggerFactory;
6 8 import org.xml.sax.Attributes;
7 9 import org.xml.sax.SAXException;
8 10 import org.xml.sax.helpers.DefaultHandler;
... ... @@ -15,6 +17,7 @@ import com.taover.easyexcel.analysis.v07.handlers.CountTagHandler;
15 17 import com.taover.easyexcel.analysis.v07.handlers.HyperlinkTagHandler;
16 18 import com.taover.easyexcel.analysis.v07.handlers.MergeCellTagHandler;
17 19 import com.taover.easyexcel.analysis.v07.handlers.RowTagHandler;
  20 +import com.taover.easyexcel.analysis.v07.handlers.SheetViewHandler;
18 21 import com.taover.easyexcel.analysis.v07.handlers.XlsxTagHandler;
19 22 import com.taover.easyexcel.constant.ExcelXmlConstants;
20 23 import com.taover.easyexcel.context.xlsx.XlsxReadContext;
... ... @@ -23,7 +26,8 @@ import com.taover.easyexcel.context.xlsx.XlsxReadContext;
23 26 * @author jipengfei
24 27 */
25 28 public class XlsxRowHandler extends DefaultHandler {
26   - private static final boolean XLSX_DEBUB_PRINT_INFO = false;
  29 + private static final Logger LOGGER = LoggerFactory.getLogger(XlsxRowHandler.class);
  30 + private static final boolean XLSX_DEBUG_PRINT_INFO = false;
27 31 private XlsxReadContext xlsxReadContext;
28 32 private static final Map<String, XlsxTagHandler> XLSX_CELL_HANDLER_MAP = new HashMap<String, XlsxTagHandler>(32);
29 33  
... ... @@ -52,6 +56,9 @@ public class XlsxRowHandler extends DefaultHandler {
52 56 RowTagHandler rowTagHandler = new RowTagHandler();
53 57 XLSX_CELL_HANDLER_MAP.put(ExcelXmlConstants.ROW_TAG, rowTagHandler);
54 58 XLSX_CELL_HANDLER_MAP.put(ExcelXmlConstants.X_ROW_TAG, rowTagHandler);
  59 + SheetViewHandler sheetViewHandler = new SheetViewHandler();
  60 + XLSX_CELL_HANDLER_MAP.put(ExcelXmlConstants.SHEET_VIEW_TAG, sheetViewHandler);
  61 + XLSX_CELL_HANDLER_MAP.put(ExcelXmlConstants.X_SHEET_VIEW_TAG, sheetViewHandler);
55 62 }
56 63  
57 64 public XlsxRowHandler(XlsxReadContext xlsxReadContext) {
... ... @@ -60,20 +67,10 @@ public class XlsxRowHandler extends DefaultHandler {
60 67  
61 68 @Override
62 69 public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
63   - if(XLSX_DEBUB_PRINT_INFO) {
  70 + if(XLSX_DEBUG_PRINT_INFO) {
64 71 this.printElement("startElement", uri, localName, name, attributes);
65 72 }
66 73  
67   - //whether just read selected sheet
68   - Boolean readJustSelected = this.xlsxReadContext.readWorkbookHolder().getReadJustSelected();
69   - if(ExcelXmlConstants.SHEET_VIEW_TAG.equals(name)
70   - && readJustSelected != null
71   - && readJustSelected
72   - && !"1".equals(attributes.getValue("tabSelected"))) {
73   - //throw new SAXException("not selected sheet, just read selected sheet");
74   - //return;
75   - }
76   -
77 74 XlsxTagHandler handler = XLSX_CELL_HANDLER_MAP.get(name);
78 75 if (handler == null
79 76 || !handler.support(xlsxReadContext)
... ... @@ -85,22 +82,22 @@ public class XlsxRowHandler extends DefaultHandler {
85 82 }
86 83  
87 84 private void printElement(String title, String uri, String localName, String name, Attributes attributes) {
88   - System.out.println("======"+title+"======");
89   - System.out.println("> uri:"+uri);
90   - System.out.println("> localName:"+localName);
91   - System.out.println("> name:"+name);
  85 + LOGGER.debug("======"+title+"======");
  86 + LOGGER.debug("> uri:"+uri);
  87 + LOGGER.debug("> localName:"+localName);
  88 + LOGGER.debug("> name:"+name);
92 89 if(attributes == null) {
93 90 return;
94 91 }
95 92 for(int i=0; i<attributes.getLength(); ++i) {
96   - System.out.println(">> attributes["+i+"]->uri:"+attributes.getURI(i)+",qName:"+attributes.getQName(i)+",value:"+attributes.getValue(i));
  93 + LOGGER.debug(">> attributes["+i+"]->uri:"+attributes.getURI(i)+",qName:"+attributes.getQName(i)+",value:"+attributes.getValue(i));
97 94 }
98 95 }
99 96  
100 97 @Override
101 98 public void characters(char[] ch, int start, int length) throws SAXException {
102   - if(XLSX_DEBUB_PRINT_INFO) {
103   - this.printCharacters(ch);
  99 + if(XLSX_DEBUG_PRINT_INFO) {
  100 + this.printCharacters(ch, start, length);
104 101 }
105 102 String currentTag = xlsxReadContext.xlsxReadSheetHolder().getTagDeque().peek();
106 103 if (currentTag == null) {
... ... @@ -115,14 +112,14 @@ public class XlsxRowHandler extends DefaultHandler {
115 112 handler.characters(xlsxReadContext, ch, start, length);
116 113 }
117 114  
118   - private void printCharacters(char[] ch) {
119   - System.out.println(">>>>>>characters>>>>>>");
120   - System.out.println(new String(ch));
  115 + private void printCharacters(char[] ch, int start, int length) {
  116 + LOGGER.debug(">>>>>>characters>>>>>>");
  117 + LOGGER.debug(new String(ch, start, length));
121 118 }
122 119  
123 120 @Override
124 121 public void endElement(String uri, String localName, String name) throws SAXException {
125   - if(XLSX_DEBUB_PRINT_INFO) {
  122 + if(XLSX_DEBUG_PRINT_INFO) {
126 123 this.printElement("endElement", uri, localName, name, null);
127 124 }
128 125 XlsxTagHandler handler = XLSX_CELL_HANDLER_MAP.get(name);
... ...
src/main/java/com/taover/easyexcel/constant/ExcelXmlConstants.java
... ... @@ -61,4 +61,6 @@ public class ExcelXmlConstants {
61 61 * hidden attribute
62 62 */
63 63 public static final String ATTRIBUTE_HIDDEN = "hidden";
  64 +
  65 + public static final String ATTRIBUTE_TAB_SELECTED = "tabSelected";
64 66 }
... ...
src/main/java/com/taover/easyexcel/exception/SheetNotSelectedException.java 0 → 100644
... ... @@ -0,0 +1,22 @@
  1 +package com.taover.easyexcel.exception;
  2 +
  3 +/**
  4 + *
  5 + * @author Wang bin
  6 + */
  7 +public class SheetNotSelectedException extends RuntimeException {
  8 +
  9 + public SheetNotSelectedException() {}
  10 +
  11 + public SheetNotSelectedException(String message) {
  12 + super(message);
  13 + }
  14 +
  15 + public SheetNotSelectedException(String message, Throwable cause) {
  16 + super(message, cause);
  17 + }
  18 +
  19 + public SheetNotSelectedException(Throwable cause) {
  20 + super(cause);
  21 + }
  22 +}
... ...
src/main/java/com/taover/easyexcel/util/SheetUtils.java
... ... @@ -27,9 +27,25 @@ public class SheetUtils {
27 27 */
28 28 public static ReadSheet match(ReadSheet readSheet, AnalysisContext analysisContext) {
29 29 ReadWorkbookHolder readWorkbookHolder = analysisContext.readWorkbookHolder();
30   - if (readWorkbookHolder.getReadAll() || readWorkbookHolder.getReadJustSelected()) {
  30 + //read all and not read just selected
  31 + if (readWorkbookHolder.getReadAll() && !readWorkbookHolder.getReadJustSelected()) {
31 32 return readSheet;
32 33 }
  34 +
  35 + //read just selected
  36 + if(readWorkbookHolder.getReadJustSelected()) {
  37 + for (ReadSheet parameterReadSheet : readWorkbookHolder.getParameterSheetDataList()) {
  38 + if (parameterReadSheet == null) {
  39 + continue;
  40 + }
  41 + if(parameterReadSheet.getSheetSelected() != null && parameterReadSheet.getSheetSelected()) {
  42 + readSheet.copyBasicParameter(parameterReadSheet);
  43 + return readSheet;
  44 + }
  45 + }
  46 + }
  47 +
  48 + //read by sheet no
33 49 for (ReadSheet parameterReadSheet : readWorkbookHolder.getParameterSheetDataList()) {
34 50 if (parameterReadSheet == null) {
35 51 continue;
... ...
src/test/java/com/taover/easyexcel/test/demo/read/ReadTest.java
... ... @@ -253,7 +253,7 @@ public class ReadTest {
253 253 // }
254 254  
255 255 // 这里 也可以不指定class,返回一个list,然后读取第一个sheet 同步读取会自动finish
256   - List<Map<Integer, String>> listMap = EasyExcel.read("D://demo.xlsx").sheet(true).doReadSync();
  256 + List<Map<Integer, String>> listMap = EasyExcel.read("D://demo.xlsx").headRowNumber(0).sheet(true).doReadSync();
257 257 for (Map<Integer, String> data : listMap) {
258 258 // 返回每条数据的键值对 表示所在的列 和所在列的值
259 259 LOGGER.info("读取到数据:{}", JSON.toJSONString(data));
... ...