SpringBoot3整合EasyExcel动态实现表头重命名

 更新时间:2025年03月31日 11:04:41   作者:Moshow郑锴  
这篇文章主要为大家详细介绍了SpringBoot3整合EasyExcel如何通过WriteHandler动态实现表头重命名,文中的示例代码讲解详细,有需要的可以了解下

方案简介

为了通过 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表头重命名内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JUC中的wait与notify方法实现原理详解

    JUC中的wait与notify方法实现原理详解

    这篇文章主要介绍了JUC中的wait与notify方法实现原理,在进行wait()之前,就代表着需要争夺Synchorized,而Synchronized代码块通过javap生成的字节码中包含monitor enter和monitor exit两个指令
    2023-03-03
  • 30分钟入门Java8之lambda表达式学习

    30分钟入门Java8之lambda表达式学习

    本篇文章主要介绍了30分钟入门Java8之lambda表达式学习,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • Spring IOC推导与DI构造器注入超详细讲解

    Spring IOC推导与DI构造器注入超详细讲解

    这篇文章主要介绍了Spring IOC推导与DI构造器注入,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-02-02
  • 详解Java类加载器与双亲委派机制

    详解Java类加载器与双亲委派机制

    这篇文章主要为大家介绍一下Java中的类加载器与双亲委派机制,文中通过示例为大家进行了详细的介绍,对我们学习Java有一定帮助,需要的可以参考一下
    2022-08-08
  • 浅析spring定时器的使用

    浅析spring定时器的使用

    这篇文章主要介绍了浅析spring定时器的使用,帮助大家更好的理解和学习spring框架,感兴趣的朋友可以了解下
    2020-10-10
  • Mapper类中存在名称相同的方法重载报错问题

    Mapper类中存在名称相同的方法重载报错问题

    这篇文章主要介绍了Mapper类中存在名称相同的方法重载报错问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Java使用正则表达式验证用户名和密码的方法

    Java使用正则表达式验证用户名和密码的方法

    这篇文章主要介绍了Java使用正则表达式验证用户名和密码的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • 如何将二进制文件流转化为MockMultipartFile文件

    如何将二进制文件流转化为MockMultipartFile文件

    文章主要介绍了如何使用Spring框架中的MockMultipartFile类来模拟文件上传,并处理上传逻辑,包括获取二进制文件流、创建MockMultipartFile对象、处理上传逻辑和返回响应,还解释了MockMultipartFile的功能和二进制文件流的定义
    2025-02-02
  • spring依赖注入原理与用法实例分析

    spring依赖注入原理与用法实例分析

    这篇文章主要介绍了spring依赖注入原理与用法,结合实例形式分析了spring框架依赖注入的概念、原理、用法案例及相关操作注意事项,需要的朋友可以参考下
    2019-10-10
  • Spring中基于xml配置管理Bean的步骤

    Spring中基于xml配置管理Bean的步骤

    Spring容器通常理解为BeanFactory或者ApplicationContext,我们知道spring的IOC容器能够帮我们创建对象,对象交给spring管理之后我们就不用手动去new对象,这篇文章主要介绍了Spring中基于xml配置管理Bean的步骤,需要的朋友可以参考下
    2023-11-11

最新评论