Копирование и изменение строки в таблице .docx

#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);
            }
        }
    }
}