esayExcel导出图片

写个博客是因为在做这个功能的时候,没有找打合适的轮子。

所以这里记录一下。

先看效果

点击图片放大

第一先看官方网 提供6中方式 快捷访问https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write

我这里使用的 最后一种

复制代码
将地图地址转为WriteCellData

private  WriteCellData<Void> urlToImg(String path) {
        WriteCellData<Void> writeCellData = new WriteCellData<>();
        try {
            // 这里可以设置为 EMPTY 则代表不需要其他数据了
            writeCellData.setType(CellDataTypeEnum.STRING);
            writeCellData.setStringValue("原始图片");
            // 可以放入多个图片
            List<ImageData> imageDataList = new ArrayList<>();
            writeCellData.setImageDataList(imageDataList);
            // 从远程获取图片数据
            byte[] imageData = HttpClientUtils.doGetImage(goFastConfig.getUrl() + path);
            if (imageData != null && imageData.length > 0) {
                ImageData image = new ImageData();
                image.setImage(imageData);
                // 根据实际图片类型设置,这里假设是JPEG格式
                image.setImageType(ImageData.ImageType.PICTURE_TYPE_JPEG);
                // 上 右 下 左 需要留空
                // 这个类似于 css 的 margin
                // 这里实测 不能设置太大 超过单元格原始大小后 打开会提示修复。暂时未找到很好的解法。
                image.setTop(5);
                image.setRight(5);
                image.setBottom(5);
                image.setLeft(5);
                imageDataList.add(image);
                return writeCellData;
            }
        } catch (Exception e) {
            log.warn("获取原始图片失败: {}", path, e);
        }
        return writeCellData;
    }

第二步最重要的来了 自适应宽高 以及 写死图片宽 以及设置行高

list 集合 放入的是字段 的 列 下标。

自定义表单适配器 设置图片宽有以及行高

完整代码

复制代码
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import org.springframework.util.CollectionUtils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author lj
 * @Description 自定义内容自适应
 * @DFata 2025/11/14 13:33
 * @Version 1.0
 */
public class CustomCellWriteWeightConfig extends AbstractColumnWidthStyleStrategy {
    private Map<Integer, Map<Integer, Integer>> CACHE = new HashMap<>();
    /**
     * 图片数据索引
     */
    private List<Integer> imgDataIndex =null;
    public CustomCellWriteWeightConfig() {
    }
    public CustomCellWriteWeightConfig(List<Integer> imgDataIndex) {
        this.imgDataIndex = imgDataIndex;
    }

    @Override
    protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer integer, Boolean isHead) {
        boolean needSetWidth = isHead || !CollectionUtils.isEmpty(cellDataList);
        if (needSetWidth) {
            Map<Integer, Integer> maxColumnWidthMap = CACHE.get(writeSheetHolder.getSheetNo());
            if (maxColumnWidthMap == null) {
                maxColumnWidthMap = new HashMap<>();
                CACHE.put(writeSheetHolder.getSheetNo(), maxColumnWidthMap);
            }
            if(imgDataIndex != null && imgDataIndex.contains(cell.getColumnIndex())){
                Sheet sheet = writeSheetHolder.getSheet();
                Integer columnWidth = 15;
                sheet.setColumnWidth(cell.getColumnIndex(), columnWidth * 256);
                sheet.setDefaultRowHeight((short) 1200);
            }else {
                Integer columnWidth = this.dataLength(cellDataList, cell, isHead);
                if (columnWidth >= 0) {
                    if (columnWidth > 254) {
                        columnWidth = 254;
                    }
                    Integer maxColumnWidth = maxColumnWidthMap.get(cell.getColumnIndex());
                    if (maxColumnWidth == null || columnWidth > maxColumnWidth) {
                        maxColumnWidthMap.put(cell.getColumnIndex(), columnWidth);
                        Sheet sheet = writeSheetHolder.getSheet();
                        sheet.setColumnWidth(cell.getColumnIndex(), columnWidth * 256);
                    }
                }
            }
        }
    }

    /**
     * 计算长度
     * @param cellDataList
     * @param cell
     * @param isHead
     * @return
     */
    private Integer dataLength(List<WriteCellData<?>> cellDataList, Cell cell, Boolean isHead) {
        if (isHead) {
            return cell.getStringCellValue().getBytes().length;
        } else {
            WriteCellData cellData = cellDataList.get(0);
            CellDataTypeEnum type = cellData.getType();
            if (type == null) {
                return -1;
            } else {
                switch (type) {
                    case STRING:
                        // 换行符(数据需要提前解析好)
                        int index = cellData.getStringValue().indexOf("\n");
                        return index != -1 ?
                                cellData.getStringValue().substring(0, index).getBytes().length + 1 : cellData.getStringValue().getBytes().length + 1;
                    case BOOLEAN:
                        return cellData.getBooleanValue().toString().getBytes().length;
                    case NUMBER:
                        return cellData.getNumberValue().toString().getBytes().length;
                    default:
                        return -1;
                }
            }
        }
    }
}
相关推荐
xcl09255 小时前
北京24小时自助健身房系统软件开发实战:从架构到部署全流程指南
java·spring boot·架构
一 乐7 小时前
动漫书销售商城|基于springboot + vue动漫书销售商城(源码+数据库+文档)
java·数据库·vue.js·spring boot·毕业设计
卓怡学长7 小时前
w214基于jsp知道特产网
java·intellij-idea
步行cgn8 小时前
Spring 注解使用详解
java·spring
一条小小yu8 小时前
Spring IoC的理解
java·后端·spring
落魄实习生8 小时前
Agent Scope Java 2.x 系列【7】工具使用
java·开发语言·ai
旺仔学长 哈哈8 小时前
springboot钓鱼爱好者交流平台APP设计与实现
java·spring boot·mysql·充电桩管理系统
自强的小白10 小时前
核心功能(Service接口)
java·mybatis
乌暮11 小时前
深入理解 Java 泛型:把「万能盒子」用对、用稳
java·开发语言·后端·学习