使用PHPOffice的PHPWord的TemplateProcessor生成word时,报word document.xml 名称字符非法位置:部分:/word/document.xml,行:2,列:925564
原因是因为PHPWord的setValue()方法没有对需要替换的字符串进行转义或者说没有放在CDATA中,造成了word解析xml失败。打不开word.
public function setValue($search, $replace, $limit = self::MAXIMUM_REPLACEMENTS_DEFAULT)
解决方案:
对传入的$replace进行转义或者使用CDATA包起来。
为了一劳永逸,所以我是直接修改的PHPWord的\PhpOffice\PhpWord\TemplateProcessor::setValue此方法
public function setValue($search, $replace, $limit = self::MAXIMUM_REPLACEMENTS_DEFAULT, $useCDATA = true)
{
//放到一个CDATA节里面,但是可能造成用户输入xml标签则不会被解析
if (is_array($search)) {
foreach ($search as &$item) {
$item = self::ensureMacroCompleted($item);
}
} else {
$search = self::ensureMacroCompleted($search);
}
if (is_array($replace)) {
foreach ($replace as &$item) {
if ($useCDATA) {
$item = '<![CDATA[' . $item . ']]>';
}
$item = self::ensureUtf8Encoded($item);
}
} else {
if ($useCDATA) {
$replace = '<![CDATA[' . $replace . ']]>';
}
$replace = self::ensureUtf8Encoded($replace);
}
...
}
转载请注明:MitNick » 使用PHPOffice的PHPWord的TemplateProcessor生成word时,报word document.xml 名称字符非法位置:部分:/word/document.xml,行:2,列:925564