From: Nick Burch Date: Wed, 30 Jul 2014 18:08:28 +0000 (+0000) Subject: #56132 Allow XSSF formula evaluation to also skip missing external workbook reference... X-Git-Tag: REL_3_11_BETA1~13 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=a7df4f8b92d9d7ba610bffda1193ac2b44f44a8a;p=poi.git #56132 Allow XSSF formula evaluation to also skip missing external workbook references, if requested git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1614729 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java b/src/java/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java index 1e8098b9ef..e73903759c 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java @@ -378,21 +378,7 @@ public class HSSFFormulaEvaluator implements FormulaEvaluator, WorkbookEvaluator 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 - */ + /** {@inheritDoc} */ public void setIgnoreMissingWorkbooks(boolean ignore){ _bookEvaluator.setIgnoreMissingWorkbooks(ignore); } diff --git a/src/java/org/apache/poi/ss/usermodel/FormulaEvaluator.java b/src/java/org/apache/poi/ss/usermodel/FormulaEvaluator.java index 911647bb0e..289a209873 100644 --- a/src/java/org/apache/poi/ss/usermodel/FormulaEvaluator.java +++ b/src/java/org/apache/poi/ss/usermodel/FormulaEvaluator.java @@ -127,6 +127,24 @@ public interface FormulaEvaluator { */ void setupReferencedWorkbooks(Map workbooks); + /** + * Whether to ignore missing references to external workbooks and + * use cached formula results in the main workbook instead. + *

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

+ * + * @param ignore whether to ignore missing references to external workbooks + */ + void setIgnoreMissingWorkbooks(boolean ignore); + /** * Perform detailed output of formula evaluation for next evaluation only? * Is for developer use only (also developers using POI for their XLS files). diff --git a/src/java/org/apache/poi/ss/util/SheetUtil.java b/src/java/org/apache/poi/ss/util/SheetUtil.java index 792ef31f69..71c3c3cb40 100644 --- a/src/java/org/apache/poi/ss/util/SheetUtil.java +++ b/src/java/org/apache/poi/ss/util/SheetUtil.java @@ -73,13 +73,12 @@ public class SheetUtil { public Cell evaluateInCell(Cell cell) { return null; } public void setupReferencedWorkbooks(Map workbooks) {} public void setDebugEvaluationOutputForNextEval(boolean value) {} - + public void setIgnoreMissingWorkbooks(boolean ignore) {} + public void evaluateAll() {} - public int evaluateFormulaCell(Cell cell) { return cell.getCachedFormulaResultType(); } - }; /** diff --git a/src/ooxml/java/org/apache/poi/xssf/model/ExternalLinksTable.java b/src/ooxml/java/org/apache/poi/xssf/model/ExternalLinksTable.java index 9d66b6fa48..c11d51ef9d 100644 --- a/src/ooxml/java/org/apache/poi/xssf/model/ExternalLinksTable.java +++ b/src/ooxml/java/org/apache/poi/xssf/model/ExternalLinksTable.java @@ -44,6 +44,7 @@ public class ExternalLinksTable extends POIXMLDocumentPart { public ExternalLinksTable() { super(); link = CTExternalLink.Factory.newInstance(); + link.addNewExternalBook(); } public ExternalLinksTable(PackagePart part, PackageRelationship rel) throws IOException { diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFormulaEvaluator.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFormulaEvaluator.java index 90091a1466..bfa4c6d678 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFormulaEvaluator.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFormulaEvaluator.java @@ -292,9 +292,13 @@ public class XSSFFormulaEvaluator implements FormulaEvaluator, WorkbookEvaluator return _bookEvaluator; } + /** {@inheritDoc} */ + public void setIgnoreMissingWorkbooks(boolean ignore){ + _bookEvaluator.setIgnoreMissingWorkbooks(ignore); + } + /** {@inheritDoc} */ public void setDebugEvaluationOutputForNextEval(boolean value){ _bookEvaluator.setDebugEvaluationOutputForNextEval(value); } - } diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestMissingWorkbookOnXSSF.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestMissingWorkbookOnXSSF.java new file mode 100644 index 0000000000..2427dd1d82 --- /dev/null +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestMissingWorkbookOnXSSF.java @@ -0,0 +1,40 @@ +/* ==================================================================== + 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.xssf.usermodel; + +import org.apache.poi.hssf.HSSFTestDataSamples; +import org.apache.poi.ss.formula.TestMissingWorkbook; +import org.apache.poi.xssf.XSSFTestDataSamples; + +/** + * XSSF Specific version of the Missing Workbooks test + */ +public final class TestMissingWorkbookOnXSSF extends TestMissingWorkbook { + public TestMissingWorkbookOnXSSF() { + super("52575_main.xlsx", "source_dummy.xlsx", "52575_source.xls"); + } + + @Override + protected void setUp() throws Exception { + mainWorkbook = XSSFTestDataSamples.openSampleWorkbook(MAIN_WORKBOOK_FILENAME); + sourceWorkbook = HSSFTestDataSamples.openSampleWorkbook(SOURCE_WORKBOOK_FILENAME); + + assertNotNull(mainWorkbook); + assertNotNull(sourceWorkbook); + } +} diff --git a/src/testcases/org/apache/poi/ss/formula/TestMissingWorkbook.java b/src/testcases/org/apache/poi/ss/formula/TestMissingWorkbook.java index 50ca5e2988..35bb050b1a 100644 --- a/src/testcases/org/apache/poi/ss/formula/TestMissingWorkbook.java +++ b/src/testcases/org/apache/poi/ss/formula/TestMissingWorkbook.java @@ -33,12 +33,22 @@ import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; public class TestMissingWorkbook extends TestCase { - private static final String MAIN_WORKBOOK_FILENAME = "52575_main.xls"; - private static final String SOURCE_DUMMY_WORKBOOK_FILENAME = "source_dummy.xls"; - private static final String SOURCE_WORKBOOK_FILENAME = "52575_source.xls"; - - private Workbook mainWorkbook; - private Workbook sourceWorkbook; + protected Workbook mainWorkbook; + protected Workbook sourceWorkbook; + + protected final String MAIN_WORKBOOK_FILENAME; + protected final String SOURCE_DUMMY_WORKBOOK_FILENAME; + protected final String SOURCE_WORKBOOK_FILENAME; + + public TestMissingWorkbook() { + this("52575_main.xls", "source_dummy.xls", "52575_source.xls"); + } + protected TestMissingWorkbook(String MAIN_WORKBOOK_FILENAME, + String SOURCE_DUMMY_WORKBOOK_FILENAME, String SOURCE_WORKBOOK_FILENAME) { + this.MAIN_WORKBOOK_FILENAME = MAIN_WORKBOOK_FILENAME; + this.SOURCE_DUMMY_WORKBOOK_FILENAME = SOURCE_DUMMY_WORKBOOK_FILENAME; + this.SOURCE_WORKBOOK_FILENAME = SOURCE_WORKBOOK_FILENAME; + } @Override protected void setUp() throws Exception { @@ -74,12 +84,18 @@ public class TestMissingWorkbook extends TestCase { assertEquals(Cell.CELL_TYPE_FORMULA, lA1Cell.getCellType()); assertEquals(Cell.CELL_TYPE_FORMULA, lB1Cell.getCellType()); assertEquals(Cell.CELL_TYPE_FORMULA, lC1Cell.getCellType()); + + // Check cached values + assertEquals(10.0d, lA1Cell.getNumericCellValue(), 0.00001d); + assertEquals("POI rocks!", lB1Cell.getStringCellValue()); + assertEquals(true, lC1Cell.getBooleanCellValue()); + // Evaluate FormulaEvaluator 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_STRING, evaluator.evaluateFormulaCell(lB1Cell)); assertEquals(Cell.CELL_TYPE_BOOLEAN, evaluator.evaluateFormulaCell(lC1Cell)); assertEquals(10.0d, lA1Cell.getNumericCellValue(), 0.00001d);