




在 laravel excel 导出中,可通过 `withdrawings` 接口动态控制图片是否插入——关键在于 `drawings()` 方法必须返回 `drawing` 实例或 `null`,不可返回未初始化对象或空数组,否则会触发“file not found”等异常。
在使用 laravel-excel 进行导出时,若需根据业务逻辑(如 $this->semnat === 1)条件性插入图片,不能简单地在 drawings() 方法中“不设

✅ 正确做法是:仅在满足全部前置条件时才构建并返回 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,不可省略
}? 重要注意事项:
通过此方式,你无需维护两套高度重复的导出类(一个带图、一个不带图),即可在单个 CatalogExport 类中灵活控制图片渲染逻辑,兼顾可维护性与健壮性。