Here is sample code, which copy first row of table and populate it with some text public static void sample(XWPFTable table) { final CTRow templateRow = (CTRow) table.getRow(0).getCtRow().copy(); final XWPFTableRow tableRow = new XWPFTableRow((CTRow) templateRow.copy(), table); tableRow.getCell(0).setText("Sample text"); // OK table.addRow(tableRow); // <-- cloned CTRow is copying tableRow.getCell(0).setText("Another sample text"); // <-- Modifying old CTRow // After writing document row still contain "Sample text" } The problem is in method XWPFTable.addRow public void addRow(XWPFTableRow row) { ctTbl.addNewTr(); ctTbl.setTrArray(getNumberOfRows() - 1, row.getCtRow()); // <-- copy content of row CTRow tableRows.add(row); // <-- XWPFTableRow still points to own row.getCtRow() and subsequent calls not affected final document }