在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.导出结果
单级表头:

多级表头:

关键点说明:
扩展功能:
此方案支持任意字段顺序导出,且不需要预先定义实体类,适合需要动态控制导出字段的场景。
-
动态表头 :通过
List<List<String>>构建动态表头,支持多级表头 -
数据转换:将Map数据转换为List<List>格式
-
样式控制 :
- 表头使用蓝色背景+加粗字体
- 内容使用普通样式
- 自动调整列宽
-
异常处理 :
- 数据不存在时返回空字符串
- 确保字段顺序与传入的headers一致
-
多级表头 :修改表头结构为
List<List<String>>,例如:javaList<List<String>> multiHeaders = new ArrayList<>(); multiHeaders.add(Arrays.asList("基本信息", "姓名")); multiHeaders.add(Arrays.asList("基本信息", "年龄")); multiHeaders.add(Arrays.asList("基本信息", "部门")); -
数据格式化 :实现
Converter接口自定义数据格式 -
合并单元格 :通过
WriteHandler实现复杂合并逻辑 -
条件样式:根据数据值动态设置单元格样式