MS-Word 将文本分成字符运行

MS-Word breaking text into character runs

我有一个任务需要在我的 .docx 文件中放置占位符并自动用我拥有的信息替换它们。我尝试将 ${VARNAME} 作为占位符语法,但在该 docx 文件的 document.xml 中,我看到 $、{、VARIABLE 和 } 分为 4 个不同的字符运行。 WORD是根据什么选择这个的。有没有办法避免这种情况?

为了替换占位符和操作 docx 文件,我使用的是 docx4j。我正在通过 XPATH 提取 w:t 节点。最近我尝试将占位符语法仅作为 $VARNAME 并且没有被分解。我可以将其视为占位符的万无一失的命名约定吗?如果不能,你能建议我如何解决这种情况。在 docx 中引入自定义标签会有帮助吗?任何建议表示赞赏。

您可以永远假设 Word 不会拆分字符 运行。没有保证的方法。您要么需要改变提取信息的方法,而不是依赖于单个 <w:t> 标记中的所有内容,要么您需要使用不同类型的 "target"。

Word 不支持 "custom tags",所以这不是一个选项。

更可靠的是使用ContentControl(标准标签)。那个 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:aliasw:tag(您的选择)。它们分别对应于 Word UI 和对象模型中的 Title 和 Tag 属性。这些绝不会被分解。

从那里,您将获得 <w:sdtContent> 元素的 <w:t> 后代。

如果您愿意,可以将内容控件映射到存储在文档中的自定义 XML 部分中的节点。 (与文本中的自定义标签不同,Word 确实 支持在文档的 Zip 包中添加 xml 文件。)在这种情况下,您的代码可以解决自定义 XML 文件,而不是 document.xml 以便 read/write 内容。更改将反映在链接到节点的内容控件中。