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

相关推荐
牧小七2 分钟前
java14的新特性
java
努力努力再努力wz1 小时前
【Linux网络系列】:JSON+HTTP,用C++手搓一个web计算器服务器!
java·linux·运维·服务器·c语言·数据结构·c++
魂梦翩跹如雨1 小时前
死磕排序算法:手撕快速排序的四种姿势(Hoare、挖坑、前后指针 + 非递归)
java·数据结构·算法
带刺的坐椅8 小时前
Solon AI Skills 会是 Agent 的未来吗?
java·agent·langchain4j·solon-ai
jacGJ8 小时前
记录学习--文件读写
java·前端·学习
毕设源码-赖学姐9 小时前
【开题答辩全过程】以 基于WEB的实验室开放式管理系统的设计与实现为例,包含答辩的问题和答案
前端
幻云20109 小时前
Python深度学习:从筑基到登仙
前端·javascript·vue.js·人工智能·python
花间相见9 小时前
【JAVA开发】—— Nginx服务器
java·开发语言·nginx
扶苏-su9 小时前
Java---Properties 类
java·开发语言
cypking9 小时前
四、CRUD操作指南
java