diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index ef158f1f93..44524a32ae 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 9d6c34cd47..f75b250624 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 b45a5df6c8..abc9fc73bc 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 0000000000..a58aeec7cc Binary files /dev/null and b/test-data/spreadsheet/50795.xlsx differ