package com.fjhx.item.util.excel;

import com.alibaba.excel.metadata.data.ImageData;
import com.alibaba.excel.metadata.data.WriteCellData;

import java.util.ArrayList;
import java.util.List;

public class ExcelImgUtils {
    /**
     * Excel图片等比例缩放
     */
    public static WriteCellData<Void> imageCells(byte[] bytes, Double imageWidth, Double imageHight, Double cellWidth, Double cellHeight) {
        //获取屏幕最短边
        double cellShort = cellWidth > cellHeight ? cellHeight : cellWidth;
        //获取图片最长边
        double imgLength = imageWidth > imageHight ? imageWidth : imageHight;
        //图片最长边/屏幕最短边 计算比例
        double aa = imgLength / cellShort;
        //计算最终大小
        double outImgWidth = imageWidth / aa;
        double outImgHeight = imageHight / aa;
        //计算边界距离
        double top1 = (cellHeight - outImgHeight) / 2;
        double left1 = (cellWidth - outImgWidth) / 2;

        Integer top = Math.toIntExact(Math.round(top1));
        Integer left = Math.toIntExact(Math.round(left1));

        WriteCellData<Void> writeCellData = new WriteCellData<>();
        // 这里可以设置为 EMPTY 则代表不需要其他数据了
        //writeCellData.setType(CellDataTypeEnum.EMPTY);

        // 可以放入多个图片
        List<ImageData> imageDataList = new ArrayList<>();
        writeCellData.setImageDataList(imageDataList);

        ImageData imageData = new ImageData();
        imageDataList.add(imageData);
        // 设置图片
        imageData.setImage(bytes);
        // 图片类型
        //imageData.setImageType(ImageData.ImageType.PICTURE_TYPE_PNG);
        // 上 右 下 左 需要留空，这个类似于 css 的 margin；这里实测 不能设置太大 超过单元格原始大小后 打开会提示修复。暂时未找到很好的解法。
        imageData.setTop(top);
        imageData.setRight(left);
        imageData.setBottom(top);
        imageData.setLeft(left);

        // * 设置图片的位置。Relative表示相对于当前的单元格index。first是左上点，last是对角线的右下点，这样确定一个图片的位置和大小。
        // 目前填充模板的图片变量是images，index：row=7,column=0。所有图片都基于此位置来设置相对位置
        // 第1张图片相对位置
        imageData.setRelativeFirstRowIndex(0);
        imageData.setRelativeFirstColumnIndex(0);
        imageData.setRelativeLastRowIndex(0);
        imageData.setRelativeLastColumnIndex(0);

        return writeCellData;
    }
}