diff --git a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCell.java b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCell.java index 3e6dbc543..2e5e01f21 100644 --- a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCell.java +++ b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCell.java @@ -222,16 +222,21 @@ public class SXSSFCell implements Cell { */ public void setCellValue(RichTextString value) { - ensureRichTextStringType(); - - if(value.length() > SpreadsheetVersion.EXCEL2007.getMaxTextLength()){ - throw new IllegalArgumentException("The maximum length of cell contents (text) is 32,767 characters"); - } - - ((RichTextValue)_value).setValue(value); + XSSFRichTextString xvalue = (XSSFRichTextString)value; - if (((XSSFRichTextString)value).hasFormatting()) - logger.log(POILogger.WARN, "SXSSF doesn't support Shared Strings, rich text formatting information has be lost"); + if (xvalue != null) { + ensureRichTextStringType(); + + if (xvalue.length() > SpreadsheetVersion.EXCEL2007.getMaxTextLength()) { + throw new IllegalArgumentException("The maximum length of cell contents (text) is 32,767 characters"); + } + if (xvalue.hasFormatting()) + logger.log(POILogger.WARN, "SXSSF doesn't support Shared Strings, rich text formatting information has be lost"); + + ((RichTextValue)_value).setValue(xvalue); + } else { + setCellType(CELL_TYPE_BLANK); + } } /** diff --git a/src/testcases/org/apache/poi/ss/usermodel/BaseTestCell.java b/src/testcases/org/apache/poi/ss/usermodel/BaseTestCell.java index 20451d6f3..9cdaf3d18 100644 --- a/src/testcases/org/apache/poi/ss/usermodel/BaseTestCell.java +++ b/src/testcases/org/apache/poi/ss/usermodel/BaseTestCell.java @@ -767,7 +767,39 @@ public abstract class BaseTestCell { wb1.close(); } - private void checkUnicodeValues(Workbook wb) { + /** + * Setting a cell value of a null RichTextString should set + * the cell to Blank, test case for 58558 + */ + @Test + public void testSetCellValueNullRichTextString() throws IOException { + Workbook wb = _testDataProvider.createWorkbook(); + Sheet sheet = wb.createSheet(); + Cell cell = sheet.createRow(0).createCell(0); + + RichTextString nullStr = null; + cell.setCellValue(nullStr); + assertEquals("", cell.getStringCellValue()); + assertEquals(Cell.CELL_TYPE_BLANK, cell.getCellType()); + + cell = sheet.createRow(0).createCell(1); + cell.setCellValue(1.2d); + assertEquals(Cell.CELL_TYPE_NUMERIC, cell.getCellType()); + cell.setCellValue(nullStr); + assertEquals("", cell.getStringCellValue()); + assertEquals(Cell.CELL_TYPE_BLANK, cell.getCellType()); + + cell = sheet.createRow(0).createCell(1); + cell.setCellValue(wb.getCreationHelper().createRichTextString("Test")); + assertEquals(Cell.CELL_TYPE_STRING, cell.getCellType()); + cell.setCellValue(nullStr); + assertEquals("", cell.getStringCellValue()); + assertEquals(Cell.CELL_TYPE_BLANK, cell.getCellType()); + + wb.close(); + } + + private void checkUnicodeValues(Workbook wb) { assertEquals((wb instanceof HSSFWorkbook ? "row 0, cell 0 _x0046_ without changes" : "row 0, cell 0 F without changes"), wb.getSheetAt(0).getRow(0).getCell(0).toString()); assertEquals((wb instanceof HSSFWorkbook ? "row 0, cell 1 _x005fx0046_ with changes" : "row 0, cell 1 _x005fx0046_ with changes"),