added HSSFFormulaEvaluator.setIgnoreMissingWorkbooks, see Bugzilla 52575
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1241372 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
2e2559d80a
commit
b70cf560db
@ -369,4 +369,24 @@ public class HSSFFormulaEvaluator implements FormulaEvaluator {
|
|||||||
}
|
}
|
||||||
throw new RuntimeException("Unexpected eval class (" + eval.getClass().getName() + ")");
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -85,12 +85,6 @@ public final class WorkbookEvaluator {
|
|||||||
|
|
||||||
private static final POILogger LOG = POILogFactory.getLogger(WorkbookEvaluator.class);
|
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 final EvaluationWorkbook _workbook;
|
||||||
private EvaluationCache _cache;
|
private EvaluationCache _cache;
|
||||||
/** part of cache entry key (useful when evaluating multiple workbooks) */
|
/** part of cache entry key (useful when evaluating multiple workbooks) */
|
||||||
@ -103,6 +97,8 @@ public final class WorkbookEvaluator {
|
|||||||
private final IStabilityClassifier _stabilityClassifier;
|
private final IStabilityClassifier _stabilityClassifier;
|
||||||
private final AggregatingUDFFinder _udfFinder;
|
private final AggregatingUDFFinder _udfFinder;
|
||||||
|
|
||||||
|
private boolean _ignoreMissingWorkbooks = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param udfFinder pass <code>null</code> for default (AnalysisToolPak only)
|
* @param udfFinder pass <code>null</code> for default (AnalysisToolPak only)
|
||||||
*/
|
*/
|
||||||
@ -310,9 +306,7 @@ public final class WorkbookEvaluator {
|
|||||||
catch (NotImplementedException e) {
|
catch (NotImplementedException e) {
|
||||||
throw addExceptionInfo(e, sheetIndex, rowIndex, columnIndex);
|
throw addExceptionInfo(e, sheetIndex, rowIndex, columnIndex);
|
||||||
} catch (RuntimeException re) {
|
} catch (RuntimeException re) {
|
||||||
if (re.getCause() instanceof WorkbookNotFoundException
|
if (re.getCause() instanceof WorkbookNotFoundException && _ignoreMissingWorkbooks) {
|
||||||
//To be replaced by configuration infrastructure
|
|
||||||
&& Boolean.valueOf(System.getProperty(IGNORE_MISSING_WORKBOOKS))) {
|
|
||||||
logInfo(re.getCause().getMessage() + " - Continuing with cached value!");
|
logInfo(re.getCause().getMessage() + " - Continuing with cached value!");
|
||||||
switch(srcCell.getCachedFormulaResultType()) {
|
switch(srcCell.getCachedFormulaResultType()) {
|
||||||
case Cell.CELL_TYPE_NUMERIC:
|
case Cell.CELL_TYPE_NUMERIC:
|
||||||
@ -671,4 +665,24 @@ public final class WorkbookEvaluator {
|
|||||||
public FreeRefFunction findUserDefinedFunction(String functionName) {
|
public FreeRefFunction findUserDefinedFunction(String functionName) {
|
||||||
return _udfFinder.findFunction(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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -72,9 +72,9 @@ public class TestMissingWorkbook extends TestCase {
|
|||||||
assertEquals(Cell.CELL_TYPE_FORMULA, lB1Cell.getCellType());
|
assertEquals(Cell.CELL_TYPE_FORMULA, lB1Cell.getCellType());
|
||||||
assertEquals(Cell.CELL_TYPE_FORMULA, lC1Cell.getCellType());
|
assertEquals(Cell.CELL_TYPE_FORMULA, lC1Cell.getCellType());
|
||||||
|
|
||||||
FormulaEvaluator evaluator = mainWorkbook.getCreationHelper().createFormulaEvaluator();
|
HSSFFormulaEvaluator evaluator = mainWorkbook.getCreationHelper().createFormulaEvaluator();
|
||||||
|
evaluator.setIgnoreMissingWorkbooks(true);
|
||||||
System.setProperty(propertyKey, Boolean.toString(true));
|
|
||||||
assertEquals(Cell.CELL_TYPE_NUMERIC, evaluator.evaluateFormulaCell(lA1Cell));
|
assertEquals(Cell.CELL_TYPE_NUMERIC, evaluator.evaluateFormulaCell(lA1Cell));
|
||||||
assertEquals(Cell.CELL_TYPE_STRING, evaluator.evaluateFormulaCell(lB1Cell));
|
assertEquals(Cell.CELL_TYPE_STRING, evaluator.evaluateFormulaCell(lB1Cell));
|
||||||
assertEquals(Cell.CELL_TYPE_BOOLEAN, evaluator.evaluateFormulaCell(lC1Cell));
|
assertEquals(Cell.CELL_TYPE_BOOLEAN, evaluator.evaluateFormulaCell(lC1Cell));
|
||||||
|
Loading…
Reference in New Issue
Block a user