多级表头的导出

问题背景:

需要动态的生成自定义的多级表头

解决:

如果是表头能够一开始定义好的,那么使用easyexcl官网中的快速开始->写excl->复杂头写入就可以了,只需要一开始定义一个excel对应的实体对象,文档链接如下:https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write#%E5%A4%8D%E6%9D%82%E5%A4%B4%E5%86%99%E5%85%A5

但是我这里的需求,表头不是固定的,要动态生生成,解决代码如下:

表头代码

创建多级表头并合并空白行。

easyexcl默认的合并规则是:相邻的行或列如果同名就会合并,这个可以自己写自定义规则,我这里需求已经满足了。有的列是两行,有的列是三行甚至更多,我这里的解决方法是先找出表头的最高层级,对每一列的数据,追加同名行到最高层级,这样就实现了合并单元格。

注意:顺序很重要

List<List<String>> head;
head.add(fillHraderList(Arrays.asList("上月门店执行情况", "铺货门店标记"), maxLevel));
head.add(fillHraderList(Arrays.asList("上月门店执行情况", "冰冻化", "我司冰柜", "陈列规格"), maxLevel));
head.add(fillHraderList(Arrays.asList("上月门店执行情况", "冰冻化", "我司冰柜", "费用"), maxLevel));
head.add(fillHraderList(Arrays.asList("上月门店执行情况", "冰冻化", "非自有冰柜", "陈列规格"), maxLevel));
head.add(fillHraderList(Arrays.asList("上月门店执行情况", "冰冻化", "非自有冰柜", "陈列位置"), maxLevel));
head.add(fillHraderList(Arrays.asList("上月门店执行情况", "冰冻化", "非自有冰柜", "费用"), maxLevel));

private List<String> fillHraderList(List<String> list, int maxLevel) {
    List<String> result = new ArrayList<>(list);
    String lastElement = list.get(list.size() - 1);
    while (result.size() < maxLevel) {
        result.add(lastElement);
    }
    return result;
}

效果图:

表体数据填充代码

注意:顺序很重要,完全是根据列的顺序填充对应的值

// Map的key、value对应列下标,列值
List<Map<Integer, String>> dataList;

dataList.forEach(data -> {
    // 判断列是否有值
    if (columnMap.containsKey(refBusinessPlanTemplateColumn)) {
        data.put(columnMap.get(refBusinessPlanTemplateColumn), item.getColumnValue());
    }else{
        data.put(columnMap.get(refBusinessPlanTemplateColumn),"");
    }             
});

// 写入excl
ByteArrayOutputStream excelOut = new ByteArrayOutputStream();
ExcelWriter excelWriter = EasyExcel.write().file(excelOut).build();
WriteSheet writeSheet0 = EasyExcel.writerSheet(0).head(head).build();
excelWriter.write(dataList, writeSheet0);
excelWriter.finish();
### 导出多级表头 Excel 文件 Hutool 提供了强大的功能来导出具有复杂结构的 Excel 文件,包括支持多级表头。通过 `ExcelWriter` 类和自定义注解,可以轻松实现这一目标。 #### 实现步骤 1. **定义数据模型** 使用自定义类表示需要导出的数据,并通过 `@Header` 注解定义每一列的标题。如果需要多级表头,可以在字段上使用嵌套的 `@Header` 注解或直接构造表头信息。 2. **构造多级表头** Hutool 的 `ExcelWriter` 支持通过 `setHeaderAlias` 方法设置表头别名,或者通过 `addHeaderAlias` 方法动态添加多级表头。 3. **导出数据** 使用 `ExcelWriter` 将数据写入 Excel 文件,并支持大数据量导出。 #### 示例代码 以下是一个完整的示例,展示如何使用 Hutool 导出具有多级表头的 Excel 文件: ```java import cn.hutool.poi.excel.ExcelUtil; import cn.hutool.poi.excel.ExcelWriter; import lombok.Data; import java.io.File; import java.util.ArrayList; import java.util.List; /** * 多级表头导出示例 */ public class MultiLevelHeaderExport { /** * 数据模型类 */ @Data public static class DataModel { private String name; private int age; private double score; } public static void main(String[] args) { // 创建 ExcelWriter 对象 File file = new File("./multi_level_header.xlsx"); ExcelWriter excelWriter = ExcelUtil.getWriter(file); // 定义多级表头 List<List<String>> headers = new ArrayList<>(); headers.add(List.of("基本信息", "姓名")); headers.add(List.of("基本信息", "年龄")); headers.add(List.of("成绩信息", "分数")); // 添加多级表头到 ExcelWriter excelWriter.setHeaders(headers); // 准备数据 List<DataModel> dataList = new ArrayList<>(); dataList.add(new DataModel("张三", 20, 85.5)); dataList.add(new DataModel("李四", 22, 90.0)); dataList.add(new DataModel("王五", 21, 78.0)); // 写入数据 excelWriter.write(dataList); // 关闭资源 excelWriter.close(); } } ``` #### 说明 - **多级表头定义**:通过 `List<List<String>>` 结构定义多级表头,外层 `List` 表示行,内层 `List` 表示每一列的层级。 - **写入数据**:将数据列表写入 Excel 文件时,Hutool 会自动根据定义的多级表头进行格式化输出。 - **关闭资源**:在完成操作后,务必调用 `close()` 方法释放资源。 通过上述方法,可以灵活地处理复杂的表头结构,并支持大规模数据导出[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值