From: Dominik Stadler Date: Mon, 13 Jul 2015 12:17:52 +0000 (+0000) Subject: Bug 58113: Fix regression: NullPointerException when setting cell value to null X-Git-Tag: REL_3_13_BETA1~44 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=bae4602fa69a72c8d3e3ee4ecf354cf9a72f7e91;p=poi.git Bug 58113: Fix regression: NullPointerException when setting cell value to null add unit tests which verifies this for all three SS-implementations git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1690652 13f79535-47bb-0310-9956-ffa450edef68 --- 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 7b67aa349d..b0d35803ba 100644 --- a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCell.java +++ b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCell.java @@ -248,7 +248,7 @@ public class SXSSFCell implements Cell { ensureTypeOrFormulaType(CELL_TYPE_STRING); - if(value.length() > SpreadsheetVersion.EXCEL2007.getMaxTextLength()){ + if(value != null && value.length() > SpreadsheetVersion.EXCEL2007.getMaxTextLength()){ throw new IllegalArgumentException("The maximum length of cell contents (text) is 32,767 characters"); } diff --git a/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java b/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java index 0051e82dd4..9cbbac02d9 100644 --- a/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java +++ b/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java @@ -32,6 +32,7 @@ import org.apache.poi.hssf.util.PaneInformation; import org.apache.poi.ss.ITestDataProvider; import org.apache.poi.ss.SpreadsheetVersion; import org.apache.poi.ss.util.CellRangeAddress; +import org.junit.Ignore; import org.junit.Test; /** @@ -419,16 +420,16 @@ public abstract class BaseTestBugzillaIssues { Workbook wb = _testDataProvider.createWorkbook(); Sheet sheet = wb.createSheet("My sheet"); - Row row = sheet.createRow( 0 ); - Cell cell = row.createCell( 0 ); + Row row = sheet.createRow(0); + Cell cell = row.createCell(0); cell.setCellFormula(hyperlinkF); assertEquals(hyperlinkF, cell.getCellFormula()); wb = _testDataProvider.writeOutAndReadBack(wb); sheet = wb.getSheet("My Sheet"); - row = sheet.getRow( 0 ); - cell = row.getCell( 0 ); + row = sheet.getRow(0); + cell = row.getCell(0); assertEquals(hyperlinkF, cell.getCellFormula()); } @@ -691,7 +692,8 @@ public abstract class BaseTestBugzillaIssues { * TODO Fix this to evaluate for XSSF * TODO Fix this to work at all for HSSF */ -// @Test + @Ignore("Fix this to evaluate for XSSF, Fix this to work at all for HSSF") + @Test public void bug46670() throws Exception { Workbook wb = _testDataProvider.createWorkbook(); Sheet s = wb.createSheet(); @@ -730,7 +732,7 @@ public abstract class BaseTestBugzillaIssues { assertEquals(refHttp, c2.getCellFormula()); - // Try to evalutate, without giving a way to get at the other file + // Try to evaluate, without giving a way to get at the other file try { evaluateCell(wb, c1); fail("Shouldn't be able to evaluate without the other file"); @@ -1003,4 +1005,44 @@ public abstract class BaseTestBugzillaIssues { fail(); } catch(IllegalStateException e) {} } + + @Test + public void test58113() { + Workbook wb = _testDataProvider.createWorkbook(); + Sheet sheet = wb.createSheet( "Test" ); + + Row row = sheet.createRow(0); + + Cell cell = row.createCell(0); + // verify that null-values can be set, this was possible up to 3.11, but broken in 3.12 + cell.setCellValue((String)null); + String value = cell.getStringCellValue(); + assertTrue("HSSF will currently return empty string, XSSF/SXSSF will return null, but had: " + value, + value == null || value.length() == 0); + + cell = row.createCell(1); + // also verify that setting formulas to null works + cell.setCellType(Cell.CELL_TYPE_FORMULA); + cell.setCellValue((String)null); + + wb.getCreationHelper().createFormulaEvaluator().evaluateAll(); + + value = cell.getStringCellValue(); + assertTrue("HSSF will currently return empty string, XSSF/SXSSF will return null, but had: " + value, + value == null || value.length() == 0); + + // set some value + cell.setCellType(Cell.CELL_TYPE_STRING); + cell.setCellValue("somevalue"); + + value = cell.getStringCellValue(); + assertTrue("can set value afterwards: " + value, + value.equals("somevalue")); + + // verify that the null-value is actually set even if there was some value in the cell before + cell.setCellValue((String)null); + value = cell.getStringCellValue(); + assertTrue("HSSF will currently return empty string, XSSF/SXSSF will return null, but had: " + value, + value == null || value.length() == 0); + } }