]> source.dussan.org Git - poi.git/commitdiff
fixed XSSFCell.getStringCellValue() to properly handle cached formula results
authorYegor Kozlov <yegor@apache.org>
Sat, 26 Sep 2009 10:41:01 +0000 (10:41 +0000)
committerYegor Kozlov <yegor@apache.org>
Sat, 26 Sep 2009 10:41:01 +0000 (10:41 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@819106 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/status.xml
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFCell.java
test-data/spreadsheet/47889.xlsx [new file with mode: 0644]

index d44bc902ad5d5de989ddad94ddbac760275888e9..446790656cfa9b513956dd8cd80fdcc84dc9f60d 100644 (file)
@@ -33,6 +33,7 @@
 
     <changes>
         <release version="3.6-beta1" date="2009-??-??">
+           <action dev="POI-DEVELOPERS" type="fix">47889 - fixed XSSFCell.getStringCellValue() to properly handle cached formula results</action>
         </release>
         <release version="3.5-FINAL" date="2009-09-28">
            <action dev="POI-DEVELOPERS" type="fix">47747 - fixed logic for locating shared formula records</action>
index e76f22a97b5b855c523393e2558c8bc2fc47157f..aee0405b2f9c1f1b8c482d069432a10038a16e4b 100644 (file)
@@ -249,6 +249,9 @@ public final class XSSFCell implements Cell {
                     } else {
                         rt = new XSSFRichTextString("");
                     }
+                } else if (_cell.getT() == STCellType.STR) {
+                    //cached formula value
+                    rt = new XSSFRichTextString(_cell.isSetV() ? _cell.getV() : "");
                 } else {
                     if (_cell.isSetV()) {
                         int idx = Integer.parseInt(_cell.getV());
@@ -411,12 +414,15 @@ public final class XSSFCell implements Cell {
     /**
      * Return the cell's style.
      *
-     * @return the cell's style. Always not-null. Default cell style has zero index and can be obtained as
-     * <code>workbook.getCellStyleAt(0)</code>
+     * @return the cell's style.</code>
      */
     public XSSFCellStyle getCellStyle() {
-        long idx = _cell.isSetS() ? _cell.getS() : 0;
-        return _stylesSource.getStyleAt((int)idx);
+        XSSFCellStyle style = null;
+        if(_stylesSource.getNumCellStyles() > 0){
+            long idx = _cell.isSetS() ? _cell.getS() : 0;
+            style = _stylesSource.getStyleAt((int)idx);
+        }
+        return style;
     }
 
     /**
@@ -629,7 +635,7 @@ public final class XSSFCell implements Cell {
     private void setBlank(){
         CTCell blank = CTCell.Factory.newInstance();
         blank.setR(_cell.getR());
-        blank.setS(_cell.getS());
+        if(_cell.isSetS()) blank.setS(_cell.getS());
         _cell.set(blank);
     }
 
index 194a983e2512e5f9b7e23ddc985328b1bdd2f0dd..e097bfd140355406b4e9f0f8637b6f9828a43646 100644 (file)
@@ -21,6 +21,7 @@ import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.xssf.XSSFITestDataProvider;
 import org.apache.poi.xssf.model.SharedStringsTable;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCellType;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell;
 
 /**
  * @author Yegor Kozlov
@@ -105,4 +106,64 @@ public final class TestXSSFCell extends BaseTestCell {
         assertEquals(0, sst.getCount());
         assertEquals(XSSFCell.CELL_TYPE_BLANK, cell_1.getCellType());
     }
+
+    public void testFormulaString() {
+        XSSFWorkbook wb = new XSSFWorkbook();
+        XSSFCell cell = wb.createSheet().createRow(0).createCell(0);
+        CTCell ctCell = cell.getCTCell(); //low-level bean holding cell's xml
+
+        cell.setCellFormula("A2");
+        assertEquals(XSSFCell.CELL_TYPE_FORMULA, cell.getCellType());
+        //the value is not set and cell's type='N' which means blank
+        assertEquals(STCellType.N, ctCell.getT());
+
+        //set cached formula value
+        cell.setCellValue("t='str'");
+        //we are still of 'formula' type
+        assertEquals(XSSFCell.CELL_TYPE_FORMULA, cell.getCellType());
+        //cached formula value is set and cell's type='STR'
+        assertEquals(STCellType.STR, ctCell.getT());
+        assertEquals("t='str'", cell.getStringCellValue());
+
+        //now remove the formula, the cached formula result remains
+        cell.setCellFormula(null);
+        assertEquals(XSSFCell.CELL_TYPE_STRING, cell.getCellType());
+        assertEquals(STCellType.STR, ctCell.getT());
+        //the line below failed prior to fix of Bug #47889
+        assertEquals("t='str'", cell.getStringCellValue());
+
+        //revert to a blank cell
+        cell.setCellValue((String)null);
+        assertEquals(XSSFCell.CELL_TYPE_BLANK, cell.getCellType());
+        assertEquals(STCellType.N, ctCell.getT());
+        assertEquals("", cell.getStringCellValue());
+    }
+
+    /**
+     * Bug 47889: problems when calling XSSFCell.getStringCellValue() on a workbook created in Gnumeric
+     */
+    public void test47889() {
+        XSSFWorkbook wb = (XSSFWorkbook)_testDataProvider.openSampleWorkbook("47889.xlsx");
+        XSSFSheet sh = wb.getSheetAt(0);
+
+        XSSFCell cell;
+
+        //try a string cell
+        cell = sh.getRow(0).getCell(0);
+        assertEquals(XSSFCell.CELL_TYPE_STRING, cell.getCellType());
+        assertEquals("a", cell.getStringCellValue());
+        assertEquals("a", cell.toString());
+        //Gnumeric produces spreadsheets without styles
+        //make sure we return null for that instead of throwing OutOfBounds
+        assertEquals(null, cell.getCellStyle());
+
+        //try a numeric cell
+        cell = sh.getRow(1).getCell(0);
+        assertEquals(XSSFCell.CELL_TYPE_NUMERIC, cell.getCellType());
+        assertEquals(1.0, cell.getNumericCellValue());
+        assertEquals("1.0", cell.toString());
+        //Gnumeric produces spreadsheets without styles
+        //make sure we return null for that instead of throwing OutOfBounds
+        assertEquals(null, cell.getCellStyle());
+    }
 }
diff --git a/test-data/spreadsheet/47889.xlsx b/test-data/spreadsheet/47889.xlsx
new file mode 100644 (file)
index 0000000..d4b23ab
Binary files /dev/null and b/test-data/spreadsheet/47889.xlsx differ