为什么 Office OpenXML 在标签之间拆分文本以及如何防止它?

j0h*_*hny 4 docx openxml phpword

我目前正在尝试使用PHPWord库及其模板系统处理 docx 文件。我已经找到并更新了这个库的路径(不记得名字,但它不重要)可以处理表(复制它的行,然后在每一行上使用 PHPWord 的标准 setValue())。

如果我创建自己的文档,xml中的数据是正常结构,所以要替换的变量 ${variable} 在它自己的标签中,如下所示:

<w:tbl>
    <w:tr>
        ...
         ${variable}
    </w:tr>
</w:tbl>
Run Code Online (Sandbox Code Playgroud)

我简化了代码,在实际代码中还有许多其他标签描述大小、样式等。

我的问题是我必须从其他人那里处理文件,我被禁止进行重大更改,我得到了一份文件,其中在某些时候它们是一个带有一个空白行的表格。我添加了 ${variable} 变量并通过 PHPWord 运行它。问题是,它失败了。经过一番研究,我发现源 XML 如下所示:

    ....
        ...
         ${va

        ...
         riab

        ...
         le}
    ....
Run Code Online (Sandbox Code Playgroud)

(再次大大简化,但你得到了图片)

这种结构对我来说是个问题,因为克隆行的函数使用 strpos()、substr() 和正则表达式来工作,并且不适用于这种结构(我无法想象这样做的优雅方式)。

所以问题是 - 有谁知道为什么 docx 这样做以及如何阻止他?我正在通过 word 而不是 PHP 寻找解决方案(我需要当前的函数无需太多编辑即可工作)

edi*_*999 5

我已经解决了很多这个问题:

在word中,文档可以这样保存

  <w:t>{</w:t>...
  <w:t>variable</w:t>
  <w:t>}</w:t>
Run Code Online (Sandbox Code Playgroud)

因此,我创建了一个 JS 库,即使变量名被拆分也能正常工作:Docxtemplater (works server side too) 。我在开发过程中发现,如果出现以下情况,变量名称不会被拆分:

  • 要查找的文本仅由 a-zA-Z 字符组成(无 {、$ 或 })
  • 如果文本不是一笔写成,则文本可能会被拆分:例如,如果您拼写错误,并写入 ${varuable} ,然后进行编辑 -> ${variable},则 xml 中的文本为很有可能会被分裂。基本上你必须一笔写出你的变量名,如果你想编辑一个,完全重写变量名。

我认为没有办法在 Word 中使用一个命令修复 docx 文档,但是重写变量以在一个 Stroke 中写入它们应该可行。