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

embedded/2024/9/22 21:04:08/

概要描述 

  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方法写入图片,并在指定的单元格设置值。

   

  •  引入依赖

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

java">@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;
}
  • 定义导出的实体类

java">@Data
public class ProjectGanttExportVO implements Serializable {@ExcelProperty(value = {"${projectName}"})@ColumnWidth(15)private InputStream fileInputStream;@ExcelIgnoreprivate String projectName; // 动态表头-项目名称@ExcelIgnoreprivate Integer height;  // 图片的高度@ExcelIgnoreprivate Integer width;  // 图片的宽度@ExcelIgnoreprivate String lineConstructionScaleHead = "线路建设规模:"; //线路建设规模@ExcelIgnoreprivate String lineConstructionScale; // 线路建设规模内容描述@ExcelIgnoreprivate String substationConstructionScaleHead = "变电建设规模:"; // 变电建设规模@ExcelIgnoreprivate String substationConstructionScale; //变电建设规模内容描述@ExcelIgnoreprivate String designDeptNameHead = "设计单位:"; // 设计单位表头@ExcelIgnoreprivate String designDeptName; // 设计单位名称@ExcelIgnoreprivate String eiaDeptNameHead = "环评编制单位:"; //环评编制单位表头@ExcelIgnoreprivate String eiaDeptName; // 环评编制单位@ExcelIgnoreprivate String waterConservationDeptNameHead = "水保编制单位:"; //水保编制单位表头@ExcelIgnoreprivate String waterConservationDeptName; //水保编制单位@ExcelIgnoreprivate String approvalDeptNameHead = "核准编制单位:"; // 核准编制单位表头@ExcelIgnoreprivate String approvalDeptName; // 核准编制单位@ExcelIgnoreprivate String linKanDeptNameHead = "林勘编制单位:"; // 林勘编制单位表头@ExcelIgnoreprivate String linKanDeptName; // 林勘编制单位@ExcelIgnoreprivate String orePressingDeptNameHead = "压矿编制单位:"; // 压矿编制单位表头@ExcelIgnoreprivate String orePressingDeptName; // 压矿编制单位@ExcelIgnoreprivate String landDeptNameHead = "土地编制单位:"; // 土地编制单位表头@ExcelIgnoreprivate String landDeptName; // 土地编制单位@ExcelIgnoreprivate String roadDeptNameHead = "施工单位:"; // 施工单位表头@ExcelIgnoreprivate String roadDeptName; // 施工单位@ExcelIgnoreprivate String supervisorDeptNameHead = "监理单位:"; // 监理单位表头@ExcelIgnoreprivate String supervisorDeptName; // 监理单位}
  • 定义单元格合并属性实体类

java">/*** 单元格合并属性定义

http://www.ppmy.cn/embedded/13689.html

相关文章

C++从入门到出门

C 概述 c 融合了3中不同的编程方式&#xff1a; C语言代表的过程性语言C 在C语言基础上添加的类代表的面向对象语言C 模板支持的泛型编程 1、在c语言中头文件使用扩展名.h,将其作为一种通过名称标识文件类型的简单方式。但是c得用法改变了&#xff0c;c头文件没有扩展名。但是…

Rootkit介绍

一、定义 Rootkit是一种恶意软件&#xff0c;旨在让黑客访问和控制目标设备。虽然大多数Rootkit 会影响软件和操作系统&#xff0c;但有些还会感染计算机的硬件和固件。Rootkit善于隐藏自己&#xff0c;担当它们保持隐藏时&#xff0c;其实处于活跃状态。 一旦未经授权获得对计…

Oracle中排查谁把表数据删除更新——delete、drop、truncate

一、Oracle删除表或数据方法 简单的说Oracle中的delete、drop、truncate三个命令都可以将数据清除; Oracle中清除数据delete、drop、truncate相同点 序号描述1truncate和不带where条件的delete、以及drop都会删除表内的数据 ①【truncat table】比 【delete 】速度快,且使…

【Python打包exe文件】

Python打包exe文件 ■ Python打包exe文件■■■ ■ Python打包exe文件 需求&#xff1a; 自己写的Python代码&#xff0c;在对方电脑里没有安装py环境无法运行&#xff0c;怎么办&#xff1f; 答&#xff1a;打包成exe文件发送对方就能运行。 首先自己写的python代码自己要能…

C++笔记之C++、C语言、PISIX、拿到线程函数的返回值的所有方法

C++笔记之C++、C语言、PISIX、拿到线程函数的返回值的所有方法 —— 2024-04-21 杭州 文章目录 C++笔记之C++、C语言、PISIX、拿到线程函数的返回值的所有方法1.C++ 使用 std::thread 和 std::promise/std::future2.C++ 使用 std::async3.C/POSIX 使用 pthread在 C++ 和 C 语言…

Ubuntu - 网络

本文简单介绍几个网络相关的命令 ip ip addr show 显示所有网卡的地址ip addr show ens33 显示ens33网卡地址ip addr add 192.168.13.143/24 dev ens33 为ens33网卡设置地址ip route show 显示所有网卡路由ip route get 110.242.68.3 展示110.242.68.3到本机的哪个网卡ip -s l…

小孩子不懂事,写着玩的

目录 Web攻防 特有漏洞 ASP安全 ASPX&#xff08;.NET&#xff09;安全 PHP安全 JavaWeb安全 JS&#xff0c;Node.js安全 Java安全 Python安全 通用漏洞 SQL注入 MySQL-root高权限读写注入 PostgreSQL-高权限读写注入 MSSQL-sa高权限读写执行注入 SQL注入体系 o…

FreeSWITCH rtp 统计

现在能想到的是几个办法&#xff1a; 1. cdr 增加下面元素&#xff1a; rtp_audio_in_raw_bytes rtp_audio_in_media_bytes rtp_audio_in_packet_count rtp_audio_in_media_packet_count rtp_audio_in_skip_packet_count rtp_audio_in_jb_packet_count rtp_audio_in_dtmf_pac…