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ù.
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
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème et bien sûr je ne pouvais pas forcer l'utilisateur à faire quelques trucs supplémentaires lors de la rédaction de leur document word j'ai donc décidé de simplement écrire un algo de numériser l'ensemble du document pour les expressions ajoutant tirage après tirage, l'insertion de la valeur de remplacement et suppression d'expressions dans la deuxième manche. Dans le cas où d'autres personnes peuvent avoir besoin de il ci-dessous est ce que j'ai fait. J'ai eu la classe à partir de quelque part, donc il peut être familier. Je viens d'ajouter la méthode searchAndReplace()
OriginalL'auteur demotics2002
Le problème est que j'ai essayé de créer les espaces réservés en tant que tout simplement texte dans le fichier docx. Ce que je fais de la place, c'est à l'aide de la MergeField fonctionnalités au sein de Mot que je n'arrivais pas à bien comprendre et d'apprécier, d'où la confusion. Fondamentalement, je ne savais pas que c'est ce qui est signifié dans la documentation, car je n'avais jamais utilisé, j'ai juste supposé que c'était encore une sorte de xml texte de remplacement.
Cela étant dit, il est encore assez difficile de trouver une bonne explication de ce Mot fonctionnalité. Après avoir regardé quelques dizaines d'explications je n'ai toujours pas trouver un bien propre explication de ce Mot fonctionnalité. La meilleure explication que j'ai pu trouver peut être trouvé ici. Fondamentalement, vous voulez faire l'Étape 3.
Cela étant dit, une fois que j'ai créé MergeFields dans Word et couru le code, il a parfaitement fonctionné. La méthode à utiliser est
docx4jReplaceTwoPeopleTest
. Le problème n'était pas dans le code mais dans ma compréhension de la façon dont il a travaillé au sein de Word.word\document.xml
. Juste au cas où vous changez d'avis.OriginalL'auteur Stephane Grenier