From de671dae0955d012f3be846c0ac01c13be5d5c95 Mon Sep 17 00:00:00 2001 From: zhuangjiaju Date: Wed, 17 Jul 2019 19:56:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AF=BB=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 7 + .../java/com/alibaba/excel/ExcelReader.java | 10 +- .../excel/analysis/ExcelAnalyserImpl.java | 1 + .../excel/analysis/v07/XlsxSaxAnalyser.java | 52 +++++--- .../java/com/alibaba/excel/cache/Ehcache.java | 85 +++++++++++- .../com/alibaba/excel/cache/Ehcache2.java | 36 +++++ .../com/alibaba/excel/cache/EhcacheFile.java | 123 ++++++++++++++++++ .../com/alibaba/excel/cache/EhcacheMix.java | 123 ++++++++++++++++++ .../excel/context/AnalysisContextImpl.java | 2 +- .../excel/event/AnalysisEventListener.java | 25 ++-- .../java/com/alibaba/excel/event/Handler.java | 2 +- .../com/alibaba/excel/event/Listener.java | 8 ++ .../com/alibaba/excel/event/ReadListener.java | 37 ++++++ .../excel/metadata/BasicParameter.java | 13 ++ .../com/alibaba/excel/metadata/Workbook.java | 35 ++++- .../alibaba/excel/support/ExcelTypeEnum.java | 31 ++--- .../test/read/large/LargeData07Test.java | 13 +- 17 files changed, 539 insertions(+), 64 deletions(-) create mode 100644 src/main/java/com/alibaba/excel/cache/Ehcache2.java create mode 100644 src/main/java/com/alibaba/excel/cache/EhcacheFile.java create mode 100644 src/main/java/com/alibaba/excel/cache/EhcacheMix.java create mode 100644 src/main/java/com/alibaba/excel/event/Listener.java create mode 100644 src/main/java/com/alibaba/excel/event/ReadListener.java diff --git a/pom.xml b/pom.xml index 1017595..3b98672 100644 --- a/pom.xml +++ b/pom.xml @@ -56,6 +56,13 @@ + + + commons-io + commons-io + 2.6 + + org.apache.poi poi diff --git a/src/main/java/com/alibaba/excel/ExcelReader.java b/src/main/java/com/alibaba/excel/ExcelReader.java index 154233c..a6c320a 100644 --- a/src/main/java/com/alibaba/excel/ExcelReader.java +++ b/src/main/java/com/alibaba/excel/ExcelReader.java @@ -184,10 +184,10 @@ public class ExcelReader { * @param eventListener */ private void validateParam(InputStream in, AnalysisEventListener eventListener) { - if (eventListener == null) { - throw new IllegalArgumentException("AnalysisEventListener can not null"); - } else if (in == null) { - throw new IllegalArgumentException("InputStream can not null"); - } +// if (eventListener == null) { +// throw new IllegalArgumentException("AnalysisEventListener can not null"); +// } else if (in == null) { +// throw new IllegalArgumentException("InputStream can not null"); +// } } } diff --git a/src/main/java/com/alibaba/excel/analysis/ExcelAnalyserImpl.java b/src/main/java/com/alibaba/excel/analysis/ExcelAnalyserImpl.java index 3e03efb..bbc045b 100644 --- a/src/main/java/com/alibaba/excel/analysis/ExcelAnalyserImpl.java +++ b/src/main/java/com/alibaba/excel/analysis/ExcelAnalyserImpl.java @@ -75,6 +75,7 @@ public class ExcelAnalyserImpl implements ExcelAnalyser { throw new ExcelAnalysisException("File type error,io must be available markSupported,you can do like " + "this new BufferedInputStream(new FileInputStream(\\\"/xxxx\\\")) \"", e); } + return this.saxAnalyser; } diff --git a/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java b/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java index a0d8e72..0d5c964 100644 --- a/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java +++ b/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java @@ -14,16 +14,13 @@ import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.xssf.eventusermodel.XSSFReader; import org.apache.poi.xssf.usermodel.XSSFRelation; import org.apache.xmlbeans.XmlException; -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.xml.sax.ContentHandler; import org.xml.sax.InputSource; import org.xml.sax.XMLReader; import com.alibaba.excel.analysis.BaseSaxAnalyser; import com.alibaba.excel.cache.Cache; -import com.alibaba.excel.cache.Ehcache; +import com.alibaba.excel.cache.EhcacheFile; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.exception.ExcelAnalysisException; import com.alibaba.excel.metadata.Sheet; @@ -46,12 +43,31 @@ public class XlsxSaxAnalyser extends BaseSaxAnalyser { this.analysisContext = analysisContext; analysisContext.setCurrentRowNum(0); - OPCPackage pkg = OPCPackage.open(analysisContext.getInputStream()); + // OPCPackage pkg = + // OPCPackage.open(new File("D:\\git\\easyexcel\\src\\test\\resources\\read\\large\\large07.xlsx")); +// InputStream input = +// Thread.currentThread().getContextClassLoader().getResourceAsStream("read/large/large07.xlsx"); +// File ff = new File("D:\\git\\easyexcel\\src\\test\\resources\\read\\large\\large0722.xlsx"); +// OutputStream os = new FileOutputStream(ff); +// int bytesRead = 0; +// byte[] buffer = new byte[8192]; +// while ((bytesRead = input.read(buffer, 0, 8192)) != -1) { +// os.write(buffer, 0, bytesRead); +// } +// os.close(); +// input.close(); +// OPCPackage pkg = OPCPackage.open(ff); + + OPCPackage pkg = + OPCPackage.open(Thread.currentThread().getContextClassLoader().getResourceAsStream("read/large/large07.xlsx")); this.xssfReader = new XSSFReader(pkg); ArrayList parts = pkg.getPartsByContentType(XSSFRelation.SHARED_STRINGS.getContentType()); PackagePart packagePart = parts.get(0); - InputSource sheetSource1 = new InputSource(packagePart.getInputStream()); - this.cache = new Ehcache(); + // InputStream sheet = Thread.currentThread().getContextClassLoader() + // .getResourceAsStream("read/large/large07/xl/sharedStrings.xml"); + InputStream sheet = packagePart.getInputStream(); + InputSource sheetSource1 = new InputSource(sheet); + this.cache = new EhcacheFile(); try { SAXParserFactory saxFactory = SAXParserFactory.newInstance(); saxFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); @@ -62,23 +78,27 @@ public class XlsxSaxAnalyser extends BaseSaxAnalyser { ContentHandler handler = new SharedStringsTableHandler(cache); xmlReader.setContentHandler(handler); xmlReader.parse(sheetSource1); - packagePart.getInputStream().close(); + sheet.close(); } catch (Exception e) { e.printStackTrace(); throw new ExcelAnalysisException(e); } - - InputStream workbookXml = xssfReader.getWorkbookData(); - WorkbookDocument ctWorkbook = WorkbookDocument.Factory.parse(workbookXml); - CTWorkbook wb = ctWorkbook.getWorkbook(); - CTWorkbookPr prefix = wb.getWorkbookPr(); - if (prefix != null) { - this.use1904WindowDate = prefix.getDate1904(); - } + cache.finish(); + // this.cache=new SharedStringsTableCache(xssfReader.getSharedStringsTable()); + // InputStream workbookXml = xssfReader.getWorkbookData(); + // WorkbookDocument ctWorkbook = WorkbookDocument.Factory.parse(workbookXml); + // CTWorkbook wb = ctWorkbook.getWorkbook(); + // CTWorkbookPr prefix = wb.getWorkbookPr(); + // if (prefix != null) { + // this.use1904WindowDate = prefix.getDate1904(); + // } this.analysisContext.setUse1904WindowDate(use1904WindowDate); + // sheetSourceList.add(new SheetSource("test", Thread.currentThread().getContextClassLoader() + // .getResourceAsStream("read/large/large07/xl/worksheets/sheet1.xml"))); XSSFReader.SheetIterator ite; sheetSourceList = new ArrayList(); + ite = (XSSFReader.SheetIterator)xssfReader.getSheetsData(); while (ite.hasNext()) { InputStream inputStream = ite.next(); diff --git a/src/main/java/com/alibaba/excel/cache/Ehcache.java b/src/main/java/com/alibaba/excel/cache/Ehcache.java index 05ffb0d..9e6cf21 100644 --- a/src/main/java/com/alibaba/excel/cache/Ehcache.java +++ b/src/main/java/com/alibaba/excel/cache/Ehcache.java @@ -1,15 +1,23 @@ package com.alibaba.excel.cache; import java.io.File; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; import java.util.Map; +import java.util.Set; +import java.util.TreeMap; import org.ehcache.PersistentCacheManager; import org.ehcache.config.builders.CacheConfigurationBuilder; import org.ehcache.config.builders.CacheManagerBuilder; import org.ehcache.config.builders.ResourcePoolsBuilder; import org.ehcache.config.units.MemoryUnit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.alibaba.excel.util.POITempFile; +import com.alibaba.excel.util.StringUtils; /** * Default cache @@ -17,7 +25,17 @@ import com.alibaba.excel.util.POITempFile; * @author zhuangjiaju */ public class Ehcache implements Cache { - private org.ehcache.Cache> cache; + private static final Logger LOGGER = LoggerFactory.getLogger(Ehcache.class); + private static final int BATCH = 500; + // private org.ehcache.Cache cache; + int index = 0; + int expirekey = 0; + private Map cache = new HashMap(); + private Map> cacheMap = new HashMap>(); + private TreeMap expire = new TreeMap(); + private StringBuilder sb = new StringBuilder(); + private Set count = new HashSet(); + private int getCount = 1; public Ehcache() { File file = POITempFile.createCacheTmpFile(); @@ -26,21 +44,80 @@ public class Ehcache implements Cache { .withCache("cache", CacheConfigurationBuilder.newCacheConfigurationBuilder(Integer.class, String.class, ResourcePoolsBuilder.newResourcePoolsBuilder().disk(10, MemoryUnit.GB))) .build(true); - this.cache = persistentCacheManager.getCache("cache", Integer.class, String.class); + // this.cache = persistentCacheManager.getCache("cache", Integer.class, String.class); } @Override public void put(Integer key, String value) { - cache.put(key, value); + sb.append(index++).append(":").append(value).append(","); + if (index != 0 && index % BATCH == 0) { + int key1 = index / BATCH; + cache.put(key1, sb.toString()); + // LOGGER.info("put:key:{},{}", key1, sb.toString()); + sb = new StringBuilder(); + } } @Override public String get(Integer key) { - return cache.get(key); + int route = key / BATCH; + route++; + if (!cacheMap.containsKey(route)) { + // LOGGER.info("key:{},route:{},missing", key, route); + Map map = new HashMap(10000 / 3 * 4 + 1); + String s = cache.get(route); + String[] values = s.split(","); + for (String value : values) { + String[] vv = value.split(":"); + map.put(Integer.valueOf(vv[0]), vv[1]); + } + cacheMap.put(route, map); + expire.put(expirekey++, route); + } + count.add(route); + + if (getCount++ % 1000 == 0) { + Iterator>> iterator = cacheMap.entrySet().iterator(); + // LOGGER.info("size:{}", cacheMap.size()); + while (iterator.hasNext()) { + Map.Entry> entry = iterator.next(); + if (!count.contains(entry.getKey())) { + // LOGGER.info("route:{},remove", entry.getKey()); + iterator.remove(); + Iterator> ex = expire.entrySet().iterator(); + while (ex.hasNext()) { + Map.Entry e = ex.next(); + if (e.getValue().equals(entry.getKey())) { + ex.remove(); + break; + } + } + } + } + count.clear(); + } + + if (expire.size() > 10) { + int value1=expire.firstEntry().getValue(); + int key1=expire.firstEntry().getKey(); + cacheMap.remove(value1); + expire.remove(key1); + } + + return cacheMap.get(route).get(key); } @Override public void finish() { + if (StringUtils.isEmpty(sb.toString())) { + return; + } + int key1 = index / BATCH; + if (index % BATCH != 0) { + key1++; + } + cache.put(key1, sb.toString()); + // LOGGER.info("put:key:{},{}", key1 + 1, sb.toString()); } } diff --git a/src/main/java/com/alibaba/excel/cache/Ehcache2.java b/src/main/java/com/alibaba/excel/cache/Ehcache2.java new file mode 100644 index 0000000..0569d2e --- /dev/null +++ b/src/main/java/com/alibaba/excel/cache/Ehcache2.java @@ -0,0 +1,36 @@ +package com.alibaba.excel.cache; + +import java.util.HashMap; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Default cache + * + * @author zhuangjiaju + */ +public class Ehcache2 implements Cache { + private static final Logger LOGGER = LoggerFactory.getLogger(Ehcache2.class); + + int index = 0; + // private org.ehcache.Cache cache; + + private Map cache = new HashMap(); + + public Ehcache2() {} + + @Override + public void put(Integer key, String value) { + cache.put(key, value); + } + + @Override + public String get(Integer key) { + return cache.get(key); + } + + @Override + public void finish() {} +} diff --git a/src/main/java/com/alibaba/excel/cache/EhcacheFile.java b/src/main/java/com/alibaba/excel/cache/EhcacheFile.java new file mode 100644 index 0000000..db6493c --- /dev/null +++ b/src/main/java/com/alibaba/excel/cache/EhcacheFile.java @@ -0,0 +1,123 @@ +package com.alibaba.excel.cache; + +import java.io.File; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; + +import org.ehcache.PersistentCacheManager; +import org.ehcache.config.builders.CacheConfigurationBuilder; +import org.ehcache.config.builders.CacheManagerBuilder; +import org.ehcache.config.builders.ResourcePoolsBuilder; +import org.ehcache.config.units.MemoryUnit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.alibaba.excel.util.POITempFile; +import com.alibaba.excel.util.StringUtils; + +/** + * Default cache + * + * @author zhuangjiaju + */ +public class EhcacheFile implements Cache { + private static final Logger LOGGER = LoggerFactory.getLogger(EhcacheFile.class); + private static final int BATCH = 500; + int index = 0; + int expirekey = 0; + private org.ehcache.Cache cache; + // private Map cache = new HashMap(); + private Map> cacheMap = new HashMap>(); + private TreeMap expire = new TreeMap(); + private StringBuilder sb = new StringBuilder(); + private Set count = new HashSet(); + private int getCount = 1; + + public EhcacheFile() { + File file = POITempFile.createCacheTmpFile(); + PersistentCacheManager persistentCacheManager = + CacheManagerBuilder.newCacheManagerBuilder().with(CacheManagerBuilder.persistence(file)) + .withCache("cache", CacheConfigurationBuilder.newCacheConfigurationBuilder(Integer.class, String.class, + ResourcePoolsBuilder.newResourcePoolsBuilder().disk(10, MemoryUnit.GB))) + .build(true); + this.cache = persistentCacheManager.getCache("cache", Integer.class, String.class); + } + + @Override + public void put(Integer key, String value) { + sb.append(index++).append(":").append(value).append(","); + if (index != 0 && index % BATCH == 0) { + int key1 = index / BATCH; + cache.put(key1, sb.toString()); + // LOGGER.info("put:key:{},{}", key1, sb.toString()); + sb = new StringBuilder(); + } + } + + @Override + public String get(Integer key) { + int route = key / BATCH; + route++; + if (!cacheMap.containsKey(route)) { + // LOGGER.info("key:{},route:{},missing", key, route); + Map map = new HashMap(10000 / 3 * 4 + 1); + String s = cache.get(route); + String[] values = s.split(","); + for (String value : values) { + String[] vv = value.split(":"); + map.put(Integer.valueOf(vv[0]), vv[1]); + } + cacheMap.put(route, map); + expire.put(expirekey++, route); + } + count.add(route); + + if (getCount++ % 1000 == 0) { + Iterator>> iterator = cacheMap.entrySet().iterator(); + // LOGGER.info("size:{}", cacheMap.size()); + while (iterator.hasNext()) { + Map.Entry> entry = iterator.next(); + if (!count.contains(entry.getKey())) { + // LOGGER.info("route:{},remove", entry.getKey()); + iterator.remove(); + Iterator> ex = expire.entrySet().iterator(); + while (ex.hasNext()) { + Map.Entry e = ex.next(); + if (e.getValue().equals(entry.getKey())) { + ex.remove(); + break; + } + } + } + } + count.clear(); + } + + if (expire.size() > 10) { + int value1 = expire.firstEntry().getValue(); + int key1 = expire.firstEntry().getKey(); + cacheMap.remove(value1); + expire.remove(key1); + } + + return cacheMap.get(route).get(key); + } + + @Override + public void finish() { + if (StringUtils.isEmpty(sb.toString())) { + return; + } + int key1 = index / BATCH; + if (index % BATCH != 0) { + key1++; + } + + cache.put(key1, sb.toString()); + // LOGGER.info("put:key:{},{}", key1 + 1, sb.toString()); + } +} diff --git a/src/main/java/com/alibaba/excel/cache/EhcacheMix.java b/src/main/java/com/alibaba/excel/cache/EhcacheMix.java new file mode 100644 index 0000000..4308559 --- /dev/null +++ b/src/main/java/com/alibaba/excel/cache/EhcacheMix.java @@ -0,0 +1,123 @@ +package com.alibaba.excel.cache; + +import java.io.File; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; + +import org.ehcache.PersistentCacheManager; +import org.ehcache.config.builders.CacheConfigurationBuilder; +import org.ehcache.config.builders.CacheManagerBuilder; +import org.ehcache.config.builders.ResourcePoolsBuilder; +import org.ehcache.config.units.MemoryUnit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.alibaba.excel.util.POITempFile; +import com.alibaba.excel.util.StringUtils; + +/** + * Default cache + * + * @author zhuangjiaju + */ +public class EhcacheMix implements Cache { + private static final Logger LOGGER = LoggerFactory.getLogger(EhcacheMix.class); + private static final int BATCH = 500; + int index = 0; + int expirekey = 0; + private org.ehcache.Cache cache; + private Map> cacheMap = new HashMap>(); + private TreeMap expire = new TreeMap(); + private StringBuilder sb = new StringBuilder(); + private Set count = new HashSet(); + private int getCount = 1; + + private int countRead = 0; + + public EhcacheMix() { + File file = POITempFile.createCacheTmpFile(); + PersistentCacheManager persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder() + .with(CacheManagerBuilder.persistence(file)) + .withCache("cache", CacheConfigurationBuilder.newCacheConfigurationBuilder(Integer.class, String.class, + ResourcePoolsBuilder.newResourcePoolsBuilder().heap(20, MemoryUnit.MB).disk(2, MemoryUnit.GB, false))) + .build(true); + this.cache = persistentCacheManager.getCache("cache", Integer.class, String.class); + } + + @Override + public void put(Integer key, String value) { + sb.append(index++).append(":").append(value).append(","); + if (index != 0 && index % BATCH == 0) { + int key1 = index / BATCH; + cache.put(key1, sb.toString()); + // LOGGER.info("put:key:{},{}", key1, sb.toString()); + sb = new StringBuilder(); + } + } + + @Override + public String get(Integer key) { + int route = key / BATCH; + route++; + if (!cacheMap.containsKey(route)) { + Map map = new HashMap(10000 / 3 * 4 + 1); + String s = cache.get(route); + String[] values = s.split(","); + for (String value : values) { + String[] vv = value.split(":"); + map.put(Integer.valueOf(vv[0]), vv[1]); + } + cacheMap.put(route, map); + expire.put(expirekey++, route); + } + count.add(route); + + if (getCount++ % 1000 == 0) { + Iterator>> iterator = cacheMap.entrySet().iterator(); + // LOGGER.info("size:{}", cacheMap.size()); + while (iterator.hasNext()) { + Map.Entry> entry = iterator.next(); + if (!count.contains(entry.getKey())) { + // LOGGER.info("route:{},remove", entry.getKey()); + iterator.remove(); + Iterator> ex = expire.entrySet().iterator(); + while (ex.hasNext()) { + Map.Entry e = ex.next(); + if (e.getValue().equals(entry.getKey())) { + ex.remove(); + break; + } + } + } + } + count.clear(); + } + + if (expire.size() > 10) { + int value1 = expire.firstEntry().getValue(); + int key1 = expire.firstEntry().getKey(); + cacheMap.remove(value1); + expire.remove(key1); + } + + return cacheMap.get(route).get(key); + } + + @Override + public void finish() { + if (StringUtils.isEmpty(sb.toString())) { + return; + } + int key1 = index / BATCH; + if (index % BATCH != 0) { + key1++; + } + + cache.put(key1, sb.toString()); + // LOGGER.info("put:key:{},{}", key1 + 1, sb.toString()); + } +} diff --git a/src/main/java/com/alibaba/excel/context/AnalysisContextImpl.java b/src/main/java/com/alibaba/excel/context/AnalysisContextImpl.java index b5e6a5d..ed27e39 100644 --- a/src/main/java/com/alibaba/excel/context/AnalysisContextImpl.java +++ b/src/main/java/com/alibaba/excel/context/AnalysisContextImpl.java @@ -74,7 +74,6 @@ public class AnalysisContextImpl implements AnalysisContext { this.converterRegistryCenter = converterRegistryCenter; } - @Override public void setCurrentSheet(Sheet currentSheet) { cleanCurrentSheet(); @@ -85,6 +84,7 @@ public class AnalysisContextImpl implements AnalysisContext { } } + private void cleanCurrentSheet() { this.currentSheet = null; this.excelHeadProperty = null; diff --git a/src/main/java/com/alibaba/excel/event/AnalysisEventListener.java b/src/main/java/com/alibaba/excel/event/AnalysisEventListener.java index cc0d877..305c7cb 100644 --- a/src/main/java/com/alibaba/excel/event/AnalysisEventListener.java +++ b/src/main/java/com/alibaba/excel/event/AnalysisEventListener.java @@ -3,24 +3,31 @@ package com.alibaba.excel.event; import com.alibaba.excel.context.AnalysisContext; /** - * + * Receives the return of each piece of data parsed * * @author jipengfei */ -public abstract class AnalysisEventListener { +public abstract class AnalysisEventListener implements ReadListener { /** - * when analysis one row trigger invoke function + * All listeners receive this method when any one Listener does an error report. If an exception is thrown here, the + * entire read will terminate. * - * @param object one row value - * @param context analysis context + * @param exception + * @param context */ - public abstract void invoke(T object, AnalysisContext context); + @Override + public void onException(Exception exception, AnalysisContext context) throws Exception { + throw exception; + } /** - * if have something to do after all analysis - * + * Verify that there is another piece of data.You can stop the read by returning false + * * @param context + * @return */ - public abstract void doAfterAllAnalysed(AnalysisContext context); + public boolean hasNext(AnalysisContext context) { + return true; + } } diff --git a/src/main/java/com/alibaba/excel/event/Handler.java b/src/main/java/com/alibaba/excel/event/Handler.java index 2d3af06..a984c05 100644 --- a/src/main/java/com/alibaba/excel/event/Handler.java +++ b/src/main/java/com/alibaba/excel/event/Handler.java @@ -1,7 +1,7 @@ package com.alibaba.excel.event; /** - * intercepts handle some business logic + * Intercepts handle some business logic * * @author zhuangjiaju **/ diff --git a/src/main/java/com/alibaba/excel/event/Listener.java b/src/main/java/com/alibaba/excel/event/Listener.java new file mode 100644 index 0000000..654af62 --- /dev/null +++ b/src/main/java/com/alibaba/excel/event/Listener.java @@ -0,0 +1,8 @@ +package com.alibaba.excel.event; + +/** + * Interface to listen for processing results + * + * @author zhuangjiaju + */ +public interface Listener {} diff --git a/src/main/java/com/alibaba/excel/event/ReadListener.java b/src/main/java/com/alibaba/excel/event/ReadListener.java new file mode 100644 index 0000000..459f378 --- /dev/null +++ b/src/main/java/com/alibaba/excel/event/ReadListener.java @@ -0,0 +1,37 @@ +package com.alibaba.excel.event; + +import com.alibaba.excel.context.AnalysisContext; + +/** + * Interface to listen for read results + * + * @author zhuangjiaju + */ +public interface ReadListener extends Listener { + /** + * All listeners receive this method when any one Listener does an error report. If an exception is thrown here, the + * * entire read will terminate. + * + * @param exception + * @param context + * @throws Exception + */ + void onException(Exception exception, AnalysisContext context) throws Exception; + + /** + * when analysis one row trigger invoke function + * + * @param object + * one row value + * @param context + * analysis context + */ + void invoke(T object, AnalysisContext context); + + /** + * if have something to do after all analysis + * + * @param context + */ + void doAfterAllAnalysed(AnalysisContext context); +} diff --git a/src/main/java/com/alibaba/excel/metadata/BasicParameter.java b/src/main/java/com/alibaba/excel/metadata/BasicParameter.java index acbaef9..dcaf950 100644 --- a/src/main/java/com/alibaba/excel/metadata/BasicParameter.java +++ b/src/main/java/com/alibaba/excel/metadata/BasicParameter.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Map; import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.event.ReadListener; import com.alibaba.excel.write.handler.WriteHandler; /** @@ -46,6 +47,10 @@ public class BasicParameter { * Custom type handler override the default */ private List customWriteHandlerList = new ArrayList(); + /** + * Custom type listener run after default + */ + private List customReadListenerList = new ArrayList(); public Integer getReadHeadRowNumber() { return readHeadRowNumber; @@ -102,4 +107,12 @@ public class BasicParameter { public void setCustomWriteHandlerList(List customWriteHandlerList) { this.customWriteHandlerList = customWriteHandlerList; } + + public List getCustomReadListenerList() { + return customReadListenerList; + } + + public void setCustomReadListenerList(List customReadListenerList) { + this.customReadListenerList = customReadListenerList; + } } diff --git a/src/main/java/com/alibaba/excel/metadata/Workbook.java b/src/main/java/com/alibaba/excel/metadata/Workbook.java index 920a7b0..ceb6274 100644 --- a/src/main/java/com/alibaba/excel/metadata/Workbook.java +++ b/src/main/java/com/alibaba/excel/metadata/Workbook.java @@ -1,5 +1,6 @@ package com.alibaba.excel.metadata; +import java.io.File; import java.io.InputStream; import java.io.OutputStream; @@ -16,14 +17,26 @@ public class Workbook extends BasicParameter { * Excel type */ private ExcelTypeEnum excelType; + /** - * Final output stream + * Read final output stream */ private OutputStream outputStream; /** - * Template input stream + *
  • write: Template input stream + *
  • read: Read InputStream + *

    + * If 'inputStream' and 'file' all not empty,file first + */ + private InputStream inputStream; + + /** + *

  • write: Template file + *
  • read: Read file + *

    + * If 'inputStream' and 'file' all not empty,file first */ - private InputStream templateInputStream; + private File file; /** * Default true */ @@ -60,12 +73,20 @@ public class Workbook extends BasicParameter { this.outputStream = outputStream; } - public InputStream getTemplateInputStream() { - return templateInputStream; + public InputStream getInputStream() { + return inputStream; + } + + public void setInputStream(InputStream inputStream) { + this.inputStream = inputStream; + } + + public File getFile() { + return file; } - public void setTemplateInputStream(InputStream templateInputStream) { - this.templateInputStream = templateInputStream; + public void setFile(File file) { + this.file = file; } public com.alibaba.excel.event.WriteHandler getWriteHandler() { diff --git a/src/main/java/com/alibaba/excel/support/ExcelTypeEnum.java b/src/main/java/com/alibaba/excel/support/ExcelTypeEnum.java index 57882b9..dc5f5d3 100644 --- a/src/main/java/com/alibaba/excel/support/ExcelTypeEnum.java +++ b/src/main/java/com/alibaba/excel/support/ExcelTypeEnum.java @@ -27,20 +27,21 @@ public enum ExcelTypeEnum { } public static ExcelTypeEnum valueOf(InputStream inputStream){ - try { - if (!inputStream.markSupported()) { - return null; - } - FileMagic fileMagic = FileMagic.valueOf(inputStream); - if(FileMagic.OLE2.equals(fileMagic)){ - return XLS; - } - if(FileMagic.OOXML.equals(fileMagic)){ - return XLSX; - } - return null; - } catch (IOException e) { - throw new RuntimeException(e); - } + return XLSX; +// try { +// if (!inputStream.markSupported()) { +// return null; +// } +// FileMagic fileMagic = FileMagic.valueOf(inputStream); +// if(FileMagic.OLE2.equals(fileMagic)){ +// return XLS; +// } +// if(FileMagic.OOXML.equals(fileMagic)){ +// return XLSX; +// } +// return null; +// } catch (IOException e) { +// throw new RuntimeException(e); +// } } } diff --git a/src/test/java/com/alibaba/easyexcel/test/read/large/LargeData07Test.java b/src/test/java/com/alibaba/easyexcel/test/read/large/LargeData07Test.java index 8076411..edbb047 100644 --- a/src/test/java/com/alibaba/easyexcel/test/read/large/LargeData07Test.java +++ b/src/test/java/com/alibaba/easyexcel/test/read/large/LargeData07Test.java @@ -1,12 +1,9 @@ package com.alibaba.easyexcel.test.read.large; -import java.io.InputStream; - import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.alibaba.easyexcel.test.util.FileUtil; import com.alibaba.excel.EasyExcelFactory; import com.alibaba.excel.ExcelReader; import com.alibaba.excel.metadata.Sheet; @@ -23,11 +20,15 @@ public class LargeData07Test { public void large() throws Exception { LOGGER.info("start"); long start = System.currentTimeMillis(); - InputStream inputStream = FileUtil.readFile("large/large07.xlsx"); - ExcelReader excelReader = EasyExcelFactory.getReader(inputStream, new LargeDataListener()); + // InputStream inputStream = FileUtil.readFile("large/large07.xlsx"); + ExcelReader excelReader = EasyExcelFactory.getReader(null, new LargeDataListener()); excelReader.read(new Sheet(1, 1)); - inputStream.close(); + // inputStream.close(); LOGGER.info("time:{}", System.currentTimeMillis() - start); } + @Test + public void hello() throws Exception { + LOGGER.info("start"); + } }