EasyExcel 最新版(3.3.4)导出多张图片

本文介绍了如何在EasyExcel3.3.4版本中,通过自定义转换器和拦截器将URL图片转换为字节数组并平铺显示在Excel单元格中,避免了默认导出操作,使用ApachePOI库实现图片手动写入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在工作中实现了一个将多张图片导出到 Excel 表格,而且图片需要在单元格内平铺展示的需求。

需求通过 EasyExcel(版本 3.3.4)中提供的转换器(Converter)和拦截器(Handler)实现。

EasyExcel 官网地址

实现效果

EasyExcel-01.png

实现过程

EasyExcel 支持导出 ByteArrayFileStringInputStreamURL 五种类型的图片。项目中图片字段存储的是图片 URL 地址,因此本文将介绍导出 String 类型图片的实现过程。

实现过程主要包括两个关键步骤:

  1. 自定义转换器(实现 Converter 接口):图片数据转换(将 String 类型图片的 URL 地址转换为字节数组,并设置到 writeCellData对象的 imageDataList 属性中)。
  2. 自定义拦截器(实现 CellWriteHandler 接口):阻止 EasyExcel 默认的图片导出操作,使用 Apache POI 库向 Excel 表格中手动写入图片。

执行流程和具体步骤如下。

EasyExcel-02.png

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, 
### 解决方案 为了避免在使用 EasyExcel 3.3.4 版本导出 Excel 文件时出现多张图片重叠的情况,可以采取以下措施: #### 图片定位控制 通过精确设置每一张图片的位置来防止它们相互覆盖。这可以通过调整 `PictureData` 的坐标实现。 ```java import com.alibaba.excel.EasyExcel; import org.apache.poi.ss.usermodel.ClientAnchor; import org.apache.poi.ss.util.CellRangeAddress; public class ExportWithImages { public static void exportWithoutOverlap(String fileName) { // 创建工作簿并指定文件名 EasyExcel.write(fileName) .sheet("Sheet with Images") .doWrite(data()); // 添加图片逻辑 addImageToCell(0, 0, "path/to/image1.png", fileName); addImageToCell(5, 0, "path/to/image2.png", fileName); // 调整起始行列号以避免重叠 } private static void addImageToCell(int row, int col, String imagePath, String excelFilePath) { try (FileInputStream fis = new FileInputStream(imagePath)) { byte[] bytes = IOUtils.toByteArray(fis); ClientAnchor anchor = new XSSFClientAnchor(); anchor.setCol1(col); anchor.setRow1(row); anchor.setDx1(0); anchor.setDy1(0); // 设置结束单元格位置(可选) anchor.setCol2(col + 1); anchor.setRow2(row + 1); // 将图片添加到特定的工作表中 XSSFSheet sheet = workbook.getSheetAt(0); Drawing<?> patriarch = sheet.createDrawingPatriarch(); patriarch.createPicture(anchor, workbook.addPicture(bytes, Workbook.PICTURE_TYPE_PNG)); } catch (IOException e) { throw new RuntimeException(e.getMessage(), e); } } } ``` 上述代码展示了如何向不同的单元格插入不同图片,并确保这些图片不会互相遮挡[^1]。 另外,在实际应用过程中还需要注意以下几个方面: - **图片大小适配**:根据目标单元格尺寸适当缩放图片; - **锚点管理**:合理规划每个图像的起点和终点,使布局更加美观有序;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值