概要描述
-
最近工作中涉及到使用Excel导出图片的需求,下面对使用Excel导出图片遇到的一些问题进行记录说明。需求通过 EasyExcel中提供的转换器(Converter)和拦截器(Handler)实现。EasyExcel 官网地址
-
实现效果
实现过程
EasyExcel 支持导出 ByteArray
、File
、String
、InputStream
、URL
五种类型的图片。项目中图片字段使用的是InputStream,由前端传入图片,
因此本文将介绍导出 InputStream
类型图片的实现过程。
实现过程主要关键步骤:
- 自定义拦截器(实现 CellWriteHandler 接口):阻止 EasyExcel 默认的图片导出操作,使用 Apache POI 库向 Excel 表格中手动写入图片。
- 在自定义拦截器中重写beforeCellCreate方法实现动态表头赋值。
- 在自定义拦截器中重写afterCellDataConverted方法解决EasyExcel 中阻止默认的图片导出操作。
- 在自定义拦截器中重写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; // 监理单位
}
-
定义单元格合并属性实体类
/**
* 单元格合并