PHP 基于模板动态生成 Word 文档:图片 + 表格数据填充全方案(PHPOffice 实战)
在企业级应用中,经常需要根据模板批量生成标准化 Word 文档(如合同、报表、证明等),且需支持文本替换、表格动态生成、图片插入等功能。本文基于 PHPOffice/PHPWord 库,通过封装工具函数 writeDocxByTemplate,实现「模板驱动 + 动态数据填充」的 Word 生成方案,适用于各类业务场景。
一、技术栈与核心依赖
核心库: PHPOffice/PHPWord(PHP 处理 Word 文档的主流库,支持模板替换、图片插入、表格操作等)
功能目标:
- 文本内容批量替换
- 动态生成表格(支持多行数据克隆)
- 图片插入(支持模板占位符替换)
- 兼容 .docx 格式模板
二、环境准备:安装 PHPWord
首先通过 Composer 安装 PHPOffice/PHPWord:
composer require phpoffice/phpword
注意:PHP 版本需 ≥ 7.1,且确保 php_zip、php_xml 等扩展已启用(处理 Word 文档依赖)。
三、核心实现:通用 Word 生成函数
封装 writeDocxByTemplate 函数,实现「文本 + 表格 + 图片」的一站式填充。函数逻辑如下:
1. 函数完整代码
/*** 根据 Word 模板生成文档(支持文本、表格、图片填充)* @param string $fileName 生成的文件名(含路径,如 'output.docx')* @param string $template 模板路径(如 'template.docx')* @param array $datas 填充数据(格式:['占位符' => '替换值' 或 数组/图片路径])* @return string 生成的文件路径*/
function writeDocxByTemplate($fileName, $template, $datas)
{// 初始化模板处理器$templateProcessor = new \PhpOffice\PhpWord\TemplateProcessor($template);foreach ($datas as $key => $value) {// 处理图片(键名以 'img' 开头,如 'imgLogo' 对应模板中的 ${Logo})if (substr($key, 0, 3) === 'img') {$placeholder = substr($key, 3); // 提取占位符(如 'Logo')if (!empty($value)) {// 插入图片(调用自定义图片处理函数)setWordImageValue($templateProcessor, $placeholder, $value);} else {// 图片为空时,用空格替换占位符(避免残留 ${xxx})$templateProcessor->setValue($placeholder, ' ');}} // 处理数组(通常为表格数据,需要克隆行)elseif (is_array(