
在 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实现汽车图片展示,键盘方向键( ← → )也可以操作左右切换,兼容主流浏览器。 使用方法: 1. head区域引用文件 lrtk.css,jquery.js,jquery.movingboxes.js 2. head区域引用插件设置代码 3. 在你的文件中加入区域代码
- drawings() 方法绝不应返回空数组 []、false、new Drawing()(未设路径)或未定义变量——这些均违反接口预期,将导致导出失败;
- 建议增加 file_exists() 和 is_readable() 校验,避免因文件缺失引发静默错误或生产环境异常;
- setPath() 调用一次即可,无需先设 null 再覆盖;
- 若图片路径来自用户输入或数据库,请务必进行安全过滤(如白名单校验、路径遍历防护),防止任意文件读取风险。
通过此方式,你无需维护两套高度重复的导出类(一个带图、一个不带图),即可在单个 CatalogExport 类中灵活控制图片渲染逻辑,兼顾可维护性与健壮性。









