EasyExcel中对图片大小及位置进行调整(自定义拦截器)

如何对我们导出的图片设置大小和位置

首先我们先丢入一张图片,这里我就直接通过URL的形式进行编写

定义一个存储图片的类

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;

import java.net.URL;

@Getter
@Setter
@EqualsAndHashCode
public class ImageDemoData {
    /**
     * 根据url导出
     *
     */
    private URL url;

}

需要将图片插入的操作(把图片赛进List中)

            ImageDemoData imageDemoData = new ImageDemoData();
            imageDemoData.setUrl(new URL("https://img-blog.csdnimg.cn/img_convert/ff9e522ef239408bb54947c4fe64ae0f.png?x-oss-process=image/resize,m_fixed,h_300,image/format,png"));
            List<ImageDemoData> imageDemoDataList = new ArrayList<>();
            imageDemoDataList.add(imageDemoData);

在ExcelWriter中对其进行写入操作

ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();
excelWriter.write(imageDemoDataList, writeSheet);

下面进入正题(以上操作很正常插入数据的操作是相同的)

package com.mixcloud.mall.ams.interceptor;

import cn.hutool.core.util.ObjectUtil;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.handler.AbstractCellWriteHandler;
import com.alibaba.excel.write.handler.context.CellWriteHandlerContext;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import lombok.SneakyThrows;
import org.apache.commons.lang.BooleanUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFDrawing;

import java.net.URL;
import java.util.List;

public class QuotationCustomCellWriteHandler extends AbstractCellWriteHandler {

    private int newWidthEMU;
    private int newHeightEMU;

    public QuotationCustomCellWriteHandler(int newWidthPixels, int newHeightPixels) {
        this.newWidthEMU = newWidthPixels;
        this.newHeightEMU = newHeightPixels;
    }


    @Override
    public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {
        short height = 600;
        row.setHeight(height);
    }

    @SneakyThrows
    @Override
    public void afterCellDispose(CellWriteHandlerContext context) {

        Cell cell = context.getCell();
            if (context.getOriginalValue().toString().contains("https://img-blog.csdnimg.cn/img_convert/ff9e522ef239408bb54947c4fe64ae0f.png?x-oss-process=image/resize,m_fixed,h_300,image/format,png")) {
                Sheet sheet = cell.getSheet();
                Drawing<?> drawingPatriarch = sheet.getDrawingPatriarch();
                if (drawingPatriarch instanceof XSSFDrawing) {
                    XSSFDrawing xssfDrawing = (XSSFDrawing) drawingPatriarch;
                    for (Shape shape : xssfDrawing.getShapes()) {
                        if (shape instanceof Picture) {
                            Picture picture = (Picture) shape;
                            ClientAnchor anchor = picture.getClientAnchor();
                            // 设置新的图片大小
                            anchor.setDx1(newWidthEMU);
                            anchor.setDy1(newHeightEMU);
                            // 更新图片
                            picture.resize();
                        }
                    }
                }
            }
        super.afterCellDispose(context);
    }

}

这样拦截器就会在当中成功的调整图片的大小

补充:调整位置只需要对anchor进行设置即可,例如下面代码

// 调整图片的行位置
int newRow1 = anchor.getRow1() - 2; // 向上移动两行
int newRow2 = anchor.getRow2() - 2; // 向上移动两行

// 设置新的行位置
anchor.setRow1(newRow1);
anchor.setRow2(newRow2);

即可对图片进行自由调整

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈Demo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值