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 80c40851..28cdad5a 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/EasyExcelFactory.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/EasyExcelFactory.java @@ -6,6 +6,7 @@ import java.io.OutputStream; 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; @@ -307,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/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); + } +}