]> source.dussan.org Git - poi.git/commitdiff
Add tests to verify that XSSF and HSSF do the same thing with retrieving the wrong...
authorNick Burch <nick@apache.org>
Fri, 4 Jun 2010 15:58:02 +0000 (15:58 +0000)
committerNick Burch <nick@apache.org>
Fri, 4 Jun 2010 15:58:02 +0000 (15:58 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@951466 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/hssf/usermodel/HSSFCell.java
src/java/org/apache/poi/ss/usermodel/Cell.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java

index c29e9f9ee48ad3849876502cc5f43def176b3baf..20794454f7f78788b72acf8d40ff0dca4a7ea585 100644 (file)
@@ -34,6 +34,7 @@
 
     <changes>
         <release version="3.7-SNAPSHOT" date="2010-??-??">
+           <action dev="POI-DEVELOPERS" type="fix">47815 - correct documentation on what happens when you request a String from a non-string Formula cell</action>
            <action dev="POI-DEVELOPERS" type="fix">49386 - avoid NPE when extracting OOXML file properties which are dates</action>
            <action dev="POI-DEVELOPERS" type="fix">49377 - only call DecimalFormat.setRoundingMode on Java 1.6 - it's needed to match excel's rendering of numbers</action>
            <action dev="POI-DEVELOPERS" type="fix">49378 - correct 1.6ism</action>
index a490d44dfdeaf6529c79d467b51cddf086fe1560..c6f5a839d1dd9f5357df4164ffec1f2e8169181b 100644 (file)
@@ -700,7 +700,7 @@ public class HSSFCell implements Cell {
     /**
      * get the value of the cell as a string - for numeric cells we throw an exception.
      * For blank cells we return an empty string.
-     * For formulaCells that are not string Formulas, we return empty String
+     * For formulaCells that are not string Formulas, we throw an exception
      */
     public String getStringCellValue()
     {
@@ -711,7 +711,7 @@ public class HSSFCell implements Cell {
     /**
      * get the value of the cell as a string - for numeric cells we throw an exception.
      * For blank cells we return an empty string.
-     * For formulaCells that are not string Formulas, we return empty String
+     * For formulaCells that are not string Formulas, we throw an exception
      */
     public HSSFRichTextString getRichStringCellValue() {
 
index 66c9d38b3ab0e8ff53aadd7adb4685f22eb75614..7859e029d8d5a1253ee60e71160c0f980a4dc205 100644 (file)
@@ -257,7 +257,7 @@ public interface Cell {
      * Get the value of the cell as a XSSFRichTextString
      * <p>
      * For numeric cells we throw an exception. For blank cells we return an empty string.
-     * For formula cells we return the pre-calculated value.
+     * For formula cells we return the pre-calculated value if a string, otherwise an exception.
      * </p>
      * @return the value of the cell as a XSSFRichTextString
      */
@@ -267,7 +267,7 @@ public interface Cell {
      * Get the value of the cell as a string
      * <p>
      * For numeric cells we throw an exception. For blank cells we return an empty string.
-     * For formulaCells that are not string Formulas, we return empty String.
+     * For formulaCells that are not string Formulas, we throw an exception.
      * </p>
      * @return the value of the cell as a string
      */
index 9a6be02014adfaf9cef8c55756bfaf55d7dc5dba..374c6b00d277bbcbc8630a04eb8b987f10566cd2 100644 (file)
@@ -195,7 +195,15 @@ public final class XSSFCell implements Cell {
                 return 0.0;
             case CELL_TYPE_FORMULA:
             case CELL_TYPE_NUMERIC:
-                return _cell.isSetV() ? Double.parseDouble(_cell.getV()) : 0.0;
+                if(_cell.isSetV()) {
+                   try {
+                      return Double.parseDouble(_cell.getV());
+                   } catch(NumberFormatException e) {
+                      throw typeMismatch(CELL_TYPE_NUMERIC, CELL_TYPE_STRING, false);
+                   }
+                } else {
+                   return 0.0;
+                }
             default:
                 throw typeMismatch(CELL_TYPE_NUMERIC, cellType, false);
         }
@@ -223,7 +231,7 @@ public final class XSSFCell implements Cell {
      * Get the value of the cell as a string
      * <p>
      * For numeric cells we throw an exception. For blank cells we return an empty string.
-     * For formulaCells that are not string Formulas, we return empty String.
+     * For formulaCells that are not string Formulas, we throw an exception
      * </p>
      * @return the value of the cell as a string
      */
@@ -236,7 +244,7 @@ public final class XSSFCell implements Cell {
      * Get the value of the cell as a XSSFRichTextString
      * <p>
      * For numeric cells we throw an exception. For blank cells we return an empty string.
-     * For formula cells we return the pre-calculated value.
+     * For formula cells we return the pre-calculated value if a string, otherwise an exception
      * </p>
      * @return the value of the cell as a XSSFRichTextString
      */
index ed8f03e7844b9274bd452ad0d2d8b6d41a9bdce9..504eceb0acb7d9cf2f427b43f85605bc5d52562f 100644 (file)
@@ -28,6 +28,7 @@ import org.apache.poi.ss.usermodel.BaseTestBugzillaIssues;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.DataFormatter;
 import org.apache.poi.ss.usermodel.Font;
+import org.apache.poi.ss.usermodel.FormulaEvaluator;
 import org.apache.poi.ss.usermodel.Name;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
@@ -330,4 +331,70 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
        assertEquals("123", df.formatRawCellContents(123.0, -1, "@"));
        assertEquals("123", df.formatRawCellContents(123.0, -1, "General"));
     }
+    
+    /**
+     * Ensures that XSSF and HSSF agree with each other,
+     *  and with the docs on when fetching the wrong
+     *  kind of value from a Formula cell
+     */
+    public void test47815() {
+       Workbook[] wbs = new Workbook[] {
+             new HSSFWorkbook(),
+             new XSSFWorkbook()
+       };
+       for(Workbook wb : wbs) {
+          Sheet s = wb.createSheet();
+          Row r = s.createRow(0);
+          
+          // Setup
+          Cell cn = r.createCell(0, Cell.CELL_TYPE_NUMERIC);
+          cn.setCellValue(1.2);
+          Cell cs = r.createCell(1, Cell.CELL_TYPE_STRING);
+          cs.setCellValue("Testing");
+          
+          Cell cfn = r.createCell(2, Cell.CELL_TYPE_FORMULA);
+          cfn.setCellFormula("A1");  
+          Cell cfs = r.createCell(3, Cell.CELL_TYPE_FORMULA);
+          cfs.setCellFormula("B1");
+          
+          FormulaEvaluator fe = wb.getCreationHelper().createFormulaEvaluator();
+          assertEquals(Cell.CELL_TYPE_NUMERIC, fe.evaluate(cfn).getCellType());
+          assertEquals(Cell.CELL_TYPE_STRING, fe.evaluate(cfs).getCellType());
+          fe.evaluateFormulaCell(cfn);
+          fe.evaluateFormulaCell(cfs);
+          
+          // Now test
+          assertEquals(Cell.CELL_TYPE_NUMERIC, cn.getCellType());
+          assertEquals(Cell.CELL_TYPE_STRING, cs.getCellType());
+          assertEquals(Cell.CELL_TYPE_FORMULA, cfn.getCellType());
+          assertEquals(Cell.CELL_TYPE_NUMERIC, cfn.getCachedFormulaResultType());
+          assertEquals(Cell.CELL_TYPE_FORMULA, cfs.getCellType());
+          assertEquals(Cell.CELL_TYPE_STRING, cfs.getCachedFormulaResultType());
+          
+          // Different ways of retrieving
+          assertEquals(1.2, cn.getNumericCellValue());
+          try {
+             cn.getRichStringCellValue();
+             fail();
+          } catch(IllegalStateException e) {}
+          
+          assertEquals("Testing", cs.getStringCellValue());
+          try {
+             cs.getNumericCellValue();
+             fail();
+          } catch(IllegalStateException e) {}
+          
+          assertEquals(1.2, cfn.getNumericCellValue());
+          try {
+             cfn.getRichStringCellValue();
+             fail();
+          } catch(IllegalStateException e) {}
+          
+          assertEquals("Testing", cfs.getStringCellValue());
+          try {
+             cfs.getNumericCellValue();
+             fail();
+          } catch(IllegalStateException e) {}
+       }
+    }
 }