From 3f1e5702a293f31c5b70255c888f8ebc68fe49be Mon Sep 17 00:00:00 2001 From: May <1742057357@qq.com> Date: Mon, 27 Nov 2023 02:52:59 +0000 Subject: [PATCH] =?UTF-8?q?!454=20=E6=B7=BB=E5=8A=A0excel=E5=A4=9Asheet?= =?UTF-8?q?=E9=A1=B5=E5=AF=BC=E5=87=BA=20*=20add=20=E6=B7=BB=E5=8A=A0excel?= =?UTF-8?q?=E5=A4=9Asheet=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/common/excel/utils/ExcelUtil.java | 56 ++++++++++++++++++ .../demo/controller/TestExcelController.java | 35 +++++++++++ .../src/main/resources/excel/多sheet列表.xlsx | Bin 0 -> 13359 bytes 3 files changed, 91 insertions(+) create mode 100644 ruoyi-modules/ruoyi-demo/src/main/resources/excel/多sheet列表.xlsx diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java index 329911d1e..a6c14ad51 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java @@ -269,6 +269,26 @@ public class ExcelUtil { } } + /** + * 多sheet模板导出 模板格式为 {key.属性} + * + * @param filename 文件名 + * @param templatePath 模板路径 resource 目录下的路径包括模板文件名 + * 例如: excel/temp.xlsx + * 重点: 模板文件必须放置到启动类对应的 resource 目录下 + * @param data 模板需要的数据 + * @param response 响应体 + */ + public static void exportTemplateMultiSheet(List> data, String filename, String templatePath, HttpServletResponse response) { + try { + resetResponse(filename, response); + ServletOutputStream os = response.getOutputStream(); + exportTemplateMultiSheet(data, templatePath, os); + } catch (IOException e) { + throw new RuntimeException("导出Excel异常"); + } + } + /** * 多表多数据模板导出 模板格式为 {key.属性} * @@ -303,6 +323,42 @@ public class ExcelUtil { excelWriter.finish(); } + /** + * 多sheet模板导出 模板格式为 {key.属性} + * + * @param templatePath 模板路径 resource 目录下的路径包括模板文件名 + * 例如: excel/temp.xlsx + * 重点: 模板文件必须放置到启动类对应的 resource 目录下 + * @param data 模板需要的数据 + * @param os 输出流 + */ + public static void exportTemplateMultiSheet(List> data, String templatePath, OutputStream os) { + ClassPathResource templateResource = new ClassPathResource(templatePath); + ExcelWriter excelWriter = EasyExcel.write(os) + .withTemplate(templateResource.getStream()) + .autoCloseStream(false) + // 大数值自动转换 防止失真 + .registerConverter(new ExcelBigNumberConvert()) + .build(); + if (CollUtil.isEmpty(data)) { + throw new IllegalArgumentException("数据为空"); + } + for (int i = 0; i < data.size(); i++) { + WriteSheet writeSheet = EasyExcel.writerSheet(i).build(); + for (Map.Entry map : data.get(i).entrySet()) { + // 设置列表后续还有数据 + FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); + if (map.getValue() instanceof Collection) { + // 多表导出必须使用 FillWrapper + excelWriter.fill(new FillWrapper(map.getKey(), (Collection) map.getValue()), fillConfig, writeSheet); + } else { + excelWriter.fill(map.getValue(), writeSheet); + } + } + } + excelWriter.finish(); + } + /** * 重置响应体 */ diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestExcelController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestExcelController.java index 418f7401e..3fd124c78 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestExcelController.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestExcelController.java @@ -94,6 +94,41 @@ public class TestExcelController { exportExcelService.exportWithOptions(response); } + /** + * 多个sheet导出 + */ + @GetMapping("/exportTemplateMultiSheet") + public void exportTemplateMultiSheet(HttpServletResponse response) { + List list1 = new ArrayList<>(); + list1.add(new TestObj1("list1测试1", "list1测试2", "list1测试3")); + list1.add(new TestObj1("list1测试4", "list1测试5", "list1测试6")); + List list2 = new ArrayList<>(); + list2.add(new TestObj1("list2测试1", "list2测试2", "list2测试3")); + list2.add(new TestObj1("list2测试4", "list2测试5", "list2测试6")); + List list3 = new ArrayList<>(); + list3.add(new TestObj1("list3测试1", "list3测试2", "list3测试3")); + list3.add(new TestObj1("list3测试4", "list3测试5", "list3测试6")); + List list4 = new ArrayList<>(); + list4.add(new TestObj1("list4测试1", "list4测试2", "list4测试3")); + list4.add(new TestObj1("list4测试4", "list4测试5", "list4测试6")); + + List> list = new ArrayList<>(); + Map sheetMap1 = new HashMap<>(); + sheetMap1.put("data1", list1); + Map sheetMap2 = new HashMap<>(); + sheetMap2.put("data2", list2); + Map sheetMap3 = new HashMap<>(); + sheetMap3.put("data3", list3); + Map sheetMap4 = new HashMap<>(); + sheetMap4.put("data4", list4); + + list.add(sheetMap1); + list.add(sheetMap2); + list.add(sheetMap3); + list.add(sheetMap4); + ExcelUtil.exportTemplateMultiSheet(list, "多sheet列表", "excel/多sheet列表.xlsx", response); + } + /** * 导入表格 */ diff --git a/ruoyi-modules/ruoyi-demo/src/main/resources/excel/多sheet列表.xlsx b/ruoyi-modules/ruoyi-demo/src/main/resources/excel/多sheet列表.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5277f2eaf95a0e36e1d04faeaa0217eec5f061a6 GIT binary patch literal 13359 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 literal 0 HcmV?d00001