]> source.dussan.org Git - poi.git/commitdiff
added HSSFFormulaEvaluator.setIgnoreMissingWorkbooks, see Bugzilla 52575
authorYegor Kozlov <yegor@apache.org>
Tue, 7 Feb 2012 08:11:37 +0000 (08:11 +0000)
committerYegor Kozlov <yegor@apache.org>
Tue, 7 Feb 2012 08:11:37 +0000 (08:11 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1241372 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java
src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java
src/testcases/org/apache/poi/ss/formula/TestMissingWorkbook.java

index 86c85f02b372df86d94b0697648e5a9efc5aa0b9..5d01e7a63ac9b2aea1464f1d92bbc9d7ee98426e 100644 (file)
@@ -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.
+     * <p>
+     * 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:
+     * <ul>
+     *     <li>by default ignoreMissingWorkbooks=false and POI throws {@link org.apache.poi.ss.formula.CollaboratingWorkbooksEnvironment.WorkbookNotFoundException}
+     *     if an external reference cannot be resolved</li>
+     *     <li>if ignoreMissingWorkbooks=true then POI uses cached formula result
+     *     that already exists in the main workbook</li>
+     * </ul>
+     *
+     * @param ignore whether to ignore missing references to external workbooks
+     */
+    public void setIgnoreMissingWorkbooks(boolean ignore){
+        _bookEvaluator.setIgnoreMissingWorkbooks(ignore);
+    }
+
 }
index 3807c9c291c3e370fc77c5e07a0a6742b0170406..e6d4da22f947f8c082f6cd22f1b6c558c7547719 100644 (file)
@@ -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 <code>null</code> 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.
+     * <p>
+     * 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:
+     * <ul>
+     *     <li>by default ignoreMissingWorkbooks=false and POI throws {@link WorkbookNotFoundException}
+     *     if an external reference cannot be resolved</li>
+     *     <li>if ignoreMissingWorkbooks=true then POI uses cached formula result
+     *     that already exists in the main workbook</li>
+     * </ul>
+     *
+     * @param ignore whether to ignore missing references to external workbooks
+     * @see <a href="https://issues.apache.org/bugzilla/show_bug.cgi?id=52575">Bug 52575</a> for details
+     */
+    public void setIgnoreMissingWorkbooks(boolean ignore){
+        _ignoreMissingWorkbooks = ignore;
+    }
 }
index 7b639f996e477f163304757ad28c90ebecb8fbe6..faf943dbfecf5aaf116ebf0ca6a8a74b44573624 100644 (file)
@@ -72,9 +72,9 @@ public class TestMissingWorkbook extends TestCase {
                assertEquals(Cell.CELL_TYPE_FORMULA, lB1Cell.getCellType());\r
                assertEquals(Cell.CELL_TYPE_FORMULA, lC1Cell.getCellType());\r
                \r
-               FormulaEvaluator evaluator = mainWorkbook.getCreationHelper().createFormulaEvaluator();\r
-               \r
-               System.setProperty(propertyKey, Boolean.toString(true));\r
+               HSSFFormulaEvaluator evaluator = mainWorkbook.getCreationHelper().createFormulaEvaluator();\r
+        evaluator.setIgnoreMissingWorkbooks(true);\r
+\r
                assertEquals(Cell.CELL_TYPE_NUMERIC, evaluator.evaluateFormulaCell(lA1Cell));\r
                assertEquals(Cell.CELL_TYPE_STRING, evaluator.evaluateFormulaCell(lB1Cell));\r
                assertEquals(Cell.CELL_TYPE_BOOLEAN, evaluator.evaluateFormulaCell(lC1Cell));\r