我一直試圖通過示例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功能,它不僅僅是您鍵入的文本中的一個簡單值,而且還可以提取它。現在我正確理解和欣賞你在代碼中的意思! –