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

相关推荐
程序员Agions6 小时前
useMemo、useCallback、React.memo,可能真的要删了
前端·react.js
echoVic6 小时前
AI Agent 安全权限设计:blade-code 的 5 种权限模式与三级控制
java·javascript
PPPPickup6 小时前
easymall---图片上传以及图片展示
java
滕青山6 小时前
Vue项目BMI计算器技术实现
前端·vue.js
历程里程碑6 小时前
Linux 库
java·linux·运维·服务器·数据结构·c++·算法
Wpa.wk6 小时前
接口自动化 - 接口鉴权处理常用方法
java·运维·测试工具·自动化·接口自动化
子兮曰6 小时前
深入浏览器指纹:Canvas、WebGL、Audio是如何暴露你的身份的?
前端·浏览器·canvas
Pluchon7 小时前
硅基计划4.0 简单模拟实现AVL树&红黑树
java·数据结构·算法
月亮补丁7 小时前
AntiGravity只能生成 1:1 图片?一招破解尺寸限制
前端
2501_916008897 小时前
深入解析iOS机审4.3原理与混淆实战方法
android·java·开发语言·ios·小程序·uni-app·iphone