From 03c89341225a7318e30e70ecfa3379c602b987a0 Mon Sep 17 00:00:00 2001 From: wolray <290061869@qq.com> Date: Wed, 15 Mar 2023 16:49:28 +0800 Subject: [PATCH 1/3] [add] direct Stream support as output --- .../com/alibaba/excel/EasyExcelFactory.java | 19 ++++++++++ .../java/com/alibaba/excel/StreamBuilder.java | 36 +++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 easyexcel-core/src/main/java/com/alibaba/excel/StreamBuilder.java 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..6d85d296 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/EasyExcelFactory.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/EasyExcelFactory.java @@ -3,7 +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.listener.ReadListener; @@ -246,6 +249,22 @@ 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 * diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/StreamBuilder.java b/easyexcel-core/src/main/java/com/alibaba/excel/StreamBuilder.java new file mode 100644 index 00000000..486edec4 --- /dev/null +++ b/easyexcel-core/src/main/java/com/alibaba/excel/StreamBuilder.java @@ -0,0 +1,36 @@ +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); + } +} From fc500d5ea7b89e1e1993ea90b194939693564519 Mon Sep 17 00:00:00 2001 From: wolray <290061869@qq.com> Date: Wed, 15 Mar 2023 17:46:57 +0800 Subject: [PATCH 2/3] [fix] generics error --- .../src/main/java/com/alibaba/excel/EasyExcelFactory.java | 2 +- .../src/main/java/com/alibaba/excel/StreamBuilder.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 6d85d296..65b12b3a 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/EasyExcelFactory.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/EasyExcelFactory.java @@ -251,7 +251,7 @@ public class EasyExcelFactory { public static Stream read(String pathName, Class head) { Consumer> sequence = c -> { - ReadListener listener = new ReadListener<>() { + ReadListener listener = new ReadListener() { @Override public void invoke(T data, AnalysisContext context) { c.accept(data); diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/StreamBuilder.java b/easyexcel-core/src/main/java/com/alibaba/excel/StreamBuilder.java index 486edec4..7fe165a0 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/StreamBuilder.java +++ b/easyexcel-core/src/main/java/com/alibaba/excel/StreamBuilder.java @@ -13,7 +13,7 @@ import java.util.stream.StreamSupport; */ public class StreamBuilder { public static Stream stream(Consumer> sequence) { - Iterator iterator = new Iterator<>() { + Iterator iterator = new Iterator() { @Override public boolean hasNext() { throw new NoSuchElementException(); From 776e67439b859bf6a3518de8a2adc44b7fee420e Mon Sep 17 00:00:00 2001 From: wolray <290061869@qq.com> Date: Wed, 15 Mar 2023 19:31:45 +0800 Subject: [PATCH 3/3] =?UTF-8?q?[add]=20=E6=94=AF=E6=8C=81=E5=A4=9A?= =?UTF-8?q?=E7=A7=8D=E6=95=B0=E6=8D=AE=E6=BA=90=20=E4=B8=8E=E5=8E=9F?= =?UTF-8?q?=E7=89=88=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/alibaba/excel/EasyExcelFactory.java | 38 +++++----- .../java/com/alibaba/excel/StreamBuilder.java | 36 ---------- .../read/builder/StreamingReaderBuilder.java | 69 +++++++++++++++++++ 3 files changed, 88 insertions(+), 55 deletions(-) delete mode 100644 easyexcel-core/src/main/java/com/alibaba/excel/StreamBuilder.java create mode 100644 easyexcel-core/src/main/java/com/alibaba/excel/read/builder/StreamingReaderBuilder.java 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); + } +}