Laravel Excel 中条件性插入图片的正确实现方法

Laravel Excel 中条件性插入图片的正确实现方法

laravel excel 导出中,可通过 `withdrawings` 接口动态控制图片是否插入——关键在于 `drawings()` 方法必须返回 `drawing` 实例或 `null`,不可返回未初始化对象或空数组,否则会触发“file not found”等异常。

在使用 laravel-excel 进行导出时,若需根据业务逻辑(如 $this->semnat === 1)条件性插入图片,不能简单地在 drawings() 方法中“不设置路径”或“返回未完整初始化的 Drawing 对象”,因为 WithDrawings 接口契约要求该方法必须返回一个 PhpOffice/PhpSpreadsheet/Worksheet/Drawing 实例,或明确返回 null。若返回未设置 path 的 Drawing 对象(如你原代码中先调用 $drawing->setPath(null) 再覆盖),且后续路径无效,Excel 库仍会尝试加载该路径,从而抛出 File not found! 错误。

✅ 正确做法是:仅在满足全部前置条件时才构建并返回 Drawing 实例;否则直接返回 null。以下是推荐实现:

use PhpOffice/PhpSpreadsheet/Worksheet/Drawing;

public function drawings()
{
    // 确保签名启用且图片路径存在、非空、文件实际可读
    if ($this->semnat === 1 && !empty($this->imgPath)) {
        $fullPath = storage_path('app/public/' . $this->imgPath);
        if (file_exists($fullPath) && is_readable($fullPath)) {
            $drawing = new Drawing();
            $drawing->setName('Semnatura');
            $drawing->setDescription('This is my logo');
            $drawing->setHeight(100);
            $drawing->setCoordinates('F3');
            $drawing->setPath($fullPath); // ⚠️ 注意:setPath() 只需调用一次,传入有效路径
            return $drawing;
        }
    }

    return null; // ✅ 关键:无图时必须返回 null,不可省略
}

? 重要注意事项

MovingBoxes实现汽车图片展示

MovingBoxes实现汽车图片展示

MovingBoxes实现汽车图片展示,键盘方向键( ← → )也可以操作左右切换,兼容主流浏览器。
使用方法:
1. head区域引用文件 lrtk.css,jquery.js,jquery.movingboxes.js
2. head区域引用插件设置代码
3. 在你的文件中加入区域代码

下载

  • drawings() 方法绝不应返回空数组 []、false、new Drawing()(未设路径)或未定义变量——这些均违反接口预期,将导致导出失败
  • 建议增加 file_exists() 和 is_readable() 校验,避免因文件缺失引发静默错误或生产环境异常;
  • setPath() 调用一次即可,无需先设 null 再覆盖;
  • 若图片路径来自用户输入或数据库,请务必进行安全过滤(如白名单校验、路径遍历防护),防止任意文件读取风险。

通过此方式,你无需维护两套高度重复的导出类(一个带图、一个不带图),即可在单个 CatalogExport 类中灵活控制图片渲染逻辑,兼顾可维护性与健壮性。

https://www.php.cn/faq/2030419.html

发表回复

Your email address will not be published. Required fields are marked *