EasyExcel如何在一个sheet页中导出多张表以及动态表头

文章介绍了如何使用EasyExcel2.2.8版本在Java环境中,通过HttpServletResponse响应将多张表格数据导出到一个Excel文件的同一sheet页中,包括设置动态表头和处理多表格内容的方法。示例代码展示了创建表头、表内容以及如何插入多个表格的步骤,强调了无需依赖实体类的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EasyExcel如何在一个sheet页中导出多张表以及动态表头

需求说明

业务要求将多张表导出数据到一个excel中,并在同一个sheet中,效果如下图:

在这里插入图片描述
easyexcel版本:2.2.8

代码:

    /**
     * 导出
     *
     * @param response 响应
     * @throws IOException ioexception
     */
    public void export(HttpServletResponse response) throws IOException {
        String fileName = System.currentTimeMillis() + "";
        fileName = URLEncoder.encode(fileName, "UTF-8");
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("UTF-8");
        response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".xlsx");
        // 提前构建输出流
        ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();
        // 构建sheet页--表示不加表头
        WriteSheet writeSheet = EasyExcel.writerSheet("sheet").needHead(Boolean.FALSE).build();
        // 表头的数量
        int num = 0;
        // 模拟写5张表
        for (int i = 0; i < 5; i++) {
            // 获取第二行表头
            List<List<String>> contentHeader = this.buildHeader();
            // 生成第一行表头--这样两行表头长宽一致
            List<List<String>> nameHeader = contentHeader.stream().map(item -> Collections.singletonList("城市表")).collect(Collectors.toList());
            // 这里必须指定需要头,table 会继承sheet的配置,sheet配置了不需要,table 默认也是不需要
            // 第一次写入会创建头
            WriteTable writeTable0 = EasyExcel.writerTable(num).needHead(Boolean.TRUE).head(nameHeader).build();
            excelWriter.write(null, writeSheet, writeTable0);

            WriteTable writeTable1 = EasyExcel.writerTable(num + 1).needHead(Boolean.TRUE).head(contentHeader).build();
            List<List<String>> body = this.buildBody();
            excelWriter.write(body, writeSheet, writeTable1);
            // 插入两次表头加2
            num = num + 2;
        }
        excelWriter.finish();
    }

    /**
     * 模拟表头
     *
     * @return {@link List}<{@link List}<{@link String}>>
     */
    public List<List<String>> buildHeader() {
        List<List<String>> header = new ArrayList<>();
        header.add(Collections.singletonList("序号"));
        header.add(Collections.singletonList("城市"));
        header.add(Collections.singletonList("省会"));
        header.add(Collections.singletonList("得分"));
        return header;
    }

    /**
     * 模拟表内容
     *
     * @return {@link List}<{@link List}<{@link String}>>
     */
    public List<List<String>> buildBody() {
        List<List<String>> result = new ArrayList<>();
        result.add(Lists.newArrayList("1", "南京", "江苏", "100"));
        result.add(Lists.newArrayList("2", "无锡", "江苏", "100"));
        result.add(Lists.newArrayList("3", "苏州", "江苏", "100"));
        result.add(Lists.newArrayList("4", "常州", "江苏", "100"));
        // 插入一个空行
        result.add(Collections.emptyList());
        return result;
    }

这种方式适合动态表头的生成,不依靠定义实体类,使用较灵活。

欢迎指正。

EasyExcel一个阿里巴巴开源的Excel数据导入导出库,它支持多表头读写,即在一个Excel文件中包含多个工作,并且每个工作可以有自己的列标题。在处理这种结构的数据时,EasyExcel提供了高级配置功能,允许开发者通过`Sheet()`, `doRead()`, 和 `doWrite()` 方法指定对应的工作名称,以及映射头到实体类字段。通过这种方式,你可以轻松地解析和保存包含多个格的数据,简化了复杂Excel数据的操作。 例如,当你有一个Excel文件,第一张叫做"employees",第二张叫做"departments",你可以为每张创建对应的实体类,然后设置读取和写入规则: ```java // 假设员工头和实体类 Employee @Excel(sheet = "employees", name = "员工信息") public class Employee { private String name; private String departmentId; } // 部门头和实体类 Department @Excel(sheet = "departments", name = "部门信息") public class Department { private String id; private String name; } // 使用EasyExcel读取并写入数据 List<Employee> employeesList = EasyExcel.read("your_excel_file.xlsx").sheet("employees").doRead(Employee.class); List<Department> departmentsList = EasyExcel.read("your_excel_file.xlsx").sheet("departments").doRead(Department.class); // 或者将数据写回Excel EasyExcel.write("output.xlsx").sheet("employees").writeObject(employeesList).sheet("departments").writeObject(departmentsList).finish(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值