docx4j suchen und ersetzen
Habe ich docx-Dokument mit einigen Platzhaltern. Jetzt sollte ich ersetzen Sie Sie mit anderen Inhalten, und speichern Sie die neuen docx-Dokument. Angefangen habe ich mit docx4j und fand diese Methode:
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));
}
}
}
}
Aber, dass die arbeiten nur selten, da in der Regel die Platzhalter-splits über mehrere Texte läuft.
Versuchte ich UnmarshallFromTemplate, aber es funktioniert nur selten zu.
Wie dieses problem gelöst werden könnte?
InformationsquelleAutor luckyi | 2013-10-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
VariableReplace
zu erreichen, das die nicht bestanden haben in der Zeit die anderen Antworten.Dies bedeutet nicht ein suchen/ersetzen per se, sondern um Werke, die auf den Platzhalter zB
$(myField)
Beachten Sie, dass Sie nicht bestehen
$(myField)
wie der name des Feldes; eher an der unescaped Feld namemyField
- Das ist eher unflexibel, so wie es momentan steht die Platzhalter müssen im format$(xyz)
in der Erwägung, dass, wenn Sie passieren könnte, in etwas, dann könnten Sie nutzen es für einen suchen/ersetzen. Die Fähigkeit, diese zu verwenden, besteht auch für C# Menschen in docx4j.NETSehen hier für mehr info auf
VariableReplace
oder hier fürVariablePrepare
InformationsquelleAutor wal
Guten Tag, ich habe ein Beispiel, wie man schnell ersetzen von text, um etwas, das Sie brauchen
durch regexp. Ich find ${param.sumname} und ersetzen Sie es im Dokument.
Hinweis haben Sie für das einfügen von text als 'nur text'!
Spaß haben!
InformationsquelleAutor lunicon
Kann dies ein problem sein. Ich decken, wie zu mildern, gebrochen-up-text läuft in dieser Antwort hier: https://stackoverflow.com/a/17066582/125750
... aber möchten Sie vielleicht zu prüfen, Inhaltssteuerelemente statt. Der docx4j source-Website hat verschiedene inhaltliche Kontrolle samples hier:
https://github.com/plutext/docx4j/tree/master/src/samples/docx4j/org/docx4j/samples
Nur über die Benutzeroberfläche, denke ich. Brauchen Sie, um deaktivieren Sie die entsprechenden Werkzeuge und wieder in Word speichern, das wäre dann blat der rsid Personen aus dem zugrunde liegenden XML. Mehr hier: docx4java.org/forums/docx-java-f6/...
Ich deaktiviert Grammatik-und Rechtschreibprüfung, ausgeschaltet rsid, erneut das Dokument gespeichert wurde aber es funktioniert immer noch nicht. p.s. dies ist der log: 'Ungültiger Schlüssel '</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 " oder die Taste nicht auf einen Wert gemappt]]'
Ja, dass ist immer noch kaputt, klar zu erkennen. Ihr Schlüssel muss man allen in der gleichen text-Knoten. Wenn Sie umbenennen .docx-Datei-suffix .zip, und Bearbeiten Sie dann die document.xml Datei darin, Sie können es zu beheben (nicht sehr elegant, aber es wird Ihr code trotzdem ausführen).
InformationsquelleAutor Ben