当前位置: 首页 > news >正文

SpringBoot3+EasyExcel通过WriteHandler动态实现表头重命名

方案简介

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

Powered by Moshow@https://zhengkai.blog.csdn.net/

核心实现说明

  1. 动态表头处理器:通过 DynamicHeaderWriteHandler 的构造方法接收表头列表,并在写入表头之前动态设置表头内容。

  2. 封装写入方法ExcelExportUtil 提供通用的导出方法,可以根据表头和数据生成 Excel 文件并写入到输出流。

  3. 直接写入输出流:通过 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. 封装写入方法

创建一个封装的方法,支持通过传入表头和数据,将结果直接输出到流中。

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 中调用封装好的方法,传入动态表头和数据。

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 省略
    }
}

通过这种方式,你可以灵活设置动态表头,并实现直接导出到客户端的功能。


文章转载自:
http://capsicum.hyyxsc.cn
http://afs.hyyxsc.cn
http://authorization.hyyxsc.cn
http://bioelectric.hyyxsc.cn
http://alphabet.hyyxsc.cn
http://backhanded.hyyxsc.cn
http://boldly.hyyxsc.cn
http://biologic.hyyxsc.cn
http://ahvaz.hyyxsc.cn
http://benignancy.hyyxsc.cn
http://battik.hyyxsc.cn
http://adversary.hyyxsc.cn
http://alcoranist.hyyxsc.cn
http://androcentric.hyyxsc.cn
http://cetological.hyyxsc.cn
http://buffoonery.hyyxsc.cn
http://befall.hyyxsc.cn
http://appositely.hyyxsc.cn
http://chambermaid.hyyxsc.cn
http://alcheringa.hyyxsc.cn
http://brabanconne.hyyxsc.cn
http://americanologist.hyyxsc.cn
http://aline.hyyxsc.cn
http://capsicum.hyyxsc.cn
http://ashtray.hyyxsc.cn
http://ballflower.hyyxsc.cn
http://camisole.hyyxsc.cn
http://based.hyyxsc.cn
http://backseat.hyyxsc.cn
http://assent.hyyxsc.cn
http://www.dtcms.com/a/100596.html

相关文章:

  • DAY 31 leetcode 142--链表.环形链表
  • java容器
  • 如何在不同的分辨率均能显示出清晰的字体?
  • 创作领域“<em >足</em><em>球</em><em>彩</em><em>票</em><em>计</em><em>划
  • 设计模式分类与定义(高软55)
  • xtuner微调大模型教程
  • SkyWalking+Springboot实战
  • 自定义C语言变量转换库
  • P1090合并果子(优先队列)
  • Vue3 其它API toRow和markRow
  • nacos 3.x Java SDK 使用详解
  • 【COMSOL】参数化建模以及通过MATLAB运行
  • qml中的Connections用法
  • Android Gradle 下载插件或依赖太慢
  • ansible主机清单文件以及ansible常用模块
  • 软考中级-软件设计师信息安全模块考点解析
  • docker 镜像下载的另一种方式
  • 简易指南“<em >快</em><em>3</em><em>倍</em><em>投</em><em>规</em><em>划
  • C++第13届蓝桥杯省b组习题笔记
  • 自动化工作流工具的综合对比与推荐
  • 自定义类型:结构体(1)
  • 在 Qt 创建项目时,Qt Quick Application (Compat) 和 Qt Quick Application
  • 5种特效融合愚人节搞怪病毒
  • 深入解析C#中的解释器模式:原理与应用
  • C语言:多线程
  • 《Python实战进阶》第39集:模型部署——TensorFlow Serving 与 ONNX
  • C--操作符
  • AI人工智能-PyCharm的介绍安装应用
  • Vue学习笔记集--defineExpose
  • CSP-J 2019 入门级 第一轮(初赛) 完善程序(2)