Ich arbeite derzeit mit der API Apache POI und ich versuche, ein Word-Dokument damit zu bearbeiten (*.docx
). Ein Dokument besteht aus Absätzen (in XWPFParagraph
Objekte) und ein Absatz enthält Text eingebettet in "Läufe" (XWPFRun
). Ein Absatz kann viele Läufe haben (abhängig von den Texteigenschaften, ist aber manchmal zufällig). In meinem Dokument kann ich bestimmte Tags, die ich mit Daten ersetzen müssen (alle meine Tags folgt diesem Muster <#TAG_NAME#>
)Holen Sie sich die Liste der Objekte, die Text mit einem Muster enthalten
So zum Beispiel, wenn ich einen Absatz mit dem Text Some text with a tag <#SOMETAG#>
verarbeiten, ich so etwas wie dieses
XWPFParagraph paragraph = ... // Get a paragraph from the document
System.out.println(paragraph.getText());
// Prints: Some text with a tag <#SOMETAG#>
Aber wenn ich den Text dieses Absatzes bearbeiten möchte, muss ich die Läufe verarbeiten und die Anzahl der Läufe ist nicht behoben. Also, wenn ich den Inhalt der Durchläufe mit diesem Code zeigen:
System.out.println("Number of runs: " + paragraph.getRuns().size());
for (XWPFRun run : paragraph.getRuns()) {
System.out.println(run.text());
}
Manchmal kann es so aussehen:
// Output:
// Number of runs: 1
// Some text with a tag <#SOMETAG#>
Und andere Zeit wie dieser
// Output:
// Number of runs: 4
// Some text with a tag
// <#
// SOMETAG
// #>
Was muss ich tun ist, den ersten Lauf zu erhalten, der den Anfang des Tags und die Indizes der folgenden Läufe enthält, die den Rest des Tags enthalten (wenn das Tag in viele Läufe unterteilt ist). Ich habe es geschafft, eine erste Version dieses Algorithmus zu bekommen, aber es funktioniert nur, wenn der Anfang des Tags (<#
) und das Ende des Tags (#>
) nicht geteilt sind. Here's what I've already done.
Also, was ich möchte bekommen, ist ein Algorithmus, um das Problem zu verwalten und wenn möglich, sie mit einem bestimmten Tag (nicht unbedingt <#
und #>
, so konnte ich mit so etwas wie diese {{{
und diesen }}}
ersetzen) erhalten arbeiten.
Entschuldigung, wenn mein Englisch nicht perfekt ist, zögern Sie nicht, mich zu bitten, jeden Punkt zu klären, den Sie wollen.
Es ist möglich, alle Durchläufe für einen Absatz zu verketten, den Text zu aktualisieren und dann die Durchläufe durch einen einzigen zu ersetzen, der den neuen Text enthält? Kann sein, dass es funktioniert mit: http://stackoverflow.com/a/3638229/2611083 –
Das ist, was meine tatsächliche Lösung teilweise (wenn das Tag in mehrere Läufe aufgeteilt ist, verkettet es den Text der folgenden Ausführungen in der zuerst ausführen und löschen Sie sie). Ich möchte nicht alle Läufe in der ersten verketten, weil ich alle Textparameter verliere. Zum Beispiel, wenn der Absatz ist ** Daten: ** _ <#DATATAG#> _, möchte ich "Daten:" in Fettdruck und ersetzen Sie die <#DATATAG#> durch die Daten, die ich brauche und halten Sie es kursiv –
Wenn das ganze Tag hat die gleiche Parameter, könnte es in verschiedenen Läufen sein? –