Docx4j - Как заменить заполнитель значением
Я пытался работать с примерамиFieldMailMerge а такжеVariableReplace но не могу запустить локальный тестовый пример. Я в основном пытаюсь начать с одного документа шаблона docx и заставить его создавать документы x docx из этого одного шаблона с заменой переменных.
В коде ниже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 как минимум вдвое. Поскольку фамилия даже не заменена, я не думаю, что это как-то связано с этим, но я добавляю ее на всякий случай.