原创

若依实现导出多图功能

若依版本

v3.6.5微服务版本

需求

后台管理系统中,列表数据导出时,如果列表的记录中有个picUrls信息项,存储的是图片URL,若依本身没有支持多图导出

实现

修改导出Excel数据注解

Excel.java 注解类中,ColumnType 枚举类中增加一项IMAGES(4) ,用于注解数据对象的图片URL集合属性。
使用示例:

@Excel(name = "问题图片", width = 80, height = 90, cellType = Excel.ColumnType.IMAGES)
private String picUrls;

ExcelUtil工具类完善

setCellVo 方法中,增加以下代码:

public void setCellVo(Object value, Excel attr, Cell cell)  {
    if (ColumnType.STRING == attr.cellType() || ColumnType.TEXT == attr.cellType()) {
        // 其他代码
        ...
    } else if (ColumnType.IMAGES == attr.cellType()) {
        try {
            cell.setCellValue("");
            Sheet _sheet = cell.getSheet();
            int col = cell.getColumnIndex();
            int row = cell.getRow().getRowNum();

            // 因为我这里picUrls内存储的是json字符串
            String jsonStr = Convert.toStr(value);
            JSONArray array = JSON.parseArray(jsonStr);
            if (array == null || array.isEmpty()) {
                return;
            }

            // ===============关键:Excel单元格内单位===============
            int EMU = 9525;               // Excel标准单位(固定不要动)
            int IMG_WIDTH = 110;          // 每张图片宽度(固定)
            int IMG_HEIGHT = 110;         // 每张图片高度(固定)
            int GAP = 15;                 // 图片间距
            int TOP = 5;                  // 上边距

            // 行高
            cell.getRow().setHeightInPoints(120);

            Drawing<?> drawing = _sheet.createDrawingPatriarch();
            if (drawing == null) {
                drawing = _sheet.createDrawingPatriarch();
            }

            for (int i = 0; i < array.size(); i++) {
                // ==========核心修复:水平偏移公式============
                int x = i * (IMG_WIDTH + GAP);

                int dx1 = x * EMU;                  // 第i张图的起始X
                int dy1 = TOP * EMU;                // 顶部边距
                int dx2 = (x + IMG_WIDTH) * EMU;    // 结束X
                int dy2 = (TOP + IMG_HEIGHT) * EMU; // 高度

                ClientAnchor anchor = _sheet.getWorkbook().getCreationHelper().createClientAnchor();
                anchor.setDx1(dx1);
                anchor.setDy1(dy1);
                anchor.setDx2(dx2);
                anchor.setDy2(dy2);
                anchor.setCol1(col);
                anchor.setRow1(row);
                anchor.setCol2(col);
                anchor.setRow2(row);

                anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);

                JSONObject json = array.getJSONObject(i);
                String pic = json.getString("pic");
                byte[] data = ImageUtils.getImage(pic);

                if (data == null || data.length == 0) {
                    continue;
                }

                int picType = Workbook.PICTURE_TYPE_JPEG;
                try {
                    int type = getImageType(data);
                    if (type == 6) picType = Workbook.PICTURE_TYPE_JPEG;
                } catch (Exception e) {
                    log.error("获取图片数据出错:{}", e.getMessage(), e);
                }
                int index = _sheet.getWorkbook().addPicture(data, picType);
                drawing.createPicture(anchor, index);
            }
        } catch (Exception e) {
            log.error("插入多图失败:{}", e.getMessage());
        }
    }
}

实际效果

正文到此结束