]> source.dussan.org Git - poi.git/commitdiff
Start re-enabling some SXSSF formula evaluation tests, with required fixes #58200
authorNick Burch <nick@apache.org>
Fri, 31 Jul 2015 22:07:58 +0000 (22:07 +0000)
committerNick Burch <nick@apache.org>
Fri, 31 Jul 2015 22:07:58 +0000 (22:07 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1693662 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCell.java
src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFCreationHelper.java
src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFFormulaEvaluator.java
src/ooxml/testcases/org/apache/poi/xssf/streaming/TestSXSSFCell.java

index f871f597b4581da7faeead699759d0d9d612c933..c95430bfc1509ca6042856d7b5014ca2580281dd 100644 (file)
@@ -908,7 +908,9 @@ public class SXSSFCell implements Cell {
     }
     private String convertCellValueToString() {
         int cellType = getCellType();
-
+        return convertCellValueToString(cellType);
+    }
+    private String convertCellValueToString(int cellType) {
         switch (cellType) {
             case CELL_TYPE_BLANK:
                 return "";
@@ -922,6 +924,12 @@ public class SXSSFCell implements Cell {
                 byte errVal = getErrorCellValue();
                 return FormulaError.forInt(errVal).getString();
             case CELL_TYPE_FORMULA:
+                if (_value != null) {
+                    FormulaValue fv = (FormulaValue)_value;
+                    if (fv.getFormulaType() != CELL_TYPE_FORMULA) {
+                        return convertCellValueToString(fv.getFormulaType());
+                    }
+                }
                 return "";
             default:
                 throw new IllegalStateException("Unexpected cell type (" + cellType + ")");
index d641583fd58b3085b2f7b7255786abe0c4fca830..128803bfe027c3a95dac054158da4834d810a371 100644 (file)
 
 package org.apache.poi.xssf.streaming;
 
+import org.apache.poi.ss.usermodel.ClientAnchor;
+import org.apache.poi.ss.usermodel.CreationHelper;
+import org.apache.poi.ss.usermodel.DataFormat;
+import org.apache.poi.ss.usermodel.ExtendedColor;
+import org.apache.poi.ss.usermodel.Hyperlink;
 import org.apache.poi.util.POILogFactory;
 import org.apache.poi.util.POILogger;
 import org.apache.poi.xssf.usermodel.XSSFCreationHelper;
@@ -27,13 +32,14 @@ import org.apache.poi.xssf.usermodel.XSSFRichTextString;
  *  based on the Streaming Workbook, and some on the related
  *  regular XSSF Workbook
  */
-public class SXSSFCreationHelper extends XSSFCreationHelper {
+public class SXSSFCreationHelper implements CreationHelper {
     private static POILogger logger = POILogFactory.getLogger(SXSSFCreationHelper.class);
     
     private SXSSFWorkbook wb;
+    private XSSFCreationHelper helper;
     
     public SXSSFCreationHelper(SXSSFWorkbook workbook) {
-        super(workbook.getXSSFWorkbook());
+        this.helper = new XSSFCreationHelper(workbook.getXSSFWorkbook());
         this.wb = workbook;
     }
 
@@ -45,4 +51,18 @@ public class SXSSFCreationHelper extends XSSFCreationHelper {
     public SXSSFFormulaEvaluator createFormulaEvaluator() {
         return new SXSSFFormulaEvaluator(wb);
     }
+
+    // Pass-through methods
+    public DataFormat createDataFormat() {
+        return helper.createDataFormat();
+    }
+    public Hyperlink createHyperlink(int type) {
+        return helper.createHyperlink(type);
+    }
+    public ExtendedColor createExtendedColor() {
+        return helper.createExtendedColor();
+    }
+    public ClientAnchor createClientAnchor() {
+        return helper.createClientAnchor();
+    }
 }
index 40abe9fe8d4a6204e050b14249b6ed3facafaac8..ff81cd357808ac4c712954e95025bab2060d1fa5 100644 (file)
@@ -25,13 +25,13 @@ import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.util.POILogFactory;
 import org.apache.poi.util.POILogger;
-import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator;
+import org.apache.poi.xssf.usermodel.BaseXSSFFormulaEvaluator;
 
 /**
  * Streaming-specific Formula Evaluator, which is able to 
  *  lookup cells within the current Window.
  */
-public class SXSSFFormulaEvaluator extends XSSFFormulaEvaluator {
+public final class SXSSFFormulaEvaluator extends BaseXSSFFormulaEvaluator {
     private static POILogger logger = POILogFactory.getLogger(SXSSFFormulaEvaluator.class);
     
     private SXSSFWorkbook wb;
@@ -43,7 +43,7 @@ public class SXSSFFormulaEvaluator extends XSSFFormulaEvaluator {
         this(workbook, new WorkbookEvaluator(SXSSFEvaluationWorkbook.create(workbook), stabilityClassifier, udfFinder));
     }
     private SXSSFFormulaEvaluator(SXSSFWorkbook workbook, WorkbookEvaluator bookEvaluator) {
-        super(workbook.getXSSFWorkbook(), bookEvaluator);
+        super(bookEvaluator);
         this.wb = workbook;
     }
     
@@ -70,6 +70,26 @@ public class SXSSFFormulaEvaluator extends XSSFFormulaEvaluator {
         return new SXSSFEvaluationCell((SXSSFCell)cell);
     }
     
+    /**
+     * If cell contains formula, it evaluates the formula, and
+     *  puts the formula result back into the cell, in place
+     *  of the old formula.
+     * Else if cell does not contain formula, this method leaves
+     *  the cell unchanged.
+     * Note that the same instance of SXSSFCell is returned to
+     * allow chained calls like:
+     * <pre>
+     * int evaluatedCellType = evaluator.evaluateInCell(cell).getCellType();
+     * </pre>
+     * Be aware that your cell value will be changed to hold the
+     *  result of the formula. If you simply want the formula
+     *  value computed for you, use {@link #evaluateFormulaCell(org.apache.poi.ss.usermodel.Cell)} }
+     */
+    public SXSSFCell evaluateInCell(Cell cell) {
+        doEvaluateInCell(cell);
+        return (SXSSFCell)cell;
+    }
+    
     /**
      * For active worksheets only, will loop over rows and
      *  cells, evaluating formula cells there.
index 86fda394ccf804a0c2edbf9da20ee6cbc59669d2..25f1d191793bffe9f35581a414bf8027636da132 100644 (file)
@@ -30,7 +30,6 @@ import org.apache.poi.xssf.SXSSFITestDataProvider;
 import org.apache.poi.xssf.usermodel.XSSFCell;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.apache.xmlbeans.XmlCursor;
-import org.junit.Ignore;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRst;
 
 /**
@@ -48,51 +47,6 @@ public class TestSXSSFCell extends BaseTestXCell {
         SXSSFITestDataProvider.instance.cleanup();
     }
 
-    /**
-     * this test involves evaluation of formulas which isn't supported for SXSSF
-     */
-    @Override
-    public void testConvertStringFormulaCell() {
-        try {
-            super.testConvertStringFormulaCell();
-            fail("expected exception");
-        } catch (IllegalArgumentException e){
-            assertEquals(
-                    "Unexpected type of cell: class org.apache.poi.xssf.streaming.SXSSFCell. " +
-                    "Only XSSFCells can be evaluated.", e.getMessage());
-        } catch (ClassCastException e) {} // TODO Temporary workaround during #58200
-    }
-
-    /**
-     * this test involves evaluation of formulas which isn't supported for SXSSF
-     */
-    @Override
-    public void testSetTypeStringOnFormulaCell() {
-        try {
-            super.testSetTypeStringOnFormulaCell();
-            fail("expected exception");
-        } catch (IllegalArgumentException e){
-            assertEquals(
-                    "Unexpected type of cell: class org.apache.poi.xssf.streaming.SXSSFCell. " +
-                    "Only XSSFCells can be evaluated.", e.getMessage());
-        } catch (ClassCastException e) {} // TODO Temporary workaround during #58200
-    }
-    
-    /**
-     * this test involves evaluation of formulas which isn't supported for SXSSF
-     */
-    @Override
-    public void testGetErrorCellValueFromFormulaCell() {
-        try {
-            super.testConvertStringFormulaCell();
-            fail("expected exception");
-        } catch (IllegalArgumentException e){
-            assertEquals(
-                    "Unexpected type of cell: class org.apache.poi.xssf.streaming.SXSSFCell. " +
-                    "Only XSSFCells can be evaluated.", e.getMessage());
-        } catch (ClassCastException e) {} // TODO Temporary workaround during #58200
-    }
-
     public void testPreserveSpaces() throws IOException {
         String[] samplesWithSpaces = {
                 " POI",