docx4j rechercher et remplacer
J'ai docx document avec quelques espaces réservés. Maintenant, je dois les remplacer par d'autres et d'enregistrer de nouveaux documents docx. J'ai commencé avec docx4j et trouvé cette méthode:
public static List<Object> getAllElementFromObject(Object obj, Class<?> toSearch) {
List<Object> result = new ArrayList<Object>();
if (obj instanceof JAXBElement) obj = ((JAXBElement<?>) obj).getValue();
if (obj.getClass().equals(toSearch))
result.add(obj);
else if (obj instanceof ContentAccessor) {
List<?> children = ((ContentAccessor) obj).getContent();
for (Object child : children) {
result.addAll(getAllElementFromObject(child, toSearch));
}
}
return result;
}
public static void findAndReplace(WordprocessingMLPackage doc, String toFind, String replacer){
List<Object> paragraphs = getAllElementFromObject(doc.getMainDocumentPart(), P.class);
for(Object par : paragraphs){
P p = (P) par;
List<Object> texts = getAllElementFromObject(p, Text.class);
for(Object text : texts){
Text t = (Text)text;
if(t.getValue().contains(toFind)){
t.setValue(t.getValue().replace(toFind, replacer));
}
}
}
}
Mais qui ne fonctionnent que rarement parce que généralement les espaces réservés divise sur plusieurs textes s'exécute.
J'ai essayé UnmarshallFromTemplate mais ça marche rarement.
Comment ce problème pourrait être résolu?
OriginalL'auteur luckyi | 2013-10-30
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
VariableReplace
pour réaliser ce qui n'existait pas à l'époque de l'autre des réponses.Ce n'est pas de faire un rechercher/remplacer en soi, mais des travaux sur les espaces réservés par exemple
$(myField)
Noter que vous ne passez pas
$(myField)
que le nom du champ; au lieu de passer le sans échappement champ nommyField
- C'est plutôt rigide dans l'état actuel de vos espaces réservés doivent être au format$(xyz)
alors que si vous pouvez passer à quelque chose, alors vous pouvez l'utiliser pour n'importe quel rechercher/remplacer. La capacité à utiliser ce existe aussi pour le C# de personnes dans docx4j.NETVoir ici pour plus d'info sur
VariableReplace
ou ici pourVariablePrepare
OriginalL'auteur wal
Bonne journée, j'ai fait un exemple sur la façon de rapidement remplacer le texte à quelque chose que vous devez
par regexp. Je trouve ${param.sumname} et remplacer dans le document.
Note, vous devez insérer le texte "texte seulement"!
Amusez-vous!
OriginalL'auteur lunicon
Cela peut être un problème. Je couvre la façon d'atténuer brisé texte s'exécute dans cette réponse ici: https://stackoverflow.com/a/17066582/125750
... mais vous pouvez envisager les contrôles de contenu à la place. Le docx4j source site a plusieurs échantillons de contrôle ici:
https://github.com/plutext/docx4j/tree/master/src/samples/docx4j/org/docx4j/samples
Uniquement via l'interface utilisateur, je pense. Vous aurez besoin de désactiver pertinentes de l'outillage et de ré-enregistrer dans Word, qui serait alors blat la rsid entités à partir du XML sous-jacent. Plus ici: docx4java.org/forums/docx-java-f6/...
J'ai désactivé la grammaire et l'orthographe, éteint rsid, ré-enregistré le document, mais il ne fonctionne toujours pas. p.s. c'est le journal: "Invalid key" </w:t></w:r><w:r><w:rPr><w:b/><w:sz w:val="20"/><w:szCs w:val="20"/><w:lang w:val="en-US"/></w:rPr><w:t>e</w:t></w:r><w:r><w:rPr><w:b/><w:sz w:val="20"/><w:szCs w:val="20"/></w:rPr><w:t>+</w:t></w:r><w:r><w:rPr><w:b/><w:sz w:val="20"/><w:szCs w:val="20"/><w:lang w:val="en-US"/></w:rPr><w:t>x</w:t></w:r><w:r><w:rPr><w:b/><w:sz w:val="20"/><w:szCs w:val="20"/></w:rPr><w:t>001 " ou touche pas associé à une valeur]]'
Ouais c'est toujours en panne clairement. Votre clé de tous doit être dans le même nœud de texte. Si vous renommez le .docx fichier de suffixe .zip, puis de modifier la document.xml fichier qui y est, vous pouvez le fixer (pas très élégante, mais elle va obtenir votre code de course de toute façon).
OriginalL'auteur Ben