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

核心实现说明
动态表头处理器:通过 dynamicheaderwritehandler 的构造方法接收表头列表,并在写入表头之前动态设置表头内容。
封装写入方法:excelexportutil 提供通用的导出方法,可以根据表头和数据生成 excel 文件并写入到输出流。
直接写入输出流:通过 httpservletresponse 将文件直接导出为响应内容,方便前端下载。
具体实现
1. 自定义动态表头处理器
我们实现一个动态表头处理器,将新表头通过构造方法传入。
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. 封装写入方法
创建一个封装的方法,支持通过传入表头和数据,将结果直接输出到流中。
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 中调用封装好的方法,传入动态表头和数据。
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 省略
}
}
通过这种方式,你可以灵活设置动态表头,并实现直接导出到客户端的功能。
到此这篇关于springboot3整合easyexcel动态实现表头重命名的文章就介绍到这了,更多相关springboot easyexcel表头重命名内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论