我目前正在尝试使用 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(我需要当前的功能,而不需要太多编辑)
答案 0 :(得分:3)
我经常处理这个问题:
简而言之,文档可以像这样保存
<w:t>{</w:t>...
<w:t>variable</w:t>
<w:t>}</w:t>
因此我创建了一个JS库,即使分割了变量名也可以工作:DocXgenjs(也适用于服务器端)。我在开发过程中发现的是,如果出现以下情况,变量名称不会被拆分:
我认为没有办法在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>
元素中,从而不可避免地会分割原始文本。
如果您遇到这种情况,我建议您这样做,这很乏味,但却是唯一可以确保成功的方法:
.docx
重命名为.zip
。word\document.xml
。.zip
重命名为.docx
。编辑
此Visual Studio Extension可让您直接编辑OpenXML包的内容。这使您可以跳过步骤1和2。