Я использую 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);
... но результат тот же: изменяются обе строки, а не только вторая.
Я постарался сделать пример максимально минимальным. Спасибо за любую помощь!
Вы по-прежнему ссылаетесь на одни и те же базовые данные.
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);
}
}
}
}
Я пришел сюда после часа экспериментов. Надо было попробовать ТАК с самого начала.