最近在工作中实现了一个将多张图片导出到 Excel 表格,而且图片需要在单元格内平铺展示的需求。
需求通过 EasyExcel(版本 3.3.4)中提供的转换器(Converter)和拦截器(Handler)实现。
实现效果
实现过程
EasyExcel 支持导出 ByteArray
、File
、String
、InputStream
、URL
五种类型的图片。项目中图片字段存储的是图片 URL 地址,因此本文将介绍导出 String
类型图片的实现过程。
实现过程主要包括两个关键步骤:
- 自定义转换器(实现 Converter 接口):图片数据转换(将
String
类型图片的 URL 地址转换为字节数组,并设置到writeCellData
对象的imageDataList
属性中)。 - 自定义拦截器(实现 CellWriteHandler 接口):阻止 EasyExcel 默认的图片导出操作,使用 Apache POI 库向 Excel 表格中手动写入图片。
执行流程和具体步骤如下。
1、引入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.4</version>
</dependency>
2、定义实体类
/**
* @author Cleaner
* @description 只保留图片字段,省略其他字段
*/
@Data
public class ExportImageVO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 图片地址列表
*/
@ExcelProperty(value = "图片", order = 1,converter = ExcelUrlConverterUtil.class)
private List<String> imageUrlList;
}
3、定义转换器
public class ExcelImageUrlConverterUtil implements Converter<List<String>> {
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
@Override
public WriteCellData<?> convertToExcelData(List<String> value, ExcelContentProperty contentProperty,