【问题标题】:docx4j does not replace variablesdocx4j 不替换变量
【发布时间】:2013-06-10 05:38:11
【问题描述】:

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

我做的步骤:

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

我只希望得到“TEST”,而在输出文档中只得到没有标记的“变量”。

【问题讨论】:

  • 提供的链接是 404'ed

标签: docx4j


【解决方案1】:

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

VariablePrepare修复它

在你实例化 WordprocessingMLPackage 之后加入这一行:

VariablePrepare.prepare(wordMLPackage);

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

【讨论】:

  • 这是正确答案。我和马丁有同样的问题,我花了一个多小时来做这么简单的事情:(
  • 这可是救命稻草!
  • 嗨 JasonPlutext 为什么我无法使用变量prepare 在内容控件中添加runs(R)?。使用那个类可以做到吗?如果是,怎么做,如果不是,你的想法是什么。
  • VariablePrepare 的链接断开了 - 我找到了这个链接 javatips.net/api/docx4j-master/src/main/java/org/docx4j/model/…
【解决方案2】:

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

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

我应该在什么时候使用:

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

文档本身使用了类似的标签

${variable}

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

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

【讨论】:

    【解决方案3】:

    变量不能被替换的主要原因是: 使用像${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

    【讨论】:

      猜你喜欢
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      • 2018-11-22
      • 1970-01-01
      相关资源
      最近更新 更多