若依自带的导出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;