Hey Leute,
ich bin auf der Suche nach einer Lösung wie ich in einem Word Dokument "Variablen" suchen und ersetzen kann. Mein Ansatz ist, dass die Variablen immer in "#{}" verpackt werden müssen. Als API nehme ich Apache POI (XWPFDocument usw.).
Der Aufbau sieht ja dann wie folgt aus. XPWFDocument hat ne Liste von XWPFParagraphen die haben dann noch mal eine Liste mit XWPFRuns in dem dann der Text und die jeweilige Formatierung steht.
Dass knifflige ist jetzt, dass jeglicher Text auf verschiedene Paragraphen und Runs aufgesplittet sein kann. Hier mal mein Code was ich bisher gemacht hatte. Klappt auch einigermaßen doch allerdings gibt es immer wieder Fälle wo es nicht mehr hinhaut. Ich glaube ich mach das auch alles viel zu kompliziert, mir fällt aber leider irgendwie keine andere Lösung ein.
Ich hoffe jemand von euch hat den Elan sich meinen code anzuschauen dafür dann schon mal vielen vielen Dank bzw. wenn jemand eine komplett andere Lösung hat wäre super.
ich bin auf der Suche nach einer Lösung wie ich in einem Word Dokument "Variablen" suchen und ersetzen kann. Mein Ansatz ist, dass die Variablen immer in "#{}" verpackt werden müssen. Als API nehme ich Apache POI (XWPFDocument usw.).
Der Aufbau sieht ja dann wie folgt aus. XPWFDocument hat ne Liste von XWPFParagraphen die haben dann noch mal eine Liste mit XWPFRuns in dem dann der Text und die jeweilige Formatierung steht.
Dass knifflige ist jetzt, dass jeglicher Text auf verschiedene Paragraphen und Runs aufgesplittet sein kann. Hier mal mein Code was ich bisher gemacht hatte. Klappt auch einigermaßen doch allerdings gibt es immer wieder Fälle wo es nicht mehr hinhaut. Ich glaube ich mach das auch alles viel zu kompliziert, mir fällt aber leider irgendwie keine andere Lösung ein.
Ich hoffe jemand von euch hat den Elan sich meinen code anzuschauen dafür dann schon mal vielen vielen Dank bzw. wenn jemand eine komplett andere Lösung hat wäre super.
Code:
public static void replaceInParagraphs(List<XWPFParagraph> paragraphs, Map<String, String> replacements) {
Set<XWPFRun> runsToClear = new LinkedHashSet<>();
Set<XWPFRun> runsToClearTemp = new LinkedHashSet<>();
String addNextRunText = "";
String collectNextRunText = "";
String tempText = "";
for (XWPFParagraph paragraph : paragraphs) {
List<XWPFRun> runs = paragraph.getRuns();
for (XWPFRun run : runs) {
if (!addNextRunText.equals("")) {
tempText += addNextRunText;
addNextRunText = "";
}
String[] buildTexte = buildSearchText(tempText, paragraph, run, runsToClearTemp);
if (buildTexte.length == 3)
collectNextRunText = buildTexte[2];
tempText = buildTexte[0];
if (!tempText.equals("")) {
if (tempText.contains("#{") && tempText.contains("}")) {
String searchText = "";
// boolean hasReplaced = false;
String lastReplacement = "";
for (Map.Entry<String, String> replacement : replacements.entrySet()) {
if (!tempText.contains("#{") && !tempText.contains("}"))
break;
searchText = "#{" + replacement.getKey() + "}";
if (tempText.contains(searchText)) {
tempText = tempText.replace(searchText, replacement.getValue());
lastReplacement = replacement.getValue();
// hasReplaced = true;
}
}
if (!collectNextRunText.equals("") && !collectNextRunText.startsWith("#")) {
int index = collectNextRunText.indexOf("#");
tempText += collectNextRunText.substring(0, index);
collectNextRunText = collectNextRunText.substring(index);
}
addNextRunText = collectNextRunText;
collectNextRunText = "";
if (lastReplacement.equals("")) {
tempText = "";
runsToClearTemp.clear();
continue;
}
String checkTempText = tempText.substring(tempText.indexOf(lastReplacement));
if (checkTempText.contains("#")) {
if (checkTempText.endsWith("#")) {
tempText = tempText.substring(0, tempText.length() - 1);
addNextRunText = "#";
} else if (checkTempText.contains("#{")) {
int index = 0;
while (index < tempText.indexOf(lastReplacement))
index = tempText.substring(index, tempText.length()).indexOf("#{");
addNextRunText = tempText.substring(index, tempText.length());
tempText = tempText.substring(0, index);
}
}
tempText += buildTexte[1];
run.setText(tempText, 0);
runsToClear.addAll(runsToClearTemp);
runsToClearTemp.clear();
tempText = "";
}
}
}
}
for (XWPFRun run : runsToClear)
run.setText("", 0);
}
private static String[] buildSearchText(String tempText, XWPFParagraph paragraph, XWPFRun run,
Set<XWPFRun> runsToClear) {
// String text = run.getText(run.getTextPosition());
String text = run.getText(-1);
String rest = "";
if (text == null)
return new String[] { "", "" };
if (!tempText.equals("") && text.contains("#")) {
if (text.contains("}") && text.indexOf("}") < text.indexOf("#")) {
int firstIndex = text.indexOf("}");
if (firstIndex == 0)
firstIndex = 1;
return new String[] { tempText += text.substring(0, firstIndex), "", text.substring(firstIndex) };
} else {
runsToClear.clear();
tempText = "";
}
}
if (tempText.equals("")) {
if (text.contains("#")) {
if (text.contains("}"))
tempText = text;
else
tempText = text.substring(text.indexOf("#"));
if (!tempText.contains("}") || (!text.startsWith("#") && !tempText.contains("}"))) {
run.setText(text.substring(0, text.indexOf("#")));
runsToClear.add(run);
}
return new String[] { tempText, rest };
} else
return new String[] { "", "" };
}
if (tempText.startsWith("#")) {
if ((tempText.length() == 1 || (tempText.length() > 1 && tempText.charAt(1) != '{'))
&& !text.startsWith("{")) {
runsToClear.clear();
return new String[] { "", "" };
}
if (tempText.length() == 1 && text.startsWith("{")) {
tempText += "{";
text = text.substring(1);
}
if (tempText.length() > 1 && tempText.charAt(1) == '{') {
if (text.contains("}")) {
int index = text.indexOf("}");
tempText += text.substring(0, text.indexOf("}") + 1);
if (text.length() >= index + 2)
rest = text.substring(text.indexOf("}") + 1);
} else {
tempText += text;
runsToClear.add(run);
}
}
}
return new String[] { tempText, rest };
}