EasyExcel导出图片并实现动态表头、自动合并单元格、给指定单元格设置值

概要描述 

  1. 最近工作中涉及到使用Excel导出图片的需求,下面对使用Excel导出图片遇到的一些问题进行记录说明。需求通过 EasyExcel中提供的转换器(Converter)和拦截器(Handler)实现。EasyExcel 官网地址
  2. 实现效果

实现过程

EasyExcel 支持导出 ByteArrayFileStringInputStreamURL 五种类型的图片。项目中图片字段使用的是InputStream,由前端传入图片,因此本文将介绍导出  InputStream 类型图片的实现过程。

实现过程主要关键步骤:

  1. 自定义拦截器(实现 CellWriteHandler 接口):阻止 EasyExcel 默认的图片导出操作,使用 Apache POI 库向 Excel 表格中手动写入图片。
  2. 在自定义拦截器中重写beforeCellCreate方法实现动态表头赋值。
  3. 在自定义拦截器中重写afterCellDataConverted方法解决EasyExcel 中阻止默认的图片导出操作。
  4. 在自定义拦截器中重写afterCellDispose方法写入图片,并在指定的单元格设置值。

   

  •  引入依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.3.4</version>
</dependency>
  • 定义前端传入实体类 

@Data
public class ProjectGanttExportReqVO implements Serializable {
    @Schema(description = "文件附件", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "文件附件不能为空")
    @JSONField(serialize = false)
    private MultipartFile file;

    @Schema(description = "项目信息Id", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "项目信息Id不能为空")
    private Long projectId;

    @Schema(description = "图片的高度", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "图片高度不能为空")
    private Integer height;

    @Schema(description = "图片宽度", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "图片宽度不能为空")
    private Integer width;
}
  • 定义导出的实体类

@Data
public class ProjectGanttExportVO implements Serializable {
    @ExcelProperty(value = {"${projectName}"})
    @ColumnWidth(15)
    private InputStream fileInputStream;

    @ExcelIgnore
    private String projectName; // 动态表头-项目名称

    @ExcelIgnore
    private Integer height;  // 图片的高度

    @ExcelIgnore
    private Integer width;  // 图片的宽度

    @ExcelIgnore
    private String lineConstructionScaleHead = "线路建设规模:"; //线路建设规模

    @ExcelIgnore
    private String lineConstructionScale; // 线路建设规模内容描述

    @ExcelIgnore
    private String substationConstructionScaleHead = "变电建设规模:"; // 变电建设规模

    @ExcelIgnore
    private String substationConstructionScale; //变电建设规模内容描述

    @ExcelIgnore
    private String designDeptNameHead = "设计单位:"; // 设计单位表头

    @ExcelIgnore
    private String designDeptName; // 设计单位名称

    @ExcelIgnore
    private String eiaDeptNameHead = "环评编制单位:"; //环评编制单位表头

    @ExcelIgnore
    private String eiaDeptName; // 环评编制单位

    @ExcelIgnore
    private String waterConservationDeptNameHead = "水保编制单位:"; //水保编制单位表头

    @ExcelIgnore
    private String waterConservationDeptName; //水保编制单位

    @ExcelIgnore
    private String approvalDeptNameHead = "核准编制单位:"; // 核准编制单位表头

    @ExcelIgnore
    private String approvalDeptName; // 核准编制单位

    @ExcelIgnore
    private String linKanDeptNameHead = "林勘编制单位:"; // 林勘编制单位表头

    @ExcelIgnore
    private String linKanDeptName; // 林勘编制单位

    @ExcelIgnore
    private String orePressingDeptNameHead = "压矿编制单位:"; // 压矿编制单位表头

    @ExcelIgnore
    private String orePressingDeptName; // 压矿编制单位

    @ExcelIgnore
    private String landDeptNameHead = "土地编制单位:"; // 土地编制单位表头

    @ExcelIgnore
    private String landDeptName; // 土地编制单位

    @ExcelIgnore
    private String roadDeptNameHead = "施工单位:"; // 施工单位表头

    @ExcelIgnore
    private String roadDeptName; // 施工单位

    @ExcelIgnore
    private String supervisorDeptNameHead = "监理单位:"; // 监理单位表头

    @ExcelIgnore
    private String supervisorDeptName; // 监理单位


}
  • 定义单元格合并属性实体类

/**
 * 单元格合并属性定义

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/562115.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件缺陷和测试用例

软件缺陷 软件缺陷概念 Bug有时也被泛指因软件产品内部的缺陷引起的软件产品最终运行时和预期属性的偏离。 产生原因 1.需求不明确2.软件结构复杂3.编码问题4.项目期限短5.使用新技术 类型 错误、遗漏、额外实现 准则 Correct&#xff08;准确&#xff09;&#xff1a;…

一堆喷儿香喷儿香的工具网站-已经收藏-搜嗖工具箱!

文心一言 https://yiyan.baidu.com/ ​ ChatGpt横空出世的横空出世好像一把钥匙&#xff0c;开启了大模型时代&#xff0c;国内也有不错的产品&#xff0c;比如百度的文心一言&#xff0c;从3.5到4.0看得见的成长&#xff0c;现在的文心一言是我们工作中不可缺少的好帮手&am…

基于单片机的智能病床呼叫系统设计与仿真

摘 要 本文设计的病床呼叫系统采用单片机作为控制器。该系统具有远程控制、病人的身体情况检测、报警呼叫、显示和执行器运动的功能。远程控制由红外线传感器和矩阵键盘组成&#xff0c;检测电路由温湿度传感器DH22、心率传感器Pulse Sensor、压力传感器MPX4115组成&#x…

uniapp 如何区分目前运行环境(app、web、mp-weixin)

platform 区分 iOS、Android uniplatform 区分 app、web、mp-weixin ....

JavaEE 初阶篇-深入了解 File 文件操作(实现文件搜索、非空文件夹删除)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 File 文件概述 2.0 创建 File 类对象的方法 2.1 判断文件类型、获取文件信息的方法 2.2 创建文件、删除文件的方法 2.3 遍历文件夹的方法 3.0 文件搜索与删除 3.1…

学习笔记<2024.4.15-2024.4.21>:Attention Is All You Need

Transformer中Self-Attention以及Multi-Head Attention详解 (https://www.bilibili.com/video/BV15v411W78M/?spm_id_from333.337.search-card.all.click&vd_sourcef32decb03075b4a1833fe5c47c11ba94)

在线拍卖系统,基于SpringBoot+Vue+MySql开发的在线拍卖系统设计和实现

目录 一. 系统介绍 二. 功能模块 2.1. 管理员功能模块 2.2. 用户功能模块 2.3. 前台首页功能模块 2.4. 部分代码实现 一. 系统介绍 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系…

Axure琐碎细节

文章目录 琐碎细节注释预览编写原型图的时候可以把颜色改为灰色标尺竖直文字左对齐Axure中的文字怎么添加元件层级问题如何找到各种各样的形状&#xff0c;比如三角形了 五角星了 十字架了给按钮设置简单的交互动作通过锁来等比例缩放 琐碎细节 注释 有时候我们需要给我们的元…

windows驱动开发-WDM框架(一)

在前面的文章中解释过&#xff0c;NT5.0之后windows确定了新的架构Windows Driver Model (WDM)&#xff0c;在Vista之后又推出了Windows Driver Framework(WDF)&#xff0c;这两个都属于驱动程序框架&#xff0c;那么它们的之间的关系是怎样的&#xff1f; WDF是对WDM进行的封…

Linux--基础IO(上)

目录 1. 文件的边角知识 1.1 文件是什么&#xff1f; 1.2 文件是怎么打开的&#xff1f; 1.3 进程与文件 进程与文件的关系 2. 重温c语言文件接口 2.1 打开文件的方式 2.2 读写文件接口的重温 2.2.1 写文件 2.2.2 读文件 3. 系统文件I/O 3.1 系统接口 3.2 系…

OpenVINO安装教程 npm版

从 npm Registry安装 OpenVINO™ 工具套件的英特尔发行版 请注意&#xff1a; 仅提供 JavaScript API 专用于所有主要操作系统的用户&#xff1a;Windows、Linux 和 macOS &#xff08;所有 x86_64 / ARM64 架构&#xff09; macOS 仅支持 CPU 推理 系统要求软件要求 Window…

Python --- 在python中安装NumPy,SciPy,Matplotlib以及scikit-learn(Windows平台)

在python中安装NumPy&#xff0c;SciPy&#xff0c;Matplotlib以及scikit-learn(Windows平台) 本文是针对(像我一样的)python新用户所写的&#xff0c;刚刚在电脑上装好python之后&#xff0c;所需的一些常见/常用的python第三方库/软件包的快速安装指引。包括了这些常用安装包…

【AI自媒体制作】【AI工具】天工AI

链接&#xff1a;天工AI 目前chatgpt3.5已经免费&#xff0c;很多AI平台都可以进行一定层度的白嫖&#xff0c;对于个人开发者是一件好事&#xff0c;有些会员就没必要充值了。 天工AI是比较常见的AI工具了&#xff0c;可以识别图片、智能问答、生成图片等。当然对于一个程序员…

【Linux】git

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解Linux的编译器-gcc/g&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 1.安装git2.在gitee上创建仓库3.首次配置4.下载仓库到本地5.三板斧6.git log7.gi…

【数据结构】二叉爆炸

【数据结构】二叉爆炸 按照惯例整点抽象的&#xff0c;贴上这篇博客的名字由来&#xff1a; 言归正传&#xff0c;本篇博客介绍二叉树的构造方式、前中后序遍历、层序遍历以及代码随想录中二叉树章节的相关题目&#xff1a; 代码随想录 (programmercarl.com) 一、啥是二叉树 …

HDMI to TYPE-C芯片|HDMI2.0转TYPE-C转接器方案|CS5802设计方案|ASL CS5802

CS5802输入端可以是1080P、4K30、4K60HZ这三种规格,输出的接口可以是TYPE-C信号接口,或者是TYPE-C信号接口,输入端HDMI由4路信号组成&#xff0c;支持1.62Gbps、2.7Gbps、5.4Gbps链路速率。内置可选SSC功能可降低EMI的干扰状况。 ASL CS5802芯片概述&#xff1a; 符合HDMI规范…

04节-51单片机-数码管模块

1.静态数码管显示 LED数码管&#xff1a;数码管是一种简单、廉价的显示器&#xff0c;是由多个发光二极管封装在一起组成“8”字型的器件 下图展示了数码管的线路连接 数码管的连接方式分为&#xff0c;公共端&#xff0c;共阴极和共阳极连接&#xff1a; 多个数码管共用引…

IMUGNSS 误差状态卡尔曼滤波器(ESKF)的离散时间的ESKF 运动方程与运动过程

IMU&GNSS 误差状态卡尔曼滤波器&#xff08;ESKF&#xff09;的离散时间的ESKF 运动方程与运动过程 离散时间的ESKF 运动方程ESKF的运动过程 离散时间的ESKF 运动方程 名义状态变量的离散时间运动方程可以写为&#xff1a;&#xff08;不用考虑噪声&#xff0c;噪声在误差…

701强连通分量(python)

看见题目知道时间复杂度不超过&#xff08;mlogm&#xff09;。 这题用强连通分量 Tarjan 算法&#xff0c;强联通&#xff1a;对于任意两个点u和v&#xff0c;u可以到达v&#xff0c;v也可以到达u。这题需要考虑有重边&#xff0c;自环&#xff0c;同样别忘记可能会有两个点u…

[阅读笔记20][BTX]Branch-Train-MiX: Mixing Expert LLMs into a Mixture-of-Experts LLM

这篇论文是meta在24年3月发表的&#xff0c;它提出的BTX结构融合了BTM和MoE的优点&#xff0c;既能保证各专家模型训练时的高度并行&#xff0c;又是一个统一的单个模型&#xff0c;可以进一步微调。 这篇论文研究了以高效方法训练LLM使其获得各领域专家的能力&#xff0c;例如…