diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java b/src/java/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java
index 86c85f02b3..5d01e7a63a 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:
+ *
+ * - by default ignoreMissingWorkbooks=false and POI throws {@link org.apache.poi.ss.formula.CollaboratingWorkbooksEnvironment.WorkbookNotFoundException}
+ * if an external reference cannot be resolved
+ * - if ignoreMissingWorkbooks=true then POI uses cached formula result
+ * that already exists in the main workbook
+ *
+ *
+ * @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 3807c9c291..e6d4da22f9 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:
+ *
+ * - by default ignoreMissingWorkbooks=false and POI throws {@link WorkbookNotFoundException}
+ * if an external reference cannot be resolved
+ * - if ignoreMissingWorkbooks=true then POI uses cached formula result
+ * that already exists in the main workbook
+ *
+ *
+ * @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 7b639f996e..faf943dbfe 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));