RuoyiExcel导出,一个单元格内导出多张图片

若依自带的导出Excel图片只能每次导出一张图片,当有多张图片时就无法识别导出了,这里对Excel注解和ExcelUtil做了点小改造后就能实现一个单元格导出多个图片的效果,效果如下:

(这里文件位置均为cloud版)首先,

1.Excel注解修改:

/**
     * 图片数量 根据图片数量划分图片在单元格内的占比
     * @return
     */
    public int imgNum() default 1;

2.ExcelUtil工具类的修改:

2.1

找到ruoyi-common-core下的ExcelUtil中以下这部分代码,这部分代码是对图片类型的数据处理,通过画布将图片画入指定的两个单元格范围内,前面四个0为相对于两个单元格的偏移

        else if (ColumnType.IMAGE == attr.cellType())
        {
            ClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 1), cell.getRow().getRowNum() + 1);
            String imagePath = Convert.toStr(value);
            if (StringUtils.isNotEmpty(imagePath))
            {
                byte[] data = ImageUtils.getImage(imagePath);
                getDrawingPatriarch(cell.getSheet()).createPicture(anchor,
                        cell.getSheet().getWorkbook().addPicture(data, getImageType(data)));
            }
        }

2.2

改造:将上部分代码修改为以下代码,注意修改图片分隔方法

else if (ColumnType.IMAGE == attr.cellType())
        {
            //图片数量
            int imgNum = attr.imgNum();

            if (imgNum <= 0) {
                imgNum = 1;
            }
            //计算的宽度 300 * 256 = 76800 别问300怎么来的
            double width = attr.width() * 76800;
            String imagePath = Convert.toStr(value);
            if (StringUtils.isNotBlank(imagePath))
            {
                //这里可以根据自己的图片分割获取,我这里是使用,号分隔多张图片
                String[] splitUrl = imagePath.split(",");
                //将单元格根据图片数量分割大小
                int every = (int) (width / imgNum);
                if (splitUrl.length > imgNum) {
                    throw new SecurityException("图片最大值设置错误,数量已超出设置或默认的最大值");
                }
                int lastIndex = 0;
                for (int i = 0; i < splitUrl.length;i++) {
                    int nowIndex = 0;
                    String url = splitUrl[i];
                    if (imgNum != 1){
                        nowIndex = (imgNum - i - 1) * every;
                    }
                    ClientAnchor anchor = new XSSFClientAnchor(lastIndex, 0, -nowIndex, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 1), cell.getRow().getRowNum()+1);

                    byte[] data = ImageUtils.getImage(url);
                    getDrawingPatriarch(cell.getSheet()).createPicture(anchor,
                        cell.getSheet().getWorkbook().addPicture(data, getImageType(data)));
                    lastIndex = (int) (width- nowIndex);
                }
            }
        }

3.使用

将实体类中图片路径对应的字段打上标签,并设置最大的图片数量,比如 imgNum = 5,那么就会将格子的宽度分为五份,一张图片占据一份

注意给上宽度和高度和设置cellType =Excel.ColumnType.IMAGE

    /** 图片 */
    @Excel(name = "图片",cellType = Excel.ColumnType.IMAGE,width=55,height = 55,imgNum = 5)
    private String imageUrls;

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值