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

时间:2013-07-17 13:45:53

标签: openxml docx phpword

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

如果我创建自己的文档,xml中的数据是正常结构,因此要替换的变量$ {variable}就是这样的标记:

<w:tbl>
    <w:tr>
        ...
         ${variable}
    </w:tr>
</w:tbl>

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

我的问题是我必须从其他人处理文件,我被禁止做出重大改变,我得到一份文件,在某些时候他们是一张有一个空白行的表。我添加$ {variable}变量并通过PHPWord运行它。问题是,它失败了。在做了一些研究之后,我发现源XML看起来像这样:

    ....
        ...
         ${va

        ...
         riab

        ...
         le}
    ....

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

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

所以问题是 - 有人知道为什么docx这样做以及如何预防他?我正在寻找一个解决方案,而不是PHP(我需要当前的功能,而不需要太多编辑)

3 个答案:

答案 0 :(得分:3)

我经常处理这个问题:

简而言之,文档可以像这样保存

  <w:t>{</w:t>...
  <w:t>variable</w:t>
  <w:t>}</w:t>

因此我创建了一个JS库,即使分割了变量名也可以工作:DocXgenjs(也适用于服务器端)。我在开发过程中发现的是,如果出现以下情况,变量名称不会被拆分:

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

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

答案 1 :(得分:0)

Word出于某些原因这样做,例如在基于rsid-number(http://blogs.msdn.com/b/brian_jones/archive/2006/12/11/what-s-up-with-all-those-rsids.aspx)合并文档时标记拼写错误或跟踪更改并获得更好的结果。

在这里,您可以找到一个解决方案来清理文档:https://stackoverflow.com/a/7768161

答案 2 :(得分:0)

此的主要原因是proofErr元素。因此,Word会识别出它认为拼写错误的内容,并将其包装在<w:proofErr>元素中,从而不可避免地会分割原始文本。

如果您遇到这种情况,我建议您这样做,这很乏味,但却是唯一可以确保成功的方法:

  1. .docx重命名为.zip
  2. 提取档案内容。
  3. 打开word\document.xml
  4. 进行更正(即,将拆分后的文本放在一起)并保存。
  5. .zip重命名为.docx
  

编辑

     

Visual Studio Extension可让您直接编辑OpenXML包的内容。这使您可以跳过步骤1和2。