From d3104416320eb3f040d1969cc09b368c2b837c40 Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Sat, 19 Jul 2014 21:27:28 +0000 Subject: [PATCH] Better reporting on why a test is failing, and partial NameXPxg eval git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1611969 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/ss/formula/WorkbookEvaluator.java | 20 +++++++++++++++++++ .../apache/poi/ss/formula/eval/NameXEval.java | 3 +-- .../poi/xssf/usermodel/TestXSSFBugs.java | 12 +++++++++-- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java b/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java index ec3f984315..6dd5dd2068 100644 --- a/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java +++ b/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java @@ -62,6 +62,7 @@ import org.apache.poi.ss.formula.ptg.MemFuncPtg; import org.apache.poi.ss.formula.ptg.MissingArgPtg; import org.apache.poi.ss.formula.ptg.NamePtg; import org.apache.poi.ss.formula.ptg.NameXPtg; +import org.apache.poi.ss.formula.ptg.NameXPxg; import org.apache.poi.ss.formula.ptg.NumberPtg; import org.apache.poi.ss.formula.ptg.OperationPtg; import org.apache.poi.ss.formula.ptg.Ptg; @@ -650,6 +651,25 @@ public final class WorkbookEvaluator { return eval; } } + if (ptg instanceof NameXPxg) { + // TODO This is a temporary hack.... + NameXPxg pxg = (NameXPxg)ptg; + int sIdx = -1; + if (pxg.getSheetName() != null) { + sIdx = _workbook.getSheetIndex(pxg.getSheetName()); + } + EvaluationName evalName = _workbook.getName(pxg.getNameName(), sIdx); + if (evalName == null) { + // We don't know about that name, sorry + // TODO What about UDFs? + logInfo("Unknown Name referenced: " + pxg.getNameName()); + return ErrorEval.NAME_INVALID; + } + + int nIdx = evalName.createPtg().getIndex(); + NameXPtg nptg = new NameXPtg(sIdx, nIdx); + return getEvalForPtg(nptg, ec); + } if (ptg instanceof IntPtg) { return new NumberEval(((IntPtg)ptg).getValue()); diff --git a/src/java/org/apache/poi/ss/formula/eval/NameXEval.java b/src/java/org/apache/poi/ss/formula/eval/NameXEval.java index 32831bc258..e7e9bf881a 100644 --- a/src/java/org/apache/poi/ss/formula/eval/NameXEval.java +++ b/src/java/org/apache/poi/ss/formula/eval/NameXEval.java @@ -20,10 +20,9 @@ package org.apache.poi.ss.formula.eval; import org.apache.poi.ss.formula.ptg.NameXPtg; /** - * @author Josh Micich + * Evaluation of a Name defined in a Sheet or Workbook scope */ public final class NameXEval implements ValueEval { - private final NameXPtg _ptg; public NameXEval(NameXPtg ptg) { diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java index 92090c0e7a..b1f223e1c3 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java @@ -266,6 +266,7 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues { public void bug48539() throws Exception { XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("48539.xlsx"); assertEquals(3, wb.getNumberOfSheets()); + assertEquals(0, wb.getNumberOfNames()); // Try each cell individually XSSFFormulaEvaluator eval = new XSSFFormulaEvaluator(wb); @@ -274,7 +275,14 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues { for(Row r : s) { for(Cell c : r) { if(c.getCellType() == Cell.CELL_TYPE_FORMULA) { - CellValue cv = eval.evaluate(c); + String formula = c.getCellFormula(); + CellValue cv; + try { + cv = eval.evaluate(c); + } catch (Exception e) { + throw new RuntimeException("Can't evaluate formula: " + formula, e); + } + if(cv.getCellType() == Cell.CELL_TYPE_NUMERIC) { // assert that the calculated value agrees with // the cached formula result calculated by Excel @@ -1661,7 +1669,7 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues { * org.apache.poi.ss.formula.FormulaParseException: Parse error near char 0 '[' in specified formula '[0]!NR_Global_B2'. Expected number, string, or defined name */ @Test - @Ignore + @Ignore("Bug 56737 remains outstanding to fix") public void bug56737() throws IOException { Workbook wb = XSSFTestDataSamples.openSampleWorkbook("56737.xlsx"); -- 2.39.5