diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/EasyExcelFactory.java b/easyexcel-core/src/main/java/com/alibaba/excel/EasyExcelFactory.java index 65b12b3a..28cdad5a 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/EasyExcelFactory.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/EasyExcelFactory.java @@ -3,12 +3,10 @@ package com.alibaba.excel; import java.io.File; import java.io.InputStream; import java.io.OutputStream; -import java.util.function.Consumer; -import java.util.stream.Stream; -import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.read.builder.ExcelReaderBuilder; import com.alibaba.excel.read.builder.ExcelReaderSheetBuilder; +import com.alibaba.excel.read.builder.StreamingReaderBuilder; import com.alibaba.excel.read.listener.ReadListener; import com.alibaba.excel.write.builder.ExcelWriterBuilder; import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder; @@ -249,22 +247,6 @@ public class EasyExcelFactory { return read(pathName, null, readListener); } - public static Stream read(String pathName, Class head) { - Consumer> sequence = c -> { - ReadListener listener = new ReadListener() { - @Override - public void invoke(T data, AnalysisContext context) { - c.accept(data); - } - - @Override - public void doAfterAllAnalysed(AnalysisContext context) {} - }; - read(pathName, head, listener).sheet().doRead(); - }; - return StreamBuilder.stream(sequence); - } - /** * Build excel the read * @@ -326,6 +308,24 @@ public class EasyExcelFactory { return excelReaderBuilder; } + public static StreamingReaderBuilder read(File file, Class head) { + StreamingReaderBuilder reader = new StreamingReaderBuilder<>(); + reader.file(file).head(head); + return reader; + } + + public static StreamingReaderBuilder read(String pathName, Class head) { + StreamingReaderBuilder reader = new StreamingReaderBuilder<>(); + reader.file(pathName).head(head); + return reader; + } + + public static StreamingReaderBuilder read(InputStream inputStream, Class head) { + StreamingReaderBuilder reader = new StreamingReaderBuilder<>(); + reader.file(inputStream).head(head); + return reader; + } + /** * Build excel the 'readSheet' * diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/StreamBuilder.java b/easyexcel-core/src/main/java/com/alibaba/excel/StreamBuilder.java deleted file mode 100644 index 7fe165a0..00000000 --- a/easyexcel-core/src/main/java/com/alibaba/excel/StreamBuilder.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.alibaba.excel; - -import java.util.Iterator; -import java.util.NoSuchElementException; -import java.util.Spliterator; -import java.util.Spliterators; -import java.util.function.Consumer; -import java.util.stream.Stream; -import java.util.stream.StreamSupport; - -/** - * build stream from generator - */ -public class StreamBuilder { - public static Stream stream(Consumer> sequence) { - Iterator iterator = new Iterator() { - @Override - public boolean hasNext() { - throw new NoSuchElementException(); - } - - @Override - public T next() { - throw new NoSuchElementException(); - } - - @Override - public void forEachRemaining(Consumer action) { - sequence.accept(action::accept); - } - }; - return StreamSupport.stream( - Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), - false); - } -} diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/read/builder/StreamingReaderBuilder.java b/easyexcel-core/src/main/java/com/alibaba/excel/read/builder/StreamingReaderBuilder.java new file mode 100644 index 00000000..f9b0e939 --- /dev/null +++ b/easyexcel-core/src/main/java/com/alibaba/excel/read/builder/StreamingReaderBuilder.java @@ -0,0 +1,69 @@ +package com.alibaba.excel.read.builder; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.read.listener.ReadListener; + +import java.util.Iterator; +import java.util.List; +import java.util.Spliterator; +import java.util.Spliterators; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +/** + * @author yilai + */ +public class StreamingReaderBuilder extends ExcelReaderBuilder { + public Stream toStream() { + return toStream(ExcelReaderBuilder::sheet); + } + + public Stream toStream(Integer sheetNo) { + return toStream(b -> b.sheet(sheetNo)); + } + + public Stream toStream(String sheetName) { + return toStream(b -> b.sheet(sheetName)); + } + + private Stream toStream(Function toSheet) { + return stream(c -> { + List> listeners = parameter().getCustomReadListenerList(); + if (listeners != null && !listeners.isEmpty()) { + listeners.clear(); + } + registerReadListener(new ReadListener() { + @Override + public void invoke(T data, AnalysisContext context) { + c.accept(data); + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) {} + }); + toSheet.apply(this).doRead(); + }); + } + + public static Stream stream(Consumer> sequence) { + Iterator iterator = new Iterator() { + @Override + public boolean hasNext() { + throw new UnsupportedOperationException(); + } + + @Override + public T next() { + throw new UnsupportedOperationException(); + } + + @Override + public void forEachRemaining(Consumer action) { + sequence.accept(action::accept); + } + }; + return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false); + } +}