我有一个任务,我需要在我的.docx
文件中放置占位符,并自动用我拥有的信息替换它们。我尝试将$ {VARNAME}作为占位符语法,但在该docx文件的document.xml中,我看到$,{,VARIABLE和}分为4个不同的字符运行。在什么基础上WORD选择这个。有没有办法让这不会发生?
为了替换占位符和操作docx文件,我使用的是docx4j。我通过XPATH提取w:t
个节点。最近我尝试将占位符语法仅作为$ VARNAME,并且没有解决。我可以认为它是占位符的简单命名约定。如果没有,你能否建议我如何处理这种情况。在docx中引入自定义标签会有帮助吗?任何建议表示赞赏。
答案 0 :(得分:1)
你永远不会假设Word不会分解角色。没有保证的方式。您需要更改提取信息的方法,不依赖于单个<w:t>
标记中的所有内容,或者您需要使用其他类型的“目标”。
Word不支持“自定义标记”,因此这不是一个选项。
更可靠的是使用ContentControl(std标签)。 Word Open XML看起来像这样:
<w:sdt>
<w:sdtPr>
<w:alias w:val="test"/><w:tag w:val="test"/><w:id w:val="803656476"/>
<w:placeholder>
<w:docPart w:val="B4C191A9BCFE488E807F3919BC721619"/>
</w:placeholder>
<w:text/>
</w:sdtPr>
<w:sdtContent>
<w:p>
<w:r>
<w:t>Content to be changed by code.</w:t>
</w:r>
</w:p>
</w:sdtContent>
</w:sdt>
VARNAME可以是w:alias
,也可以是w:tag
(您的选择)。它们分别对应于Word UI和对象模型中的Title和Tag属性。这些都不会被打破。
从那里,你得到<w:t>
元素的<w:sdtContent>
后代。
如果您愿意,可以将内容控件映射到文档中存储的自定义XML部件中的节点。 (与文本中的自定义标记不同,Word 支持支持在文档的Zip包中添加xml文件。)在这种情况下,您的代码可以处理自定义XML文件,而不是文件中的document.xml。为了读/写内容。更改将反映在链接到节点的内容控件中。