EasyExcel根据动态字段,进行导出excel文件

在Java中使用EasyExcel实现动态字段导出Excel,可以通过以下步骤实现:

1. 添加依赖

XML 复制代码
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.3.2</version>
</dependency>

2. 核心实现代码

java 复制代码
import com.alibaba.excel.EasyExcel;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {
    public static void main(String[] args) throws IOException {
        // 模拟数据
        List<Map<String, Object>> data = new ArrayList<>();
        Map<String, Object> map1 = new HashMap<>();
        map1.put("姓名", "张三");
        map1.put("年龄", 25);
        map1.put("部门", "技术部");
        data.add(map1);

        Map<String, Object> map2 = new HashMap<>();
        map2.put("姓名", "李四");
        map2.put("年龄", 30);
        map2.put("部门", "市场部");
        data.add(map2);

        // 指定导出字段
        List<String> headers = Arrays.asList("姓名", "年龄", "部门");

        // 导出到文件
        try (FileOutputStream out = new FileOutputStream("D://export.xlsx")) {
            exportExcel(out, headers, data);
        }

        // 多级表头
        List<List<String>> multiHeaders = new ArrayList<>();
        multiHeaders.add(Arrays.asList("基本信息", "姓名"));
        multiHeaders.add(Arrays.asList("基本信息", "年龄"));
        multiHeaders.add(Arrays.asList("基本信息", "部门"));

        // 导出到文件
        try (FileOutputStream out = new FileOutputStream("D://multiExport.xlsx")) {
            multiExportExcel(out, multiHeaders, data);
        }

    }

    public static void exportExcel(OutputStream out, List<String> headers, List<Map<String, Object>> data) {
        // 1. 动态创建表头
        List<List<String>> dynamicHeaders = new ArrayList<>();
        for (String header : headers) {
            List<String> row = new ArrayList<>();
            row.add(header);
            dynamicHeaders.add(row);
        }

        // 2. 构建数据转换器(将Map转为List)
        List<List<Object>> excelData = new ArrayList<>();
        for (Map<String, Object> map : data) {
            List<Object> row = new ArrayList<>();
            for (String header : headers) {
                row.add(map.getOrDefault(header, ""));
            }
            excelData.add(row);
        }

        // 3. 写入Excel
        EasyExcel.write(out)
                .head(dynamicHeaders)
                .sheet("Sheet1")
                .doWrite(excelData);
    }

    public static void multiExportExcel(OutputStream out, List<List<String>> multiHeaders, List<Map<String, Object>> data) {
        // 1. 获取表头最后一个元素作为列名
        List<String> headers = new ArrayList<>();
        for (List<String> header : multiHeaders) {
            headers.add(header.get(header.size() - 1));
        }

        // 2. 构建数据转换器(将Map转为List)
        List<List<Object>> excelData = new ArrayList<>();
        for (Map<String, Object> map : data) {
            List<Object> row = new ArrayList<>();
            for (String header : headers) {
                row.add(map.getOrDefault(header, ""));
            }
            excelData.add(row);
        }

        // 3. 写入Excel
        EasyExcel.write(out)
                .head(multiHeaders)
                .sheet("Sheet1")
                .doWrite(excelData);
    }
}

3.导出结果

单级表头:

多级表头:

关键点说明:

扩展功能:

此方案支持任意字段顺序导出,且不需要预先定义实体类,适合需要动态控制导出字段的场景。

  1. 动态表头 :通过List<List<String>>构建动态表头,支持多级表头

  2. 数据转换:将Map数据转换为List<List>格式

  3. 样式控制

    • 表头使用蓝色背景+加粗字体
    • 内容使用普通样式
    • 自动调整列宽
  4. 异常处理

    • 数据不存在时返回空字符串
    • 确保字段顺序与传入的headers一致
    1. 多级表头 :修改表头结构为List<List<String>>,例如:

      java 复制代码
      List<List<String>> multiHeaders = new ArrayList<>();
      multiHeaders.add(Arrays.asList("基本信息", "姓名"));
      multiHeaders.add(Arrays.asList("基本信息", "年龄"));
      multiHeaders.add(Arrays.asList("基本信息", "部门"));
    2. 数据格式化 :实现Converter接口自定义数据格式

    3. 合并单元格 :通过WriteHandler实现复杂合并逻辑

    4. 条件样式:根据数据值动态设置单元格样式

相关推荐
q行2 小时前
java学习日志--内部类
java·学习·内部类
资生算法程序员_畅想家_剑魔2 小时前
Java常见技术分享-21-多线程安全-进阶模块-并发集合与线程池-ForkJoinPool
java·开发语言
a努力。2 小时前
哈罗骑行Java面试被问:Redis的持久化策略对比
java·redis·面试
C_心欲无痕2 小时前
react - useReducer复杂状态管理
前端·javascript·react.js
杰瑞不懂代码2 小时前
结合os模块和shutil模块实现本地文件自动化操作
android·java·自动化·办公自动化·shutil·os
AI前端老薛2 小时前
面试:React虚拟DOM是什么?解决了哪些问题?
前端·react.js
松涛和鸣2 小时前
42、SQLite3 :字典入库与数据查询
linux·前端·网络·数据库·udp·sqlite
进阶的猿猴2 小时前
easyExcel实现下拉单选框和(变相的下拉多选框)
java
Ccuno2 小时前
Java 核心类库与数据结构
java·深度学习