PhpOffice\PhpWord 1.2.0:TemplateProcessor添加编号列表项失败致文件损坏
解决PhpOffice\PhpWord 1.2.0 TemplateProcessor添加编号列表导致文件损坏的问题
问题根源
直接用Section包裹ListItem后提取元素替换模板变量,会破坏Word文档的XML结构;同时原模板块定义错误(重复块标记),最终导致OpenOffice解析失败。
修正步骤
1. 修复Word模板的块结构
将原模板内容修改为:
${responsibilitiesItems}
${responsibilityItem}
${/responsibilitiesItems}
2. 调整代码逻辑(移除Section依赖)
直接创建ListItem实例替换模板变量,无需通过Section中转:
use PhpOffice\PhpWord\Element\ListItem; if (!empty($params['responsibilitiesItems'])) { $cnt = count($params['responsibilitiesItems']); // 克隆对应数量的模板块 $templateProcessor->cloneBlock('responsibilitiesItems', $cnt, true, true); foreach ($params['responsibilitiesItems'] as $index => $itemText) { $itemNum = $index + 1; // 直接生成编号列表项 $listItem = new ListItem( $itemText, 0, ['italic' => true, 'color' => 'red'], ListItem::TYPE_NUMBER ); // 替换对应序号的复杂变量 $templateProcessor->setComplexValue("responsibilityItem#{$itemNum}", $listItem); } }
3. 额外注意事项
- PhpWord 1.2.0对复杂元素支持有限,避免用
Section作为中间载体传递单个元素。 - 优先用Microsoft Word打开生成的文档验证格式,再用OpenOffice测试(OpenOffice对部分Word XML结构解析更严格)。
内容的提问来源于stack exchange,提问作者Dmitriy
相关产品推荐
相关产品推荐

