From d68912db25e9b9d74dea87418615c2c7b695cc3c Mon Sep 17 00:00:00 2001 From: Greg Woolsey Date: Tue, 29 Aug 2017 17:14:52 +0000 Subject: [PATCH] Fixes bug #61468, caused by a confusing OOXML spec design as noted in JavaDocs added in r1795648. git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1806623 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/ss/formula/FormulaParser.java | 8 ++++---- .../usermodel/TestXSSFFormulaEvaluation.java | 11 +++++++++++ .../poi/xssf/usermodel/TestXSSFTable.java | 2 +- .../spreadsheet/simple-monthly-budget.xlsx | Bin 0 -> 18700 bytes 4 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 test-data/spreadsheet/simple-monthly-budget.xlsx diff --git a/src/java/org/apache/poi/ss/formula/FormulaParser.java b/src/java/org/apache/poi/ss/formula/FormulaParser.java index 8d0653b024..fd17aca184 100644 --- a/src/java/org/apache/poi/ss/formula/FormulaParser.java +++ b/src/java/org/apache/poi/ss/formula/FormulaParser.java @@ -736,7 +736,7 @@ public final class FormulaParser { // Done reading from input stream // Ok to return now - if (isTotalsSpec && !tbl.isHasTotalsRow()) { + if (isTotalsSpec && tbl.getTotalsRowCount() == 0) { return new ParseNode(ErrPtg.REF_INVALID); } if ((isThisRow || isThisRowSpec) && (_rowIndex < startRow || endRow < _rowIndex)) { @@ -759,14 +759,14 @@ public final class FormulaParser { if (nSpecQuantifiers == 1 && isAllSpec) { //do nothing } else if (isDataSpec && isHeadersSpec) { - if (tbl.isHasTotalsRow()) { + if (tbl.getTotalsRowCount() > 0) { actualEndRow = endRow - 1; } } else if (isDataSpec && isTotalsSpec) { actualStartRow = startRow + 1; } else if (nSpecQuantifiers == 1 && isDataSpec) { actualStartRow = startRow + 1; - if (tbl.isHasTotalsRow()) { + if (tbl.getTotalsRowCount() > 0) { actualEndRow = endRow - 1; } } else if (nSpecQuantifiers == 1 && isHeadersSpec) { @@ -785,7 +785,7 @@ public final class FormulaParser { actualEndRow = _rowIndex; } else { // Really no special quantifiers actualStartRow++; - if (tbl.isHasTotalsRow()) actualEndRow--; + if (tbl.getTotalsRowCount() > 0) actualEndRow--; } } 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 3b1fdd3cad..5afad20672 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java @@ -694,4 +694,15 @@ public final class TestXSSFFormulaEvaluation extends BaseTestFormulaEvaluator { assertSame(cell, same); wb.close(); } + + @Test + public void testBug61468() { + Workbook wb = XSSFTestDataSamples.openSampleWorkbook("simple-monthly-budget.xlsx"); + FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator(); + Cell cell = wb.getSheetAt(0).getRow(8).getCell(4); + assertEquals(3750, cell.getNumericCellValue(), 0.001); + + CellValue value = evaluator.evaluate(cell); + assertEquals(3750, value.getNumberValue(), 0.001); + } } diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFTable.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFTable.java index 6b916b1e6f..06ef68a549 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFTable.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFTable.java @@ -163,7 +163,7 @@ public final class TestXSSFTable { public void isHasTotalsRow() throws IOException { XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("StructuredReferences.xlsx"); XSSFTable table = wb.getTable("\\_Prime.1"); - assertFalse(table.isHasTotalsRow()); + assertFalse(table.getTotalsRowCount() > 0); wb.close(); } diff --git a/test-data/spreadsheet/simple-monthly-budget.xlsx b/test-data/spreadsheet/simple-monthly-budget.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b8613cd0f9d00c4f1486fa98e4be157a0be074ee GIT binary patch literal 18700 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 IMSiya58R?Aq5uE@ literal 0 HcmV?d00001 -- 2.39.5