From da56e012c3b5ec0654f20fa3d0c7224c6d93c5d2 Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Mon, 13 Jul 2015 12:17:52 +0000 Subject: [PATCH] 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 --- .../apache/poi/xssf/streaming/SXSSFCell.java | 2 +- .../ss/usermodel/BaseTestBugzillaIssues.java | 54 ++++++++++++++++--- 2 files changed, 49 insertions(+), 7 deletions(-) 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 7b67aa349..b0d35803b 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 0051e82dd..9cbbac02d 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); + } }