一旦工作,那就要努力的干,聪明的干,快速的干——用省下来的时间干自己喜欢干的事情。!

使用PHPOffice的PHPWord的TemplateProcessor生成word时,报word document.xml 名称字符非法位置:部分:/word/document.xml,行:2,列:925564

php lampnick 7362℃ 0评论

使用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

喜欢 (38)or分享 (0)
头像
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址