如何使用EasyExcel基于模板excel多sheet填充

在EasyExcel中,虽然fill方法通常用于基于模板填充单个sheet的数据,但你可以通过一些技巧来实现基于模板填充多sheet的数据。以下是一个基本的步骤指南,展示了如何使用EasyExcel基于模板文件填充多个sheet:

  1. 准备模板文件
    • 创建一个Excel模板文件,该文件包含多个sheet,每个sheet都有预设的格式和样式。
    • 在需要填充数据的单元格中,可以使用EasyExcel支持的占位符(例如{name}{age}等)来标记数据位置。
  2. 定义数据模型
    • 为每个sheet定义一个Java数据模型类,这些类应该与模板文件中对应sheet的列结构相匹配。
  3. 准备数据
    • 为每个sheet准备要填充的数据,这些数据可以是List集合、Map集合或其他数据结构。
  4. 使用ExcelWriter和fill方法
    • 创建一个ExcelWriter对象,并使用withTemplate方法加载模板文件。
    • 对于每个需要填充数据的sheet,创建一个WriteSheet对象(尽管在填充场景中通常不使用WriteSheet的完整功能,但你可以用它来指定sheet名)。
    • 注意:EasyExcel没有直接支持多sheet填充的API,因此你需要对每个sheet分别调用fill方法。但是,由于fill方法通常需要一个模板和数据源(通常是Map或JavaBean),并且是基于占位符来替换数据的,你需要确保模板中的占位符与数据源中的键相匹配。
    • 为了实现这一点,你可以为每个sheet创建一个单独的数据源(例如,一个Map或JavaBean实例),其中包含该sheet所需的所有数据,并且占位符与数据源中的键相匹配。
    • 然后,对每个sheet调用fill方法,并传入相应的数据源和sheet名(或WriteSheet对象,尽管在这个场景中它可能主要用于指定sheet名)。
  5. 完成写入
    • 在所有数据都填充完毕后,调用ExcelWriterfinish方法来完成写入操作。这将确保所有更改都被保存到文件中。

然而,由于EasyExcel的fill方法主要是为单个sheet设计的,并且是基于占位符来替换数据的,因此在实际操作中可能会遇到一些限制。特别是当模板文件中的sheet结构复杂或需要填充的数据类型多样时,这种方法可能会变得不太实用。

在这种情况下,你可以考虑以下替代方案:

  • 使用Apache POI:Apache POI是一个功能强大的Java库,可以用来读取和写入Microsoft Office文件,包括Excel文件。你可以使用Apache POI来加载模板文件,然后遍历每个sheet,并根据需要填充数据。虽然这种方法比使用EasyExcel的fill方法更复杂,但它提供了更高的灵活性和控制力。

  • 拆分模板和合并结果:如果模板文件中的sheet数量有限,并且每个sheet的数据填充逻辑相对独立,你可以考虑为每个sheet创建一个单独的模板文件,并使用EasyExcel的fill方法分别填充每个模板文件。然后,你可以使用Apache POI或其他工具将这些填充后的文件合并成一个单独的Excel文件。

  • 自定义实现:如果以上方法都不适合你的需求,你可以考虑自定义实现一个基于EasyExcel或Apache POI的解决方案,以满足你的特定要求。这可能涉及到编写额外的代码来解析模板文件、遍历sheet、填充数据以及保存结果。

请注意,以上建议和方法可能需要根据你的具体需求和模板文件的复杂性进行调整和修改。在选择最佳方案时,请权衡利弊并根据你的实际情况做出决策。


    public static <T, P, Q> void writeToJs(FileTmplTypeEnum templType,
                                           List<T> data1,
                                           List<P> data2,
                                           List<Q> data3,
                                           List<String> sheetNames,
                                           String fileName,
                                           HttpServletRequest req,
                                           HttpServletResponse resp) {
        try (
                ServletOutputStream os = resp.getOutputStream();
                InputStream fis = new ClassPathResource("doc/" + templType.getPath()).getInputStream();
        ) {
            setResponseHeaderLoge(fileName, req, resp);
            ExcelWriter excelWriter = EasyExcel.write(os).withTemplate(fis).build();
            WriteSheet sheet1 = EasyExcel.writerSheet(sheetNames.get(0)).build();
            excelWriter.fill(data1, sheet1);
            WriteSheet sheet2 = EasyExcel.writerSheet(sheetNames.get(1)).build();
            excelWriter.fill(data2, sheet2);
            WriteSheet sheet3 = EasyExcel.writerSheet(sheetNames.get(2)).build();
            excelWriter.fill(data3, sheet3);
            // 完成写入
            excelWriter.finish();
        } catch (Exception e) {
            log.error("the write has a exception:{} ", e);
        }
    }

填充Excel | Easy Excel 官网

EasyExcel中,使用ExcelWriter基于Excel模板填充时,可以使用注解`@ExcelProperty`来指定数据在Excel模板中的位置,并使用`@ContentRowHeight`、`@HeadRowHeight`、`@HeadStyle`、`@ContentStyle`等注解来设置单元格的样式和格式。 而对于合并单元格,可以使用`@ContentLoopMerge`注解来实现。具体步骤如下: 1.Excel模板中设置需要合并的单元格。例如,我们需要将第2列的数据按照第1列的值进行合并,则可以在第1列的单元格中设置`@ContentLoopMerge(name = "name")`注解来指定需要合并的单元格。如下所示: ``` | 姓名 | 年龄 | 性别 | |------|------|------| | A | 20 | 男 | | A | 25 | 女 | | B | 30 | 男 | | B | 35 | 女 | ``` 2.在实体类中使用`@ExcelProperty`注解来指定数据在Excel模板中的位置。同时,使用`@ContentLoopMerge(name = "name")`注解来指定需要合并的单元格。如下所示: ```java public class User { @ExcelProperty(value = "姓名", index = 0) @ContentLoopMerge(name = "name") private String name; @ExcelProperty(value = "年龄", index = 1) private Integer age; @ExcelProperty(value = "性别", index = 2) private String gender; // getter和setter方法省略 } ``` 3.在代码中使用`ExcelWriter`对象来填充数据,使用`FillConfig`对象来设置`@ContentLoopMerge`注解的参数。如下所示: ```java // 加载Excel模板 InputStream templateInputStream = new FileInputStream("template.xlsx"); Template template = TemplateUtil.loadTemplate(templateInputStream); // 创建ExcelWriter对象 ExcelWriter writer = EasyExcel.write(outputStream).withTemplate(template).build(); // 设置FillConfig对象 FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); // 填充数据 List<User> userList = getUserList(); writer.fill(userList, fillConfig, new Sheet(0)); // 关闭ExcelWriter对象 writer.finish(); ``` 在上面的示例中,我们首先加载Excel模板,然后创建`ExcelWriter`对象,设置`FillConfig`对象并填充数据。其中,`forceNewRow`参数表示是否强制创建新的行,`Sheet`对象表示填充数据的Sheet页。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值