




phpspreadsheet 在读取并保存 excel 文件时,会生成新文件而非直接修改原文件,而部分图像、形状等富媒体元素因底层不支持而被丢弃,需通过启用内存缓存和正确配置写入器来解决。
在使用 PhpSpreadsheet 处理包含图片(如插入的 PNG/JPEG)、形状(如文本框、箭头、自定义图形)的 Excel 文件时,常见问题是在调用 $writer->save() 后,目标工作表(如 Sheet2)中的图像或形状完全消失。根本原因在于:PhpSpreadsheet 并非完整实现 Excel 的所有 OOXML 规范,尤其对
✅ 正确做法是启用 内存中绘图对象缓存 并禁用不兼容的兼容性模式:
setPreCalculateFormulas(false); // 非必需,且可能干扰渲染 // $writer->setOffice2003Compatibility(true); // ⚠️ 严重警告:此选项强制降级为 Excel 2003 兼容模式,**完全不支持现代绘图对象**!必须禁用! $new_file = './file_uploads/report_file/' . $file_info_idx . '_tmp.' . $file_ext; // ✅ 推荐:启用内存缓存(默认已开启),并确保写入器使用标准 XLSX 模式 $writer->setIncludeCharts(false); // 如无需图表可设为 false(默认 false) $writer->save($new_file);
⚠️ 注意事项:
? 总结:
图片/形状丢失并非 Bug,而是功能边界所致。解决核心是——禁用 Office 2003 兼容模式、升级到稳定新版、避免手动干预绘图逻辑。如业务强依赖复杂图形,建议将 PhpSpreadsheet 用于数据处理,再通过模板引擎(如 Twig + Excel XML 模板)或桌面自动化(Power Automate / Win32::OLE)补全图形导出环节。