方案简介
为了通过 EasyExcel 实现动态表头重命名,可以封装一个方法,传入动态的新表头名称列表(List<String>
),并结合 WriteHandler
接口来重命名表头。同时,通过 EasyExcel 将数据直接写入到输出流。

Powered by Moshow@https://zhengkai.blog.csdn.net/
核心实现说明
-
动态表头处理器 :通过
DynamicHeaderWriteHandler
的构造方法接收表头列表,并在写入表头之前动态设置表头内容。 -
封装写入方法 :
ExcelExportUtil
提供通用的导出方法,可以根据表头和数据生成 Excel 文件并写入到输出流。 -
直接写入输出流 :通过
HttpServletResponse
将文件直接导出为响应内容,方便前端下载。
具体实现
1. 自定义动态表头处理器
我们实现一个动态表头处理器,将新表头通过构造方法传入。
java
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.handler.AbstractCellWriteHandler;
import org.apache.poi.ss.usermodel.Cell;
import java.util.List;
public class DynamicHeaderWriteHandler extends AbstractCellWriteHandler {
private final List<String> newHeaders;
// 构造方法传入动态表头列表
public DynamicHeaderWriteHandler(List<String> newHeaders) {
this.newHeaders = newHeaders;
}
@Override
public void beforeCellCreate(org.apache.poi.ss.usermodel.Workbook workbook,
org.apache.poi.ss.usermodel.Sheet sheet,
org.apache.poi.ss.usermodel.Row row,
Head head,
Integer columnIndex,
Boolean isHead) {
//Powered by Moshow@https://zhengkai.blog.csdn.net/
if (Boolean.TRUE.equals(isHead) && columnIndex < newHeaders.size()) {
// 动态设置表头名称
head.setHeadNameList(List.of(newHeaders.get(columnIndex)));
}
}
}
2. 封装写入方法
创建一个封装的方法,支持通过传入表头和数据,将结果直接输出到流中。
java
java
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.metadata.WriteSheet;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
public class ExcelExportUtil {
/**
* 导出 Excel 表格
*
* @param response HttpServletResponse 响应
* @param data 数据列表
* @param headers 动态表头
* @param fileName 文件名
* @author Powered by Moshow@https://zhengkai.blog.csdn.net/
*/
public static void exportExcel(HttpServletResponse response, List<?> data, List<String> headers, String fileName) throws IOException {
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
// 创建动态表头处理器
DynamicHeaderWriteHandler headerHandler = new DynamicHeaderWriteHandler(headers);
// 写入数据到输出流
EasyExcel.write(response.getOutputStream())
.registerWriteHandler(headerHandler)
.head((Class<?>) data.get(0).getClass()) // 假设数据类已经标注了 @ExcelProperty
.sheet("Sheet1")
.doWrite(data);
}
}
3. 使用方法示例
在 Controller 中调用封装好的方法,传入动态表头和数据。
java
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@RestController
public class ExcelExportController {
@GetMapping("/export")
public void export(HttpServletResponse response) throws IOException {
//Powered by Moshow@https://zhengkai.blog.csdn.net/
// 模拟数据
List<SampleData> data = new ArrayList<>();
data.add(new SampleData("张三", 25, "北京"));
data.add(new SampleData("李四", 30, "上海"));
// 动态表头
List<String> headers = List.of("姓名(新)", "年龄(新)", "地址(新)");
// 导出 Excel
ExcelExportUtil.exportExcel(response, data, headers, "示例文件");
}
// 数据类
public static class SampleData {
private String name;
private Integer age;
private String address;
public SampleData(String name, Integer age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
// Getters 和 Setters 省略
}
}
通过这种方式,你可以灵活设置动态表头,并实现直接导出到客户端的功能。