#java #apache-poi #docx #xwpf
#java #apache-poi #docx #xwpf
Вопрос:
Я использую Apache POI для обработки файла .docx.
У меня есть .docx с 1 строкой, 1 таблицей столбцов.
XWPFTable table = document.getTables().get(0);
XWPFTableRow copiedRow = table.getRow(0);
table.addRow(copiedRow);
Приведенный выше код успешно копирует строку, поэтому в таблице теперь будет 2 строки.
Однако я также хочу изменить скопированную строку.
XWPFTable table = document.getTables().get(0);
XWPFTableRow copiedRow = table.getRow(0);
copiedRow.getTableCells().get(0).setText("SOME MODIFICATION HERE"); // <- setting some data
table.addRow(copiedRow);
Проблема в том, что … изменение затронуло обе строки. Затрагиваются как исходная первая, так и вторая, которую нужно добавить.
Я также попытался явно создать новую строку, например:
copiedRow.getTableCells().get(0).setText("SOME MODIFICATION");
XWPFTableRow newRow = new XWPFTableRow(copiedRow.getCtRow(), table);
table.addRow(newRow);
… тем не менее, результат остается тем же: изменяются обе строки, а не только вторая.
Я постарался сделать пример как можно более минимальным. Спасибо за любую помощь!
Ответ №1:
Вы все еще ссылаетесь на те же базовые данные.
CTRow
есть copy
метод. Поэтому используйте это для создания нового XWPFTableRow
:
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRow;
import java.io.*;
import java.nio.file.*;
public class Main {
public static void main(String[] args) throws IOException {
Path documentRoot = Paths.get(System.getProperty("user.home"), "Documents");
try (InputStream inputStream = Files.newInputStream(documentRoot.resolve("Input.docx"))) {
XWPFDocument document = new XWPFDocument(inputStream);
XWPFTable table = document.getTables().get(0);
XWPFTableRow row = table.getRow(0);
XWPFTableRow copiedRow = new XWPFTableRow((CTRow) row.getCtRow().copy(), table);
copiedRow.getTableCells().get(0).setText("SOME MODIFICATION HERE");
table.addRow(copiedRow);
try (OutputStream outputStream = Files.newOutputStream(documentRoot.resolve("Output.docx"))) {
document.write(outputStream);
}
}
}
}