You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ni...@apache.org on 2014/07/21 14:23:55 UTC
svn commit: r1612254 - in /poi/trunk/src:
java/org/apache/poi/hssf/usermodel/ java/org/apache/poi/ss/formula/
java/org/apache/poi/ss/usermodel/ java/org/apache/poi/ss/util/
ooxml/java/org/apache/poi/xssf/usermodel/
ooxml/testcases/org/apache/poi/xssf/u...
Author: nick
Date: Mon Jul 21 12:23:54 2014
New Revision: 1612254
URL: http://svn.apache.org/r1612254
Log:
Generalise the CollaboratingWorkbooksEnvironment setup, so that XSSF can use it too
Added:
poi/trunk/src/java/org/apache/poi/ss/formula/WorkbookEvaluatorProvider.java
Modified:
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java
poi/trunk/src/java/org/apache/poi/ss/formula/CollaboratingWorkbooksEnvironment.java
poi/trunk/src/java/org/apache/poi/ss/usermodel/FormulaEvaluator.java
poi/trunk/src/java/org/apache/poi/ss/util/SheetUtil.java
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFormulaEvaluator.java
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java
Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java?rev=1612254&r1=1612253&r2=1612254&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java Mon Jul 21 12:23:54 2014
@@ -17,9 +17,12 @@
package org.apache.poi.hssf.usermodel;
+import java.util.Map;
+
import org.apache.poi.ss.formula.CollaboratingWorkbooksEnvironment;
import org.apache.poi.ss.formula.IStabilityClassifier;
import org.apache.poi.ss.formula.WorkbookEvaluator;
+import org.apache.poi.ss.formula.WorkbookEvaluatorProvider;
import org.apache.poi.ss.formula.eval.BoolEval;
import org.apache.poi.ss.formula.eval.ErrorEval;
import org.apache.poi.ss.formula.eval.NumericValueEval;
@@ -40,7 +43,7 @@ import org.apache.poi.ss.usermodel.Workb
* cell values. Be sure to call {@link #clearAllCachedResultValues()} if any workbook cells are changed between
* calls to evaluate~ methods on this class.
*/
-public class HSSFFormulaEvaluator implements FormulaEvaluator {
+public class HSSFFormulaEvaluator implements FormulaEvaluator, WorkbookEvaluatorProvider {
private WorkbookEvaluator _bookEvaluator;
private HSSFWorkbook _book;
@@ -101,7 +104,15 @@ public class HSSFFormulaEvaluator implem
CollaboratingWorkbooksEnvironment.setup(workbookNames, wbEvals);
}
- /**
+ public void setupReferencedWorkbooks(Map<String, FormulaEvaluator> evaluators) {
+ CollaboratingWorkbooksEnvironment.setupFormulaEvaluator(evaluators);
+ }
+
+ public WorkbookEvaluator _getWorkbookEvaluator() {
+ return _bookEvaluator;
+ }
+
+ /**
* Does nothing
* @deprecated (Aug 2008) - not needed, since the current row can be derived from the cell
*/
Modified: poi/trunk/src/java/org/apache/poi/ss/formula/CollaboratingWorkbooksEnvironment.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/CollaboratingWorkbooksEnvironment.java?rev=1612254&r1=1612253&r2=1612254&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/CollaboratingWorkbooksEnvironment.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/CollaboratingWorkbooksEnvironment.java Mon Jul 21 12:23:54 2014
@@ -24,6 +24,7 @@ import java.util.Iterator;
import java.util.Map;
import java.util.Set;
+import org.apache.poi.ss.usermodel.FormulaEvaluator;
import org.apache.poi.util.Internal;
/**
@@ -73,6 +74,19 @@ public final class CollaboratingWorkbook
evaluatorsByName.values().toArray(new WorkbookEvaluator[evaluatorsByName.size()]);
new CollaboratingWorkbooksEnvironment(evaluatorsByName, evaluators);
}
+ public static void setupFormulaEvaluator(Map<String,FormulaEvaluator> evaluators) {
+ Map<String, WorkbookEvaluator> evaluatorsByName = new HashMap<String, WorkbookEvaluator>(evaluators.size());
+ for (String wbName : evaluators.keySet()) {
+ FormulaEvaluator eval = evaluators.get(wbName);
+ if (eval instanceof WorkbookEvaluatorProvider) {
+ evaluatorsByName.put(wbName, ((WorkbookEvaluatorProvider)eval)._getWorkbookEvaluator());
+ } else {
+ throw new IllegalArgumentException("Formula Evaluator " + eval +
+ " provides no WorkbookEvaluator access");
+ }
+ }
+ setup(evaluatorsByName);
+ }
private CollaboratingWorkbooksEnvironment(String[] workbookNames, WorkbookEvaluator[] evaluators, int nItems) {
this(toUniqueMap(workbookNames, evaluators, nItems), evaluators);
Added: poi/trunk/src/java/org/apache/poi/ss/formula/WorkbookEvaluatorProvider.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/WorkbookEvaluatorProvider.java?rev=1612254&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/WorkbookEvaluatorProvider.java (added)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/WorkbookEvaluatorProvider.java Mon Jul 21 12:23:54 2014
@@ -0,0 +1,34 @@
+/* ====================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================== */
+
+package org.apache.poi.ss.formula;
+
+import org.apache.poi.util.Internal;
+
+/**
+ * Provides access to a {@link WorkbookEvaluator}, eg for use with
+ * {@link CollaboratingWorkbooksEnvironment}
+ *
+ * <p>For POI internal use only
+ */
+@Internal
+public interface WorkbookEvaluatorProvider {
+ /**
+ * Provide the underlying WorkbookEvaluator
+ */
+ WorkbookEvaluator _getWorkbookEvaluator();
+}
Modified: poi/trunk/src/java/org/apache/poi/ss/usermodel/FormulaEvaluator.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/FormulaEvaluator.java?rev=1612254&r1=1612253&r2=1612254&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/FormulaEvaluator.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/FormulaEvaluator.java Mon Jul 21 12:23:54 2014
@@ -17,6 +17,8 @@
package org.apache.poi.ss.usermodel;
+import java.util.Map;
+
/**
* Evaluates formula cells.<p/>
*
@@ -114,6 +116,16 @@ public interface FormulaEvaluator {
* @param cell
*/
Cell evaluateInCell(Cell cell);
+
+ /**
+ * Sets up the Formula Evaluator to be able to reference and resolve
+ * links to other workbooks, eg [Test.xls]Sheet1!A1.
+ * <p>For a workbook referenced as [Test.xls]Sheet1!A1, you should
+ * supply a map containing the key Test.xls (no square brackets),
+ * and an open FormulaEvaluator onto that Workbook.
+ * @param otherWorkbooks Map of workbook names (no square brackets) to an evaluator on that workbook
+ */
+ void setupReferencedWorkbooks(Map<String,FormulaEvaluator> workbooks);
/**
* Perform detailed output of formula evaluation for next evaluation only?
@@ -124,5 +136,4 @@ public interface FormulaEvaluator {
* @param value whether to perform detailed output
*/
void setDebugEvaluationOutputForNextEval(boolean value);
-
}
Modified: poi/trunk/src/java/org/apache/poi/ss/util/SheetUtil.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/util/SheetUtil.java?rev=1612254&r1=1612253&r2=1612254&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/util/SheetUtil.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/util/SheetUtil.java Mon Jul 21 12:23:54 2014
@@ -17,13 +17,23 @@
package org.apache.poi.ss.util;
-import org.apache.poi.ss.usermodel.*;
-
-import java.text.AttributedString;
-import java.awt.font.TextLayout;
import java.awt.font.FontRenderContext;
import java.awt.font.TextAttribute;
+import java.awt.font.TextLayout;
import java.awt.geom.AffineTransform;
+import java.text.AttributedString;
+import java.util.Map;
+
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.CellValue;
+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.RichTextString;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
/**
@@ -61,6 +71,7 @@ public class SheetUtil {
public void notifyUpdateCell(Cell cell) {}
public CellValue evaluate(Cell cell) {return null; }
public Cell evaluateInCell(Cell cell) { return null; }
+ public void setupReferencedWorkbooks(Map<String, FormulaEvaluator> workbooks) {}
public void setDebugEvaluationOutputForNextEval(boolean value) {}
public void evaluateAll() {}
Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFormulaEvaluator.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFormulaEvaluator.java?rev=1612254&r1=1612253&r2=1612254&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFormulaEvaluator.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFormulaEvaluator.java Mon Jul 21 12:23:54 2014
@@ -17,9 +17,13 @@
package org.apache.poi.xssf.usermodel;
+import java.util.Map;
+
import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
+import org.apache.poi.ss.formula.CollaboratingWorkbooksEnvironment;
import org.apache.poi.ss.formula.IStabilityClassifier;
import org.apache.poi.ss.formula.WorkbookEvaluator;
+import org.apache.poi.ss.formula.WorkbookEvaluatorProvider;
import org.apache.poi.ss.formula.eval.BoolEval;
import org.apache.poi.ss.formula.eval.ErrorEval;
import org.apache.poi.ss.formula.eval.NumberEval;
@@ -41,7 +45,7 @@ import org.apache.poi.ss.usermodel.Workb
* @author Amol S. Deshmukh < amolweb at ya hoo dot com >
* @author Josh Micich
*/
-public class XSSFFormulaEvaluator implements FormulaEvaluator {
+public class XSSFFormulaEvaluator implements FormulaEvaluator, WorkbookEvaluatorProvider {
private WorkbookEvaluator _bookEvaluator;
private XSSFWorkbook _book;
@@ -280,6 +284,14 @@ public class XSSFFormulaEvaluator implem
throw new RuntimeException("Unexpected eval class (" + eval.getClass().getName() + ")");
}
+ public void setupReferencedWorkbooks(Map<String, FormulaEvaluator> evaluators) {
+ CollaboratingWorkbooksEnvironment.setupFormulaEvaluator(evaluators);
+ }
+
+ public WorkbookEvaluator _getWorkbookEvaluator() {
+ return _bookEvaluator;
+ }
+
/** {@inheritDoc} */
public void setDebugEvaluationOutputForNextEval(boolean value){
_bookEvaluator.setDebugEvaluationOutputForNextEval(value);
Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java?rev=1612254&r1=1612253&r2=1612254&view=diff
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java (original)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java Mon Jul 21 12:23:54 2014
@@ -17,6 +17,10 @@
package org.apache.poi.xssf.usermodel;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.poi.hssf.HSSFTestDataSamples;
import org.apache.poi.ss.usermodel.BaseTestFormulaEvaluator;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellValue;
@@ -126,8 +130,32 @@ public final class TestXSSFFormulaEvalua
assertEquals("Test A1", cXSL_sNR.getStringCellValue());
assertEquals(142.0, cXSL_gNR.getNumericCellValue());
- // Try evaluating
- // TODO
+ // Try to evaluate without references, won't work
+ // (At least, not unit we fix bug #56752 that is)
+ try {
+ evaluator.evaluate(cXSL_cell);
+ fail("Without a fix for #56752, shouldn't be able to evaluate a " +
+ "reference to a non-provided linked workbook");
+ } catch(Exception e) {}
+
+ // Setup the environment
+ Map<String,FormulaEvaluator> evaluators = new HashMap<String, FormulaEvaluator>();
+ evaluators.put("ref2-56737.xlsx", evaluator);
+ evaluators.put("56737.xlsx",
+ _testDataProvider.openSampleWorkbook("56737.xlsx").getCreationHelper().createFormulaEvaluator());
+ evaluators.put("56737.xls",
+ HSSFTestDataSamples.openSampleWorkbook("56737.xls").getCreationHelper().createFormulaEvaluator());
+ evaluator.setupReferencedWorkbooks(evaluators);
+
+ // Try evaluating all of them, ensure we don't blow up
+ for(Row r : s) {
+ for (Cell c : r) {
+ // TODO Fix and enable
+ // evaluator.evaluate(c);
+ }
+ }
+
+ // Evaluate and check results
}
/**
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org