PHPSpreadsheet 保存时图片与形状丢失的解决方案

雨芳同学_7312

雨芳同学_7312

2026-02-02

518人浏览

原创

PHPSpreadsheet 保存时图片与形状丢失的解决方案

phpspreadsheet 在读取并保存 excel 文件时,会生成新文件而非直接修改原文件,而部分图像、形状等富媒体元素因底层不支持而被丢弃,需通过启用内存缓存和正确配置写入器来解决。

在使用 PhpSpreadsheet 处理包含图片(如插入的 PNG/JPEG)、形状(如文本框、箭头、自定义图形)的 Excel 文件时,常见问题是在调用 $writer->save() 后,目标工作表(如 Sheet2)中的图像或形状完全消失。根本原因在于:PhpSpreadsheet 并非完整实现 Excel 的所有 OOXML 规范,尤其对 (形状)、(图片)等 DrawingML 相关结构的支持有限;默认情况下,它仅解析并保留单元格数据、样式、公式等核心内容,而跳过绘图层(Drawing Layer)的完整重建。

✅ 正确做法是启用 内存中绘图对象缓存 并禁用不兼容的兼容性模式:

tidy-excel-data
tidy-excel-data

清理、标准化、验证并汇总杂乱的 Excel 工作簿。当 Codex 需要处理 `.xlsx`、`.xls`、`.xlsm` 或 `.csv` 格式的数据时使用,包括:统一表头格式、删除空白行与空白列、修剪文本内容、去重记录、检测数据质量问题、拆分或合并工作表、生成清洗后的工作簿,以及为业务电子表格生成审计摘要。

下载
<?php require __DIR__ . '/vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$origin_file = 'original_with_images.xlsx';

// ✅ 使用 IOFactory 更健壮地加载(自动识别格式)
$spreadsheet = IOFactory::load($origin_file);

// ? 关键:确保绘图对象(图片/形状)被加载到内存
// PhpSpreadsheet 1.23+ 默认已启用,但旧版本建议显式确认
// (无需额外代码,但请确保使用 ≥1.20 版本)

$writer = new Xlsx($spreadsheet);
// ❌ 移除以下两行 —— 它们会破坏兼容性与绘图支持:
// $writer->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);

⚠️ 注意事项:

  • setOffice2003Compatibility(true) 是导致图片消失的最常见原因:该模式会绕过 DrawingML 渲染流程,仅输出 BIFF 格式兼容的极简结构,所有图片/形状均被丢弃;
  • 确保 PhpSpreadsheet 版本 ≥ 1.20(推荐 ≥ 1.26):早期版本(如
  • 图片路径需为相对路径或嵌入二进制流:PhpSpreadsheet 仅支持已嵌入工作簿的图片(即 Excel 中“插入 → 图片”后保存的文件),不支持链接外部图片( 中的嵌入式 rId);
  • 若仍丢失,请检查原始文件是否使用了 Excel 特有功能(如 Ink 签名、3D 模型、SVG 图形),这些目前不受 PhpSpreadsheet 支持。

? 总结:
图片/形状丢失并非 Bug,而是功能边界所致。解决核心是——禁用 Office 2003 兼容模式、升级到稳定新版、避免手动干预绘图逻辑。如业务强依赖复杂图形,建议将 PhpSpreadsheet 用于数据处理,再通过模板引擎(如 Twig + Excel XML 模板)或桌面自动化(Power Automate / Win32::OLE)补全图形导出环节。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.01

4904

5

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2024.08.01

6357

7

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

2024.11.28

2562

7

PHP 命令行脚本与自动化任务开发
PHP 命令行脚本与自动化任务开发

本专题系统讲解 PHP 在命令行环境(CLI)下的开发与应用,内容涵盖 PHP CLI 基础、参数解析、文件与目录操作、日志输出、异常处理,以及与 Linux 定时任务(Cron)的结合使用。通过实战示例,帮助开发者掌握使用 PHP 构建 自动化脚本、批处理工具与后台任务程序 的能力。

2025.12.13

506

14

Figma AI自动化智能数据填充与交互生成实战
Figma AI自动化智能数据填充与交互生成实战

告别机械重复,详细演示如何用 AI 填充业务真实数据,并自动为页面添加交互连线,将静态设计稿快速转变为动态原型。

2026.05.13

345

17

excel对比两列数据异同
excel对比两列数据异同

Excel作为数据的小型载体,在日常工作中经常会遇到需要核对两列数据的情况,本专题为大家提供excel对比两列数据异同相关的文章,大家可以免费体验。

2023.07.25

5801

7

excel重复项筛选标色
excel重复项筛选标色

excel的重复项筛选标色功能使我们能够快速找到和处理数据中的重复值。本专题为大家提供excel重复项筛选标色的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.31

3636

5

excel复制表格怎么复制出来和原来一样大
excel复制表格怎么复制出来和原来一样大

本专题为大家带来excel复制表格怎么复制出来和原来一样大相关文章,帮助大家解决问题。

2023.08.02

3420

3

excel表格斜线一分为二
excel表格斜线一分为二

在Excel表格中,我们可以使用斜线将单元格一分为二。本专题为大家带来excel表格斜线一分为二怎么弄的相关文章,希望可以帮到大家。

2023.08.02

1444

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习