From b70cf560db9327f052ec71e6f60afda32fe6ae04 Mon Sep 17 00:00:00 2001 From: Yegor Kozlov Date: Tue, 7 Feb 2012 08:11:37 +0000 Subject: [PATCH] added HSSFFormulaEvaluator.setIgnoreMissingWorkbooks, see Bugzilla 52575 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1241372 13f79535-47bb-0310-9956-ffa450edef68 --- .../hssf/usermodel/HSSFFormulaEvaluator.java | 20 ++++++++++++ .../poi/ss/formula/WorkbookEvaluator.java | 32 +++++++++++++------ .../poi/ss/formula/TestMissingWorkbook.java | 6 ++-- 3 files changed, 46 insertions(+), 12 deletions(-) diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java b/src/java/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java index 86c85f02b..5d01e7a63 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java @@ -369,4 +369,24 @@ public class HSSFFormulaEvaluator implements FormulaEvaluator { } throw new RuntimeException("Unexpected eval class (" + eval.getClass().getName() + ")"); } + + /** + * Whether to ignore missing references to external workbooks and + * use cached formula results in the main workbook instead. + *

+ * In some cases exetrnal workbooks referenced by formulas in the main workbook are not avaiable. + * With this method you can control how POI handles such missing references: + *

+ * + * @param ignore whether to ignore missing references to external workbooks + */ + public void setIgnoreMissingWorkbooks(boolean ignore){ + _bookEvaluator.setIgnoreMissingWorkbooks(ignore); + } + } diff --git a/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java b/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java index 3807c9c29..e6d4da22f 100644 --- a/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java +++ b/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java @@ -85,12 +85,6 @@ public final class WorkbookEvaluator { private static final POILogger LOG = POILogFactory.getLogger(WorkbookEvaluator.class); - /** - * Whether to use cached formula results if external workbook references in a formula is not available. - * See Bugzilla 52575 for details. - */ - private static final String IGNORE_MISSING_WORKBOOKS = WorkbookEvaluator.class.getName() + ".IGNORE_MISSING_WORKBOOKS"; - private final EvaluationWorkbook _workbook; private EvaluationCache _cache; /** part of cache entry key (useful when evaluating multiple workbooks) */ @@ -103,6 +97,8 @@ public final class WorkbookEvaluator { private final IStabilityClassifier _stabilityClassifier; private final AggregatingUDFFinder _udfFinder; + private boolean _ignoreMissingWorkbooks = false; + /** * @param udfFinder pass null for default (AnalysisToolPak only) */ @@ -310,9 +306,7 @@ public final class WorkbookEvaluator { catch (NotImplementedException e) { throw addExceptionInfo(e, sheetIndex, rowIndex, columnIndex); } catch (RuntimeException re) { - if (re.getCause() instanceof WorkbookNotFoundException - //To be replaced by configuration infrastructure - && Boolean.valueOf(System.getProperty(IGNORE_MISSING_WORKBOOKS))) { + if (re.getCause() instanceof WorkbookNotFoundException && _ignoreMissingWorkbooks) { logInfo(re.getCause().getMessage() + " - Continuing with cached value!"); switch(srcCell.getCachedFormulaResultType()) { case Cell.CELL_TYPE_NUMERIC: @@ -671,4 +665,24 @@ public final class WorkbookEvaluator { public FreeRefFunction findUserDefinedFunction(String functionName) { return _udfFinder.findFunction(functionName); } + + /** + * Whether to ignore missing references to external workbooks and + * use cached formula results in the main workbook instead. + *

+ * In some cases exetrnal workbooks referenced by formulas in the main workbook are not avaiable. + * With this method you can control how POI handles such missing references: + *

+ * + * @param ignore whether to ignore missing references to external workbooks + * @see Bug 52575 for details + */ + public void setIgnoreMissingWorkbooks(boolean ignore){ + _ignoreMissingWorkbooks = ignore; + } } diff --git a/src/testcases/org/apache/poi/ss/formula/TestMissingWorkbook.java b/src/testcases/org/apache/poi/ss/formula/TestMissingWorkbook.java index 7b639f996..faf943dbf 100644 --- a/src/testcases/org/apache/poi/ss/formula/TestMissingWorkbook.java +++ b/src/testcases/org/apache/poi/ss/formula/TestMissingWorkbook.java @@ -72,9 +72,9 @@ public class TestMissingWorkbook extends TestCase { assertEquals(Cell.CELL_TYPE_FORMULA, lB1Cell.getCellType()); assertEquals(Cell.CELL_TYPE_FORMULA, lC1Cell.getCellType()); - FormulaEvaluator evaluator = mainWorkbook.getCreationHelper().createFormulaEvaluator(); - - System.setProperty(propertyKey, Boolean.toString(true)); + HSSFFormulaEvaluator evaluator = mainWorkbook.getCreationHelper().createFormulaEvaluator(); + evaluator.setIgnoreMissingWorkbooks(true); + assertEquals(Cell.CELL_TYPE_NUMERIC, evaluator.evaluateFormulaCell(lA1Cell)); assertEquals(Cell.CELL_TYPE_STRING, evaluator.evaluateFormulaCell(lB1Cell)); assertEquals(Cell.CELL_TYPE_BOOLEAN, evaluator.evaluateFormulaCell(lC1Cell));