
本文详解如何使用 PHPWord 的 TemplateProcessor 类,通过 setComplexValue() 配合 TextRun 实现动态插入带格式(如加粗、下划线)的文本,替代已失效的 XML 手动修改方案。
本文详解如何使用 phpword 的 `templateprocessor` 类,通过 `setcomplexvalue()` 配合 `textrun` 实现动态插入带格式(如加粗、下划线)的文本,替代已失效的 xml 手动修改方案。
在 PHPWord 中,setValue() 方法仅支持纯文本替换,无法直接应用字体样式(如粗体、下划线、颜色等)。若需对模板占位符(如 {student-name})注入富文本内容,必须改用 setComplexValue() 方法,并传入一个 PhpOffice\PhpWord\Element\TextRun 实例——该对象可封装带样式的文本段落。
✅ 正确实现方式:使用 TextRun + setComplexValue
以下代码展示了如何将 'Alex' 以加粗 + 单线下划线形式插入到模板中名为 student-name 的占位符位置:
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' => '0000FF', // 可选:十六进制字体颜色(如蓝色)
'size' => 24 // 可选:字号(单位为半磅,即 12pt ≈ 24)
]);
// 使用 setComplexValue 替换占位符(注意:键名不带花括号)
$document->setComplexValue('student-name', $word);
$document->saveAs(public_path("documents/test.docx"));⚠️ 关键注意事项:
- setComplexValue() 的第一个参数是占位符名称(如 student-name),不能包含 {};
- TextRun::addText() 的第二个参数是样式数组,支持 bold, italic, underline, color, size, name(字体)等常用属性;
- underline 值必须为字符串(如 'single'),不可写作布尔值 true;
- 若模板中占位符位于表格单元格、文本框或页眉页脚内,setComplexValue 同样适用,但需确保占位符语法正确且未被嵌套破坏。
❌ 为什么手动拼接 XML 是危险的?
你尝试的 makeWordBold() 函数试图直接构造 WordProcessingML 片段并注入 XML,这种方式极易出错:
立即学习“PHP免费学习笔记(深入)”;
- DOCX 是 ZIP 压缩包,内部含多个 XML 文件(如 document.xml, styles.xml),单独修改某处会导致结构不一致;
- 缺少命名空间声明(如 w: 前缀需绑定 http://schemas.openxmlformats.org/wordprocessingml/2006/main);
- 未同步更新 rPr(运行属性)与 t(文本)的父子关系及顺序,引发 Office 打开报错或文档损坏。
PHPWord 的 TextRun 和 setComplexValue 已封装底层 XML 构建逻辑,是唯一官方推荐且稳定可靠的富文本模板替换方案。
✅ 补充技巧:批量设置多格式文本
你还可以在一个 TextRun 中追加多个 addText() 调用,实现混合样式:
$word = new TextRun();
$word->addText('Alex ', ['bold' => true, 'color' => '0066CC']);
$word->addText('Smith', ['italic' => true, 'underline' => 'single']);
// 最终显示为:「Alex Smith」——前者蓝粗体,后者斜体+下划线
$document->setComplexValue('full-name', $word);掌握 TextRun 与 setComplexValue 的组合用法,即可安全、灵活地在 PHPWord 模板中实现专业级格式化输出,彻底告别脆弱的 XML 字符串操作。



















