4

我有以下情况,需要一些建议:

用户将输入一个word文档作为模板,并在运行时提供一些参数,这样我就可以查询我的数据库并获取数据来填充文档。所以,我需要做两件基本的事情:

  1. 用当前查询行的相应结果替换文档中的每个键。
  2. “合并”(复制?复制?)现有文档未更改到自身(附加),具体取决于我从查询中获得的行数,并将此新副本中的键替换为下一行值。

这样做的最佳方法是什么?我现在已经设法通过使用 unmarshallfromtemplate 为其提供哈希图来完成替换部分。但是这种方式有点棘手,因为我需要在文档中添加“${variable_name}”,有时单词将不同标签中的“${”和“}”分开,导致问题。

我已经阅读了有关自定义 xml 绑定的信息,但并没有完全理解它。我需要生成一个自定义 XML,将其注入文档(所有这些非运行时)并调用 applybindings?? 如果这是真的,我将如何将文档中的字段绑定到 xml ?按名字?

4

1 回答 1

6

docx4j 包括 VariablePrepare,它可以整理您的输入 docx,以便您的密钥不会在单独的运行中拆分。

但是,切换到内容控制数据绑定仍然会更好,特别是如果您有重复数据(例如发票中的行项目)。 披露:我在 docx4j 中支持这种方法。

采用内容控制数据绑定方式:

  1. 构思一种对您的数据有意义的 XML 格式,并编写一些代码将数据库查询的结果转换为该格式。

  2. 修改您的模板,以便将内容控件绑定到 XML 文档中的元素。通常,您会使用Word 的创作加载项来帮助解决此问题。(Microsoft 用于绑定的技术是 XPath,因此您如何绑定取决于您的 XML 结构,但是,是的,您通常会绑定到元素名称或 ID)。

  3. 现在您有了 XML 文件和合适的输入 docx,ContentControlsMergeXML 包含在运行时创建实例文档所需的代码。在https://github.com/plutext/OpenDoPE-WAR上还有一个用于 servlet 环境的版本

作为 1 和 2 的替代方案,当前 nightlies 中还有 org.docx4j.model.datastorage.migration.FromVariableReplacement,它可以转换您现有的“${”文档。虽然只是标准化的目标 XML 格式。

如果您还有其他问题,请访问 http://www.docx4java.org/forums/data-binding-java-f16/专门讨论此主题的论坛

于 2013-03-16T21:12:44.127 回答