docx4j不替换变量

时间:2013-06-13 17:51:08

标签: docx4j

我刚刚在docx4j 2.8.1的VariableReplace示例中遵循了第2步,它所做的一切就是删除变量标记$ {}。

我做的步骤:

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

我只期待'TEST',并且在输出文档中没有标记时只获得'变量'。

3 个答案:

答案 0 :(得分:22)

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

使用VariablePrepare

进行修复

在实例化WordprocessingMLPackage之后放入此行:

VariablePrepare.prepare(wordMLPackage);

然后,您可以使用映射替换变量。

答案 1 :(得分:1)

我意识到这是一个旧帖子,但是对于其他偶然发现这个问题的人来说,如果你的HashMap中有不正确的“键”,你可以得到这个结果的另一个原因。所以在我的情况下,我使用旧的xml格式作为关键,如

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

当我应该使用时:

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

文档本身使用的标签如

${variable}

如果找到匹配项,VariableReplace代码将删除$ {}格式。因此,如果找不到匹配项,那么由于某种原因,密钥可能与文档中的密钥不匹配,这可能与VariablePrepare没有严格的关系。但这对我来说是一个非常有用的帖子,因为VariablePrepare,VariableReplace解决方案现在正在为我的目的而工作。

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

答案 2 :(得分: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