diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java index 51d4b48ba..3f3bedfd0 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java @@ -184,20 +184,30 @@ public final class HSSFWorkbook extends POIDocument implements org.apache.poi.ss this(InternalWorkbook.createWorkbook()); } - private HSSFWorkbook(InternalWorkbook book) { - super((DirectoryNode)null); - workbook = book; - _sheets = new ArrayList(INITIAL_CAPACITY); - names = new ArrayList(INITIAL_CAPACITY); - } + private HSSFWorkbook(InternalWorkbook book) { + super((DirectoryNode)null); + workbook = book; + _sheets = new ArrayList(INITIAL_CAPACITY); + names = new ArrayList(INITIAL_CAPACITY); + } + /** + * Given a POI POIFSFileSystem object, read in its Workbook along + * with all related nodes, and populate the high and low level models. + *

This calls {@link #HSSFWorkbook(POIFSFileSystem, boolean)} with + * preserve nodes set to true. + * + * @see #HSSFWorkbook(POIFSFileSystem, boolean) + * @see org.apache.poi.poifs.filesystem.POIFSFileSystem + * @exception IOException if the stream cannot be read + */ public HSSFWorkbook(POIFSFileSystem fs) throws IOException { this(fs,true); } /** - * given a POI POIFSFileSystem object, read in its Workbook and populate the high and - * low level models. If you're reading in a workbook...start here. + * Given a POI POIFSFileSystem object, read in its Workbook and populate + * the high and low level models. If you're reading in a workbook... start here! * * @param fs the POI filesystem that contains the Workbook stream. * @param preserveNodes whether to preseve other nodes, such as @@ -208,8 +218,7 @@ public final class HSSFWorkbook extends POIDocument implements org.apache.poi.ss * @exception IOException if the stream cannot be read */ public HSSFWorkbook(POIFSFileSystem fs, boolean preserveNodes) - throws IOException - { + throws IOException { this(fs.getRoot(), fs, preserveNodes); } @@ -338,13 +347,24 @@ public final class HSSFWorkbook extends POIDocument implements org.apache.poi.ss } } - public HSSFWorkbook(InputStream s) throws IOException { - this(s,true); - } + /** + * Companion to HSSFWorkbook(POIFSFileSystem), this constructs the + * POI filesystem around your inputstream, including all nodes. + *

This calls {@link #HSSFWorkbook(InputStream, boolean)} with + * preserve nodes set to true. + * + * @see #HSSFWorkbook(InputStream, boolean) + * @see #HSSFWorkbook(POIFSFileSystem) + * @see org.apache.poi.poifs.filesystem.POIFSFileSystem + * @exception IOException if the stream cannot be read + */ + public HSSFWorkbook(InputStream s) throws IOException { + this(s,true); + } /** - * Companion to HSSFWorkbook(POIFSFileSystem), this constructs the POI filesystem around your - * inputstream. + * Companion to HSSFWorkbook(POIFSFileSystem), this constructs the + * POI filesystem around your inputstream. * * @param s the POI filesystem that contains the Workbook stream. * @param preserveNodes whether to preseve other nodes, such as @@ -354,7 +374,6 @@ public final class HSSFWorkbook extends POIDocument implements org.apache.poi.ss * @see #HSSFWorkbook(POIFSFileSystem) * @exception IOException if the stream cannot be read */ - public HSSFWorkbook(InputStream s, boolean preserveNodes) throws IOException { diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java index a813bce81..bfdacbd39 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java @@ -166,6 +166,29 @@ public final class TestXSSFFormulaEvaluation extends BaseTestFormulaEvaluator { assertEquals("\"Hello!\"", evaluator.evaluate(cXSL_cell).formatAsString()); assertEquals("\"Test A1\"", evaluator.evaluate(cXSL_sNR).formatAsString()); assertEquals("142.0", evaluator.evaluate(cXSL_gNR).formatAsString()); + + + // Now add a formula that refers to a different workbook again + Cell cXSLX_nw_cell = rXSLX.createCell(42); + cXSLX_nw_cell.setCellFormula("[alt.xslx]Sheet1!$A$1"); + + // Check it - TODO Is this correct? Or should it become [2]Sheet1!$A$1 ? + assertEquals("[alt.xslx]Sheet1!$A$1", cXSLX_nw_cell.getCellFormula()); + + // Evaluate it, without a link to that workbook + try { + evaluator.evaluate(cXSLX_nw_cell); + fail("No cached value and no link to workbook, shouldn't evaluate"); + } catch(Exception e) {} + + // Add a link, check it does + Workbook alt = new XSSFWorkbook(); + alt.createSheet().createRow(0).createCell(0).setCellValue("In another workbook"); + evaluators.put("alt.xslx", alt.getCreationHelper().createFormulaEvaluator()); + evaluator.setupReferencedWorkbooks(evaluators); + + evaluator.evaluate(cXSLX_nw_cell); + assertEquals("In another workbook", cXSLX_nw_cell.getStringCellValue()); } /**