浏览代码

优化Excel文件导出逻辑

woody 1 年之前
父节点
当前提交
a17c6a5ae2

+ 2 - 3
framework-common/src/main/java/com/chelvc/framework/common/util/ExcelUtils.java

@@ -500,13 +500,12 @@ public final class ExcelUtils {
      *
      * @param workbook 工作薄
      * @param file     输出文件
+     * @throws IOException I/O异常
      */
-    public static void save(@NonNull Workbook workbook, @NonNull File file) {
+    public static void save(@NonNull Workbook workbook, @NonNull File file) throws IOException {
         try (OutputStream output = new FileOutputStream(file)) {
             workbook.write(output);
             workbook.close();
-        } catch (IOException e) {
-            throw new RuntimeException(e);
         }
     }
 

+ 35 - 3
framework-export/src/main/java/com/chelvc/framework/export/ExportHandler.java

@@ -6,8 +6,9 @@ import java.util.function.BiConsumer;
 import java.util.function.BiFunction;
 import javax.servlet.http.HttpServletResponse;
 
+import com.chelvc.framework.common.function.Adapter;
 import com.chelvc.framework.common.util.ExcelUtils;
-import lombok.NonNull;
+import org.apache.poi.ss.usermodel.Workbook;
 
 /**
  * 数据导出操作接口
@@ -30,6 +31,15 @@ public interface ExportHandler {
      */
     Exporting.Status status(long id);
 
+    /**
+     * 保存工作薄到文件
+     *
+     * @param id       导出任务ID
+     * @param workbook 工作薄
+     * @throws IOException I/O异常
+     */
+    void save(long id, Workbook workbook) throws IOException;
+
     /**
      * 下载数据导出文件
      *
@@ -39,6 +49,28 @@ public interface ExportHandler {
      */
     void download(long id, HttpServletResponse response) throws IOException;
 
+    /**
+     * 异步导出数据
+     *
+     * @param filename 文件名称
+     * @param adapter  数据处理回调函数
+     * @return 导出任务ID
+     */
+    default long export(String filename, Adapter<Long, Integer> adapter) {
+        return this.export(filename, adapter, (id, volume) -> {
+        });
+    }
+
+    /**
+     * 异步导出数据
+     *
+     * @param filename 文件名称
+     * @param adapter  数据处理回调函数
+     * @param listener 导出完成监听器
+     * @return 导出任务ID
+     */
+    long export(String filename, Adapter<Long, Integer> adapter, BiConsumer<Long, Integer> listener);
+
     /**
      * 异步导出数据
      *
@@ -49,8 +81,8 @@ public interface ExportHandler {
      * @param <T>      数据类型
      * @return 导出任务ID
      */
-    default <T> long export(@NonNull String filename, @NonNull BiFunction<Integer, Integer, Collection<T>> provider,
-                            @NonNull ExcelUtils.Writer<T> writer, @NonNull String... titles) {
+    default <T> long export(String filename, BiFunction<Integer, Integer, Collection<T>> provider,
+                            ExcelUtils.Writer<T> writer, String... titles) {
         return this.export(
                 filename,
                 (id, volume) -> {

+ 22 - 15
framework-export/src/main/java/com/chelvc/framework/export/support/DefaultExportHandler.java

@@ -1,9 +1,7 @@
 package com.chelvc.framework.export.support;
 
 import java.io.File;
-import java.io.FileOutputStream;
 import java.io.IOException;
-import java.io.OutputStream;
 import java.io.Serializable;
 import java.time.Duration;
 import java.util.Collection;
@@ -17,6 +15,7 @@ import javax.servlet.http.HttpServletResponse;
 import com.chelvc.framework.base.context.ApplicationContextHolder;
 import com.chelvc.framework.base.context.ThreadContextHolder;
 import com.chelvc.framework.base.util.HttpUtils;
+import com.chelvc.framework.common.function.Adapter;
 import com.chelvc.framework.common.function.Executor;
 import com.chelvc.framework.common.util.AssertUtils;
 import com.chelvc.framework.common.util.ExcelUtils;
@@ -143,6 +142,11 @@ public class DefaultExportHandler implements ExportHandler, ApplicationListener<
         return ObjectUtils.ifNull(this.exporting(id), Exporting::getStatus);
     }
 
+    @Override
+    public void save(long id, @NonNull Workbook workbook) throws IOException {
+        ExcelUtils.save(workbook, new File(this.directory, String.valueOf(id)));
+    }
+
     @Override
     public void download(long id, @NonNull HttpServletResponse response) throws IOException {
         Exporting exporting = this.exporting(id);
@@ -154,9 +158,8 @@ public class DefaultExportHandler implements ExportHandler, ApplicationListener<
     }
 
     @Override
-    public <T> long export(@NonNull String filename, @NonNull BiConsumer<Long, Integer> listener,
-                           @NonNull BiFunction<Integer, Integer, Collection<T>> provider,
-                           @NonNull ExcelUtils.Writer<T> writer, @NonNull String... titles) {
+    public long export(@NonNull String filename, @NonNull Adapter<Long, Integer> adapter,
+                       @NonNull BiConsumer<Long, Integer> listener) {
         // 生成导出任务ID
         long id = RedisContextHolder.identity();
 
@@ -167,16 +170,8 @@ public class DefaultExportHandler implements ExportHandler, ApplicationListener<
         ThreadContextHolder.run(() -> {
             int volume;
             try {
-                // 将数据写入工作薄
-                Workbook workbook = new SXSSFWorkbook();
-                volume = ExcelUtils.write(workbook, provider, writer, titles);
-
-                // 保存导出文件
-                File file = new File(this.directory, String.valueOf(id));
-                try (OutputStream output = new FileOutputStream(file)) {
-                    workbook.write(output);
-                    workbook.close();
-                }
+                // 导出任务处理回调
+                volume = adapter.apply(id);
 
                 // 更新导出任务完成状态
                 this.exporting(id, filename, Exporting.Status.COMPLETED, this.duration);
@@ -197,4 +192,16 @@ public class DefaultExportHandler implements ExportHandler, ApplicationListener<
         });
         return id;
     }
+
+    @Override
+    public <T> long export(@NonNull String filename, @NonNull BiConsumer<Long, Integer> listener,
+                           @NonNull BiFunction<Integer, Integer, Collection<T>> provider,
+                           @NonNull ExcelUtils.Writer<T> writer, @NonNull String... titles) {
+        return this.export(filename, id -> {
+            Workbook workbook = new SXSSFWorkbook();
+            int volume = ExcelUtils.write(workbook, provider, writer, titles);
+            this.save(id, workbook);
+            return volume;
+        }, listener);
+    }
 }