Я использую Apache POI 3.13 и пытался искать и заменять тексты из заданного файла шаблона, а затем сохранять новый сгенерированный .docx. Вот мой код:
public static void main(String[] args) throws InvalidFormatException, IOException {
String filePath = "Sample.docx";
File outputfile = new File("SampleProcessed.docx");
XWPFDocument doc = new XWPFDocument(OPCPackage.open(filePath));
for (XWPFParagraph p : doc.getParagraphs()) {
List<XWPFRun> runs = p.getRuns();
if (runs != null) {
for (XWPFRun r : runs) {
String text = r.getText(0);
if (text != null && text.contains("$VAR")) {
text = text.replace("$VAR", "JohnDoe");
r.setText(text, 0);
}
}
}
}
doc.write(new FileOutputStream(outputfile));
doc.close();
System.out.println("Done");
Desktop.getDesktop().open(outputfile);
}
Это выглядит довольно просто, но когда я запускаю этот код, документ «Sample.docx» также заменяется. В итоге у меня есть два документа с одинаковым содержимым.
Это нормальное поведение POI? Я думал, что открытие документа только загружает его в память, а затем выполняет «doc.write(OutputStream);» сбросил бы на диск.
Я пытался писать в тот же «filePath», но, как и ожидалось, он выдает исключение, так как я пытаюсь записать в открытый в данный момент файл.
Единственное, что сработало, это когда я сначала скопировал файл шаблона и вместо этого использовал эту копию. Но теперь у меня есть 3 файла, первый из которых был исходным шаблоном «Sample.docx», а остальные 2 имеют одинаковое содержимое (SampleProcessed.docx и SampleProcessedOut.docx).
Это сработало, но это довольно расточительно. Есть ли способ сделать это? Я что-то делаю не так, возможно, я неправильно открываю документ Word?