From 1bdfdcc7934d3c00b5f1a846ede0caffc66ef66a Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Fri, 18 Aug 2023 08:48:18 +0000 Subject: [PATCH] [bug-66988] Fully replace content of XWPFTableCell on setText. Thanks to Anton Oellerer. This closes #503 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1911749 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/xwpf/usermodel/XWPFTableCell.java | 21 ++++++++++++++++++ .../poi/xwpf/usermodel/TestXWPFBugs.java | 11 +++++++++ test-data/document/Bug66988.docx | Bin 0 -> 4875 bytes 3 files changed, 32 insertions(+) create mode 100644 test-data/document/Bug66988.docx diff --git a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFTableCell.java b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFTableCell.java index f3044af3fd..8537df186d 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFTableCell.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFTableCell.java @@ -421,7 +421,28 @@ public class XWPFTableCell implements IBody, ICell { return text.toString(); } + /** + * Set the text of the cell to the passed string, replacing previous content. Up until POI 5.2.3, this method appended the text, which is now done + * by {@link XWPFTableCell#appendText(String)}. + * + * @param text The text to replace the cell content with + */ public void setText(String text) { + XWPFParagraph par = paragraphs.isEmpty() ? addParagraph() : paragraphs.get(0); + while (!par.runsIsEmpty()) { + par.removeRun(0); + } + par.createRun().setText(text); + } + + /** + * Append the passed string to the cell content. + * This was the behaviour of {@link XWPFTableCell#setText(String)} before POI 5.2.4 + * + * @param text The text to append to the cells content. + * @since POI 5.2.4 + */ + public void appendText(String text) { XWPFParagraph par = paragraphs.isEmpty() ? addParagraph() : paragraphs.get(0); par.createRun().setText(text); } diff --git a/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFBugs.java b/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFBugs.java index 8afaaecb2d..7b20827b78 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFBugs.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFBugs.java @@ -329,6 +329,17 @@ class TestXWPFBugs { } } + @Test + void bug66988() throws IOException { + try (XWPFDocument document = XWPFTestDataSamples.openSampleDocument("Bug66988.docx")) { + XWPFTableCell cell = document.getTableArray(0).getRow(0).getCell(0); + cell.appendText("World"); + assertEquals("HelloWorld", cell.getText()); + cell.setText("FooBar"); + assertEquals("FooBar", cell.getText()); + } + } + private static void addNumberingWithAbstractId(XWPFNumbering documentNumbering, int id){ // create a numbering scheme CTAbstractNum cTAbstractNum = CTAbstractNum.Factory.newInstance(); diff --git a/test-data/document/Bug66988.docx b/test-data/document/Bug66988.docx new file mode 100644 index 0000000000000000000000000000000000000000..4b7a781bc37506d4495a2dc76edf16fe1a020945 GIT binary patch literal 4875 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