Docx4j - Comment remplacer l'espace réservé à la valeur

Je suis en train d'essayer de travailler à travers les exemples FieldMailMerge et VariableReplace mais n'arrive pas à obtenir un local de cas de test en cours d'exécution. J'essaie de démarrer avec un docx modèle de document et la création de x docx documents de ce modèle avec les variables remplacé.

Dans le code ci-dessous docx4jReplaceSimpleTest() essaie de remplacer une seule variable, mais ne parvient pas à le faire. Le ${} les valeurs dans les fichiers de modèle sont supprimés dans le cadre du traitement donc je crois que c'est de les trouver, mais pas de les remplacer pour une raison quelconque. Je comprends bien, il pourrait être dû à la mise en forme, comme expliqué dans les commentaires de l'exemple de code mais pour le dépannage juste pour avoir quelque chose à travailler, je suis en train d'essayer de toute façon.

Dans le code ci-dessous docx4jReplaceTwoPeopleTest(), celui que je veux travailler, je suis en train de faire dans ce qui je crois est la bonne façon, mais ce n'est pas de trouver ou de remplacer quoi que ce soit. Il n'est même pas enlever le ${} du fichier 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") );
}

Le fichier docx comprend le texte suivant (pas de formatage est fait):

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

Avis que je suis aussi en train de remplacer Personne.Prénom au moins deux fois aussi bien. Comme le nom n'est même pas remplacé, je ne pense pas que cela a quelque chose à voir avec cela, mais je suis en ajoutant juste au cas où.

Vous êtes sur la bonne voie avec VariableReplace, mais pour FieldMailMerge, votre document doit contenir le bon OpenXML MERGEFIELD structures. Veuillez envisager de séparer les questions pour chaque approche, car ils sont totalement différents. Pour plus de conseils re VariableReplace s'il vous plaît ouvrez vos commentaires docx, et d'inclure le contenu de son /word/document.xml partie à votre question. Si vous partez de zéro, veuillez tenir compte de contrôle du contenu de la liaison de données XML; son plus puissant et plus robuste!
Je crois que je viens de comprendre pourquoi. Je ne suis pas un Word les utilisateurs de puissance et ne réalisent pas que c'est un champ que vous avez créer. Je pensais que c'était juste un simple remplacement de texte bascule. Je n'ai pas d'apprécier pleinement la différence, c'est pourquoi j'ai essayé les deux. Je vais ajouter une réponse qui, nous l'espérons laisser à d'autres qui pensent de la même façon que moi à comprendre que c'est un Mot fonctionnalité, vous devez utiliser et ce n'est pas seulement une simple valeur dans le texte que vous tapez et il le ramasse. Maintenant je bien comprendre et apprécier ce que vos commentaires dans le code signifie!!

OriginalL'auteur Stephane Grenier | 2013-12-10