我一直试图通过示例FieldMailMerge和VariableReplace工作,但似乎无法运行本地测试用例。我基本上试图从一个docx模板文档开始,并让它从替换变量的那个模板创建x个docx文档。Docx4j - 如何用值替换占位符
在下面的代码docx4jReplaceSimpleTest()
尝试替换单个变量,但未能这样做。作为处理的一部分,模板文件中的$ {}值将被删除,因此我相信它会找到它们,但由于某些原因无法替换它们。我知道这可能是由于格式化,如示例代码的注释中所解释的,但为了解决问题只是为了得到某些工作,我正在尝试使用它。
在下面的代码docx4jReplaceTwoPeopleTest()
,我想要工作,我试图以我认为是正确的方式做到这一点,但那不是找到或取代任何东西。它甚至没有从docx文件中删除$ {}。
public static void main(String[] args) throws Exception
{
docx4jReplaceTwoPeopleTest();
docx4jReplaceSimpleTest();
}
private static void docx4jReplaceTwoPeopleTest() throws Exception
{
String docxFile = "C:/temp/template.docx";
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new java.io.File(docxFile));
List<Map<DataFieldName, String>> data = new ArrayList<Map<DataFieldName, String>>();
Map<DataFieldName, String> map1 = new HashMap<DataFieldName, String>();
map1.put(new DataFieldName("Person.Firstname"), "myFirstname");
map1.put(new DataFieldName("Person.Lastname"), "myLastname");
data.add(map1);
Map<DataFieldName, String> map2 = new HashMap<DataFieldName, String>();
map2.put(new DataFieldName("Person.Firstname"), "myFriendsFirstname");
map2.put(new DataFieldName("Person.Lastname"), "myFriendsLastname");
data.add(map2);
org.docx4j.model.fields.merge.MailMerger.setMERGEFIELDInOutput(OutputField.KEEP_MERGEFIELD);
int x=0;
for(Map<DataFieldName, String> docMapping: data)
{
org.docx4j.model.fields.merge.MailMerger.performMerge(wordMLPackage, docMapping, true);
wordMLPackage.save(new java.io.File("C:/temp/OUT__MAIL_MERGE_" + x++ + ".docx"));
}
}
private static void docx4jReplaceSimpleTest() throws Exception
{
String docxFile = "C:/temp/template.docx";
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new java.io.File(docxFile));
HashMap<String, String> mappings = new HashMap<String, String>();
mappings.put("Person.Firstname", "myFirstname");
mappings.put("Person.Lastname", "myLastname");
MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart();
documentPart.variableReplace(mappings);
wordMLPackage.save(new java.io.File("C:/temp/OUT_SIMPLE.docx"));
}
的DOCX文件包含以下文本(不进行排版):
This is a letter to someone
Hi ${Person.Firstname} ${Person.Lastname},
How are you?
Thank you again. I wish to see you soon ${Person.Firstname}
Regards,
Someone
请注意,我还试图取代Person.Firstname至少两次为好。由于姓氏甚至没有被取代,我不认为这与它有任何关系,但我加入以防万一。
您在此处与VariableReplace在正确的轨道上,但对于FieldMailMerge,您的文档需要包含适当的OpenXML MERGEFIELD结构。请考虑每种方法的单独问题,因为它们完全不同。有关VariableReplace的进一步建议,请解压缩您的输入docx,并在您的问题中包含/word/document.xml部分的内容。如果您从头开始,请考虑内容控制XML数据绑定;其更强大,更强大! – JasonPlutext
我相信我只是想出了为什么。我不是一个Word强大的用户,并没有意识到这是一个你必须创建的领域。我认为这只是一个简单的文本替换切换。我并没有完全意识到差异,所以我为什么要尝试这两种。我将添加一个答案,希望让其他人能够像我一样思考,这是一个必须使用的Word功能,它不仅仅是您键入的文本中的一个简单值,而且还可以提取它。现在我正确理解和欣赏你在代码中的意思! –