alibaba / easyexcel

快速、简洁、解决大文件内存溢出的java处理Excel工具
https://easyexcel.opensource.alibaba.com
Apache License 2.0
31.99k stars 7.5k forks source link

模板填充,多sheet,使用同一个 list 对象,每一个 sheet 表头不一样,如何填充? #3645

Open LiJunYi2 opened 8 months ago

LiJunYi2 commented 8 months ago

建议先去看文档

快速开始常见问题

异常代码

for (int i = 0; i < sheetNames.size(); i++) {
            try (ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build()) {
                WriteSheet writeSheet = EasyExcel.writerSheet(i,sheetNames.get(i)).build();
                // 直接写入数据
                excelWriter.fill(userModels, writeSheet);
            }
}

异常提示

无异常

问题描述

需求是,有一个excel模版,模版中有多个 sheet,每个 sheet 中的表头不一样,但是都是同个对象的属性。 例如:user对象有id name,sex,age属性,sheet1 表头是 id ,name;sheet2表头是id,sex;sheet3 表头为id,age; 现在根据文档重复多次写入写到单个或者多个sheet 来操作,上述情况下,不能将数据准确完整的填充。但是如果我将 sheet2-3删除,分别填充又是可以的。请问是不支持这种填充方式还是我哪里需要进行修改?谢谢~

ljluestc commented 3 months ago
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import lombok.Data;

import java.util.ArrayList;
import java.util.List;

public class MultiSheetFillExample {

    @Data
    public static class User {
        private Long id;
        private String name;
        private String sex;
        private Integer age;
    }

    @Data
    public static class UserSheet1 {
        private Long id;
        private String name;
    }

    @Data
    public static class UserSheet2 {
        private Long id;
        private String sex;
    }

    @Data
    public static class UserSheet3 {
        private Long id;
        private Integer age;
    }

    public static void main(String[] args) {
        String fileName = "multi_sheet_fill.xlsx";
        String templateFileName = "template.xlsx";

        // 模拟数据
        List<User> userList = new ArrayList<>();
        userList.add(new User(1L, "Alice", "Female", 20));
        userList.add(new User(2L, "Bob", "Male", 25));

        // 转换为不同的 sheet 数据
        List<UserSheet1> userSheet1List = new ArrayList<>();
        List<UserSheet2> userSheet2List = new ArrayList<>();
        List<UserSheet3> userSheet3List = new ArrayList<>();

        for (User user : userList) {
            UserSheet1 userSheet1 = new UserSheet1();
            userSheet1.setId(user.getId());
            userSheet1.setName(user.getName());
            userSheet1List.add(userSheet1);

            UserSheet2 userSheet2 = new UserSheet2();
            userSheet2.setId(user.getId());
            userSheet2.setSex(user.getSex());
            userSheet2List.add(userSheet2);

            UserSheet3 userSheet3 = new UserSheet3();
            userSheet3.setId(user.getId());
            userSheet3.setAge(user.getAge());
            userSheet3List.add(userSheet3);
        }

        try (ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build()) {
            WriteSheet writeSheet1 = EasyExcel.writerSheet(0, "Sheet1").head(UserSheet1.class).build();
            WriteSheet writeSheet2 = EasyExcel.writerSheet(1, "Sheet2").head(UserSheet2.class).build();
            WriteSheet writeSheet3 = EasyExcel.writerSheet(2, "Sheet3").head(UserSheet3.class).build();

            // 填充不同的 sheet
            excelWriter.fill(userSheet1List, writeSheet1);
            excelWriter.fill(userSheet2List, writeSheet2);
            excelWriter.fill(userSheet3List, writeSheet3);
        }
    }
}