From 838854ed83b3bf3e71719f2e5d8426ef8ded2ed3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Mon, 27 Nov 2023 10:56:31 +0800 Subject: [PATCH] =?UTF-8?q?add=20=E6=96=B0=E5=A2=9E=20=E6=B7=BB=E5=8A=A0ex?= =?UTF-8?q?cel=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 +++++++++++ .../main/resources/excel/多sheet列表.xlsx | Bin 0 -> 13359 bytes 3 files changed, 91 insertions(+) create mode 100644 ruoyi-example/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 329911d1..a6c14ad5 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-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestExcelController.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestExcelController.java index 0a12d9dc..d82ea3b0 100644 --- a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestExcelController.java +++ b/ruoyi-example/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-example/ruoyi-demo/src/main/resources/excel/多sheet列表.xlsx b/ruoyi-example/ruoyi-demo/src/main/resources/excel/多sheet列表.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5277f2eaf95a0e36e1d04faeaa0217eec5f061a6 GIT binary patch literal 13359 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