From 2776cf6a599ebecb5d135e4e05d7fc995b46ad4a Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Sun, 13 Mar 2016 21:30:18 +0000 Subject: [PATCH] Bug 55668: Try to avoid NullPointerException when chaning cell type and formula leads to null-string by seting the cell to BLANK instead git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1734861 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/hssf/usermodel/HSSFCell.java | 19 +++++++++----- .../apache/poi/hssf/usermodel/TestBugs.java | 24 ++++++++++++++++++ test-data/spreadsheet/55668.xls | Bin 0 -> 23040 bytes 3 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 test-data/spreadsheet/55668.xls diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java b/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java index 407f15b47e..e31f2f5808 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java @@ -346,11 +346,18 @@ public class HSSFCell implements Cell { } if (setValue) { String str = convertCellValueToString(); - int sstIndex = _book.getWorkbook().addSSTString(new UnicodeString(str)); - lrec.setSSTIndex(sstIndex); - UnicodeString us = _book.getWorkbook().getSSTString(sstIndex); - _stringValue = new HSSFRichTextString(); - _stringValue.setUnicodeString(us); + if(str == null) { + // bug 55668: don't try to store null-string when formula + // results in empty/null value + setCellType(CELL_TYPE_BLANK, false, row, col, styleIndex); + return; + } else { + int sstIndex = _book.getWorkbook().addSSTString(new UnicodeString(str)); + lrec.setSSTIndex(sstIndex); + UnicodeString us = _book.getWorkbook().getSSTString(sstIndex); + _stringValue = new HSSFRichTextString(); + _stringValue.setUnicodeString(us); + } } _record = lrec; break; @@ -884,7 +891,7 @@ public class HSSFCell implements Cell { * the HSSFWorkbook.

* *

To change the style of a cell without affecting other cells that use the same style, - * use {@link org.apache.poi.ss.util.CellUtil#setCellStyleProperties(org.apache.poi.ss.usermodel.Cell, Map)}

+ * use {@link org.apache.poi.ss.util.CellUtil#setCellStyleProperties(org.apache.poi.ss.usermodel.Cell, java.util.Map)}

* * @param style reference contained in the workbook * @see org.apache.poi.hssf.usermodel.HSSFWorkbook#createCellStyle() diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java b/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java index 078008a899..7cc9b4ea59 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java @@ -2977,4 +2977,28 @@ public final class TestBugs extends BaseTestBugzillaIssues { wb.close(); } + + @Test + public void test55668() throws IOException { + Workbook wb = HSSFTestDataSamples.openSampleWorkbook("55668.xls"); + + Sheet sheet = wb.getSheetAt(0); + Row row = sheet.getRow(0); + Cell cell = row.getCell(0); + assertEquals(Cell.CELL_TYPE_FORMULA, cell.getCellType()); + assertEquals("IF(TRUE,\"\",\"\")", cell.getCellFormula()); + assertEquals("", cell.getStringCellValue()); + cell.setCellType(Cell.CELL_TYPE_STRING); + + assertEquals(Cell.CELL_TYPE_BLANK, cell.getCellType()); + try { + assertNull(cell.getCellFormula()); + fail("Should throw an exception here"); + } catch (IllegalStateException e) { + // expected here + } + assertEquals("", cell.getStringCellValue()); + + wb.close(); + } } diff --git a/test-data/spreadsheet/55668.xls b/test-data/spreadsheet/55668.xls new file mode 100644 index 0000000000000000000000000000000000000000..8aa8f5042767b04d4162e8c2cd7c6b96e6831366 GIT binary patch literal 23040 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