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. 条件样式:根据数据值动态设置单元格样式

相关推荐
yyxx4121239 小时前
上海企业如何选择专业的钉钉服务商
java·大数据·人工智能·钉钉
jay神9 小时前
基于 FastAPI + Vue 的宠物领养管理系统
前端·vue.js·python·毕业设计·fastapi·宠物
一杯奶茶¥9 小时前
水果销售网站 CRM客户信息管理系统 超市管理系 酒店管理系统 健身房管理系统 在线音乐网站 校园招聘系统
java·vue.js·spring boot·mysql·spring·java项目
lichenyang4539 小时前
鸿蒙 Web 容器(五·完结):闭环回传、容器治理,兼谈 AtomicServiceEnhancedWeb
前端
lichenyang4539 小时前
鸿蒙 Web 容器(四):ArkTS 拿到请求后,怎么「按 action 找能力」?
前端
重生之后端学习9 小时前
Java入门
java·开发语言·职场和发展
碧海蓝天20229 小时前
C++法则24:在标准 C++ 中,没有任何可移植的方式判断指针 T* pt 指向的内存位置是否已经 构造了对象,程序员必须手动跟踪哪些元素已构造。
java·开发语言·c++
lichenyang4539 小时前
鸿蒙 Web 容器(三):H5 怎么「调」到 ArkTS?
前端
代码不加糖9 小时前
Proxy能够监听到对象中的对象的引用吗?
开发语言·前端·javascript
光影少年9 小时前
react 原理与进阶
前端·react.js·掘金·金石计划