diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index ef158f1f9..44524a32a 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 50795 - Avoid NPE from xmlbeans when moving XSSF Comments from one cell to another 46664 - When creating HSSF Print Areas, ensure the named range is reference based not value based 50756 - When formatting numbers based on their Cell Style, treat GENERAL the same as the more typical General fixed HSSFWorkbook.createCellStyle to throw exception if the maximum number of cell styles was exceeded diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFComment.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFComment.java index 9d6c34cd4..f75b25062 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFComment.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFComment.java @@ -116,7 +116,16 @@ public class XSSFComment implements Comment { _comment.setRef(ref.formatAsString()); _comments.referenceUpdated(oldRef, _comment); - if(_vmlShape != null) _vmlShape.getClientDataArray(0).setColumnArray(0, new BigInteger(String.valueOf(col))); + if(_vmlShape != null) { + _vmlShape.getClientDataArray(0).setColumnArray( + new BigInteger[] { new BigInteger(String.valueOf(col)) } + ); + + // There is a very odd xmlbeans bug when changing the column + // arrays which can lead to corrupt pointer + // This call seems to fix them again... See bug #50795 + _vmlShape.getClientDataList().toString(); + } } /** diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java index b45a5df6c..abc9fc73b 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java @@ -620,4 +620,56 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues { assertEquals("SUM(\n1,2\n)", c.getCellFormula()); assertEquals(3.0, c.getNumericCellValue()); } + + /** + * Moving a cell comment from one cell to another + */ + public void test50795() throws Exception { + XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("50795.xlsx"); + XSSFSheet sheet = wb.getSheetAt(0); + XSSFRow row = sheet.getRow(0); + + XSSFCell cellWith = row.getCell(0); + XSSFCell cellWithoutComment = row.getCell(1); + + assertNotNull(cellWith.getCellComment()); + assertNull(cellWithoutComment.getCellComment()); + + String exp = "\u0410\u0432\u0442\u043e\u0440:\ncomment"; + XSSFComment comment = cellWith.getCellComment(); + assertEquals(exp, comment.getString().getString()); + + + // Check we can write it out and read it back as-is + wb = XSSFTestDataSamples.writeOutAndReadBack(wb); + sheet = wb.getSheetAt(0); + row = sheet.getRow(0); + cellWith = row.getCell(0); + cellWithoutComment = row.getCell(1); + + // Double check things are as expected + assertNotNull(cellWith.getCellComment()); + assertNull(cellWithoutComment.getCellComment()); + comment = cellWith.getCellComment(); + assertEquals(exp, comment.getString().getString()); + + + // Move the comment + cellWithoutComment.setCellComment(comment); + + + // Write out and re-check + wb = XSSFTestDataSamples.writeOutAndReadBack(wb); + sheet = wb.getSheetAt(0); + row = sheet.getRow(0); + + // Ensure it swapped over + cellWith = row.getCell(0); + cellWithoutComment = row.getCell(1); + assertNull(cellWith.getCellComment()); + assertNotNull(cellWithoutComment.getCellComment()); + + comment = cellWithoutComment.getCellComment(); + assertEquals(exp, comment.getString().getString()); + } } diff --git a/test-data/spreadsheet/50795.xlsx b/test-data/spreadsheet/50795.xlsx new file mode 100644 index 000000000..a58aeec7c Binary files /dev/null and b/test-data/spreadsheet/50795.xlsx differ