
本文介绍使用 PHPWord 的 TemplateProcessor 实现动态文本(如 student-name)的富文本格式化,重点演示通过 setComplexValue() 结合 TextRun 为替换内容添加加粗、下划线等样式,替代已失效的 XML 手动修改方案。
本文介绍使用 phpword 的 templateprocessor 实现动态文本(如 `student-name`)的富文本格式化,重点演示通过 `setcomplexvalue()` 结合 `textrun` 为替换内容添加加粗、下划线等样式,替代已失效的 xml 手动修改方案。
在 PHPWord 中,TemplateProcessor::setValue() 仅支持纯文本替换,无法直接应用字体样式(如加粗、下划线、颜色等)。若需对模板占位符(如 {student-name})注入带格式的文本,必须使用 setComplexValue() 方法,并传入一个 PhpOffice\PhpWord\Element\TextRun 实例——这是官方推荐且稳定可靠的现代方案(兼容 PHPWord v1.0+)。
✅ 正确实现方式:使用 TextRun + setComplexValue
以下代码将 student-name 占位符替换为加粗且单线下划线的「Alex」:
use PhpOffice\PhpWord\TemplateProcessor;
use PhpOffice\PhpWord\Element\TextRun;
$path = public_path() . "/example/dogovor.docx";
$document = new TemplateProcessor($path);
// 创建带样式的 TextRun
$word = new TextRun();
$word->addText('Alex', [
'bold' => true, // 加粗
'underline' => 'single', // 单线下划线(可选值:'none', 'single', 'double', 'words')
'color' => '2E74B5', // 可选:十六进制颜色(如深蓝)
'size' => 24, // 可选:字号(单位为半磅,即 12pt ≈ 24)
]);
// 使用 setComplexValue 替换占位符(注意:键名不带花括号)
$document->setComplexValue('student-name', $word);
$document->saveAs(public_path("documents/test.docx"));
⚠️ 关键注意事项:
- 占位符在 Word 模板中应写作 {student-name},但 setComplexValue() 的第一个参数必须省略花括号(即 'student-name',而非 '{student-name}');
- TextRun 支持链式添加多个文本片段(如混合普通/加粗/红色文字),适用于复杂排版;
- 切勿手动解析或修改 .docx 内部 XML —— 这极易破坏 ZIP 结构或 OpenXML 格式,导致文档损坏(如原文中 XML 字符串拼接方案);
- 确保模板文件为 .docx(非 .dotx 或旧版 .doc),且占位符未被意外转换为域代码或锁定内容。
? 补充技巧:批量设置与样式复用
若需多处应用相同样式,建议封装样式数组:
$strongStyle = ['bold' => true, 'underline' => 'single', 'color' => 'C00000'];
$document->setComplexValue('student-name', (new TextRun())->addText('Alex', $strongStyle));
$document->setComplexValue('teacher-name', (new TextRun())->addText('Dr. Smith', $strongStyle));
✅ 总结
- ✅ 推荐:setComplexValue() + TextRun::addText() 是当前最健壮、可维护的富文本模板填充方案;
- ❌ 避免:直接操作 XML、正则替换
标签或自定义字符串拼接 —— 兼容性差、易出错; - ? 提示:PHPWord 官方文档中 TextRun 支持更多高级特性(如超链接、脚注、字符间距),可按需查阅 TextRun API。
通过上述方法,你不仅能安全实现加粗与下划线,还能无缝扩展字体、颜色、大小等样式,真正发挥 PHPWord 模板引擎的专业能力。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











