如何使用PhpWord的Template Processor处理复杂段落及添加非简单值内容?
使用PhpWord Template Processor处理复杂内容与扩展数据填充
一、处理表格、图片、链接等复杂段落
Template Processor的replaceXmlBlock方法是处理复杂内容的核心——它允许你用自定义的OOXML片段替换模板中的占位符。具体操作如下:
1. 处理表格
先通过PhpWord生成目标表格,导出其XML代码后,替换模板中的占位符(比如${complex_table}):
// 临时创建PhpWord对象生成表格 $tempPhpWord = new PhpWord(); $tempSection = $tempPhpWord->addSection(); $table = $tempSection->addTable(); // 构建表格内容 $table->addRow(); $table->addCell(2000)->addText('用户姓名'); $table->addCell(2000)->addText('联系方式'); $table->addRow(); $table->addCell(2000)->addText('张三'); $table->addCell(2000)->addText('138xxxx1234'); // 导出表格的XML片段 $xmlWriter = new \PhpOffice\PhpWord\Writer\Word2007\Element\Table($table); $tableXml = $xmlWriter->write(); // 替换模板中的占位符 $templateProcessor->replaceXmlBlock('complex_table', $tableXml);
2. 处理图片
用setImageValue直接替换模板中的图片占位符(比如${user_avatar}),支持自定义尺寸、比例:
$templateProcessor->setImageValue('user_avatar', [ 'path' => resource_path('uploads/avatar.jpg'), 'width' => 180, 'height' => 180, 'ratio' => false // 关闭自动比例,强制使用设置的宽高 ]);
3. 处理带链接的文本
手动编写符合OOXML规范的链接XML片段,替换模板中的占位符(比如${website_link}):
$linkXml = '<w:p><w:r><w:rPr><w:rStyle w:val="Hyperlink"/></w:rPr><w:hyperlink w:anchor="https://your-site.com"><w:r><w:rPr><w:color w:val="0000FF" w:themeColor="hyperlink"/><w:u w:val="single"/></w:rPr><w:t>访问我的官网</w:t></w:r></w:hyperlink></w:r></w:p>'; $templateProcessor->replaceXmlBlock('website_link', $linkXml);
二、添加除简单值之外的内容
除了基础的setValue,Template Processor还支持以下扩展填充方式:
1. 重复区块(比如循环表格行)
模板中标记重复块(比如${data_row}),用cloneBlock克隆对应次数,再填充带序号的占位符:
// 模拟数据 $userList = [ ['name' => '张三', 'email' => 'zhangsan@example.com'], ['name' => '李四', 'email' => 'lisi@example.com'] ]; // 克隆重复块,参数:占位符、克隆次数、是否保留原块、是否自动生成序号 $templateProcessor->cloneBlock('data_row', count($userList), false, true); // 填充每一行的内容 foreach ($userList as $index => $user) { $templateProcessor->setValue('name#' . ($index + 1), $user['name']); $templateProcessor->setValue('email#' . ($index + 1), $user['email']); }
2. 富文本(带格式的文本)
如果需要带字体、颜色、加粗等格式的文本,同样可以用replaceXmlBlock,先生成富文本的XML:
// 生成带格式的文本XML $richTextXml = '<w:p><w:r><w:rPr><w:b/><w:color w:val="FF0000"/></w:rPr><w:t>这是加粗的红色文本</w:t></w:r></w:p>'; $templateProcessor->replaceXmlBlock('rich_text', $richTextXml);
修正你的代码示例
你原来的代码同时初始化了TemplateProcessor和IOFactory加载文档,属于冗余操作。正确的做法是全程用TemplateProcessor处理模板:
// 初始化模板处理器 $templateProcessor = new TemplateProcessor(resource_path('prints/form.docx')); // 填充简单值 $templateProcessor->setValue('date-now', Carbon::now()->format('Y-m-d H:i:s')); $templateProcessor->setValue('title', $title); // 在这里添加表格、图片、链接等复杂内容的处理逻辑(参考上面的示例) // 保存处理后的文档 $templateProcessor->saveAs(storage_path('app/processed_form.docx'));
内容的提问来源于stack exchange,提问作者DaveLV2
相关产品推荐
相关产品推荐

