docx4j:使用 docx 模板并替换 MergeField 变量的值

docx4j: Use docx template and replace value of MergeField variable

所以我正在尝试使用 docx4j。我制作了一个简单的模板,使用它并以编程方式替换 th 值。

这是我的 docx 模板。

My Name is «myName»
I’m «myAge» years old.
My address is «myAddress»

当我点击切换字段代码时,它看起来像这样。

My Name is {MERGEFIELD myName \* MERGEFORMAT}
I’m {MERGEFIELD myAge \* MERGEFORMAT} years old.
My address is {MERGEFIELD myAddress \* MERGEFORMAT}

我不知道 MERGEFIELD 的用途,但我尝试使用它只是因为那是互联网上目前使用的 post。

这是我的代码。

def config = grailsApplication.config.template.invoiceSample as Map
def String templateFileName = "${grailsApplication.config.template.dir}/${config.doc.templateFileName}"
WordprocessingMLPackage template = WordprocessingMLPackage.load(new File(templateFileName));

Map<DataFieldName, String> map = new HashMap<DataFieldName, String>();
map.put(new DataFieldName("@myName"),"Jean");
map.put(new DataFieldName("@myAge"),"30");  
map.put(new DataFieldName("@myAddress"),"Sampaloc");  

org.docx4j.model.fields.merge.MailMerger.setMERGEFIELDInOutput(MailMerger.OutputField.KEEP_MERGEFIELD);
org.docx4j.model.fields.merge.MailMerger.performMerge(template, map, false);

template.save(new File("C:/temp/OUT_SIMPLE.docx") );

但是,它不会替换输出文件中的值。你能告诉我我的代码有什么问题吗?

我发现这个问题很容易解决。

基本上这一行会影响输出。

MailMerger.setMERGEFIELDInOutput(MailMerger.OutputField.KEEP_MERGEFIELD);

根据我的观察,这些选项执行以下操作:

  • MailMerger.OutputField.KEEP_MERGEFIELD - 用值替换该字段,但您需要单击切换字段代码才能显示它。
  • MailMerger.OutputField.REMOVED - 代码将消失,但最重要的是,无需单击切换字段代码
  • 即可替换该值
  • MailMerger.OutputField.AS_FORMTEXT_REGULAR - 老实说我不知道​​它是做什么的,它只是在单词中显示 {FORMTEXT}。
  • MailMerger.OutputField.DEFAULT - 对 REMOVED 做同样的事情。

如果您认为我说错了,请随时更新我的​​回答。