我只是遵循 docx4j 2.8.1 中的VariableReplace示例中的方法 2,它所做的一切就是删除变量标记 ${}。
我做的步骤:
- 打开 Word 2013,键入 ${variable} 仅作为文本
- 保存到某个地方
- 在我的 Java 程序中阅读它并使用 .put("variable", "TEST"); 构建我的 HashMap;
- 其他代码是从上面的示例中复制和粘贴的。
- 保存了文档
我只希望'TEST',并且只得到'variable'而没有输出文档中的标记。
我只是遵循 docx4j 2.8.1 中的VariableReplace示例中的方法 2,它所做的一切就是删除变量标记 ${}。
我做的步骤:
我只希望'TEST',并且只得到'variable'而没有输出文档中的标记。
毫无疑问,Word 正在使用语法或拼写标志在运行中拆分您的“变量”。
在实例化 WordprocessingMLPackage 后放入这一行:
VariablePrepare.prepare(wordMLPackage);
然后你可以使用你的映射来替换变量。
我意识到这是一篇旧帖子,但对于其他偶然发现此问题的人来说,您可以获得此结果的另一个原因是您的 HashMap 中有不正确的“键”。所以就我而言,我使用旧的 xml 格式作为键
.put("<variable/>","TEST");
当我应该使用时:
.put("variable","TEST");
文档本身使用的标签如
${variable}
无论是否找到匹配项,VariableReplace 代码都会删除 ${} 格式。因此,如果它没有找到匹配项,那么键可能由于某种原因与文档中的键不匹配,这可能与 VariablePrepare 没有严格的关系。但这对我来说是一个非常有用的帖子,因为 VariablePrepare、VariableReplace 解决方案现在可以满足我的目的。
此外,我不确定即使是 VariablePrepare 也可以处理您更改文档中标签中间的字体、突出显示或其他格式的情况。在这种情况下,它将无法将标签合并到一次运行中,因此标签识别可能会失败。
变量不能被替换的主要原因是:使用纯文本${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