10

我只是遵循 docx4j 2.8.1 中的VariableReplace示例中的方法 2,它所做的一切就是删除变量标记 ${}。

我做的步骤:

  • 打开 Word 2013,键入 ${variable} 仅作为文本
  • 保存到某个地方
  • 在我的 Java 程序中阅读它并使用 .put("variable", "TEST"); 构建我的 HashMap;
  • 其他代码是从上面的示例中复制和粘贴的。
  • 保存了文档

我只希望'TEST',并且只得到'variable'而没有输出文档中的标记。

4

3 回答 3

28

毫无疑问,Word 正在使用语法或拼写标志在运行中拆分您的“变量”。

使用VariablePrepare修复它

在实例化 WordprocessingMLPackage 后放入这一行:

VariablePrepare.prepare(wordMLPackage);

然后你可以使用你的映射来替换变量。

于 2013-06-17T08:40:35.677 回答
2

我意识到这是一篇旧帖子,但对于其他偶然发现此问题的人来说,您可以获得此结果的另一个原因是您的 HashMap 中有不正确的“键”。所以就我而言,我使用旧的 xml 格式作为键

.put("<variable/>","TEST");

当我应该使用时:

.put("variable","TEST");

文档本身使用的标签如

${variable}

无论是否找到匹配项,VariableReplace 代码都会删除 ${} 格式。因此,如果它没有找到匹配项,那么键可能由于某种原因与文档中的键不匹配,这可能与 VariablePrepare 没有严格的关系。但这对我来说是一个非常有用的帖子,因为 VariablePrepare、VariableReplace 解决方案现在可以满足我的目的。

此外,我不确定即使是 VariablePrepare 也可以处理您更改文档中标签中间的字体、突出显示或其他格式的情况。在这种情况下,它将无法将标签合并到一次运行中,因此标签识别可能会失败。

于 2013-08-19T22:01:33.170 回答
0

变量不能被替换的主要原因是:使用纯文本${name}代替MERGEFIELD字段类型。这是如何将 MERGEFIELD 添加到文档中的链接 - https://www.systemonesoftware.com/en/support/article/38-merge-fields-in-word-for-windows

您也可以将 docx-stamper 与 SpEL 一起使用 - https://github.com/thombergs/docx-stamper

于 2019-10-13T12:28:59.520 回答