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

Я использую 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); 

... но результат тот же: изменяются обе строки, а не только вторая.

Я постарался сделать пример максимально минимальным. Спасибо за любую помощь!

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
965
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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);
            }
        }
    }
}

Я пришел сюда после часа экспериментов. Надо было попробовать ТАК с самого начала.

Guntram Blohm 28.02.2023 10:52

Другие вопросы по теме

POI Apache: ${my_placeholder} рассматривается как три разных запуска
NPOI: установить цвет ячейки на пользовательский цвет
XSSFSheet Apache POI - можно ли заблокировать все, кроме разрешения обновления и вставки строк?
Как решить исключение в потоке «основной» java.lang.IndexOutOfBoundsException: индекс: 6, размер: 1 с созданием таблицы apache poi?
Как исправить ширину столбцов в таблице, которая находится в ячейке другой таблицы с помощью apache poi и Java?
Как исправить «Некоторые символы формулы могут отображаться неправильно из-за отсутствия шрифтов Symbol, Windings ...» для XLSX, сгенерированного с помощью Apache POI
Как разобрать содержимое и структуру таблицы из xml в слово с помощью Apache poi?
Как получить элементы сводного поля Apache POI — выбор/удаление нескольких элементов?
Org.apache.xmlbeans.impl.values.XmlValueOutOfRangeException: значение объединения «false» не соответствует ни одному члену «ST_OnOff в пространстве имен»
Получите интеллектуальную таблицу Excel с Apache POI