Bootstrap

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; // 监理单位


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

/**
 * 单元格合并
;