From 5df572a3b6406d59e8556b3486d3cda562c9d465 Mon Sep 17 00:00:00 2001
From: Yegor Kozlov
Date: Wed, 25 Aug 2010 13:29:55 +0000
Subject: [PATCH] fixed evaluation of XSSF workbooks containing formulas with
reference errors (#REF!), see Bugzilla 49783
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@989100 13f79535-47bb-0310-9956-ffa450edef68
---
src/documentation/content/xdocs/status.xml | 1 +
.../apache/poi/ss/formula/FormulaParser.java | 8 +++-
.../apache/poi/ss/usermodel/FormulaError.java | 2 +-
.../poi/xssf/usermodel/TestXSSFBugs.java | 35 +++++++++++++-----
test-data/spreadsheet/49783.xlsx | Bin 0 -> 8947 bytes
5 files changed, 34 insertions(+), 12 deletions(-)
create mode 100644 test-data/spreadsheet/49783.xlsx
diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml
index 67f61e161..7668ebc6f 100644
--- a/src/documentation/content/xdocs/status.xml
+++ b/src/documentation/content/xdocs/status.xml
@@ -34,6 +34,7 @@
+ 49783 - fixed evaluation of XSSF workbooks containing formulas with reference errors (#REF!)
49751 - fixed fetching names of user defined styles in HSSFCellStyle.getUserStyleName()
48900 - support for protecting a XSSF workbook
49725 - fixed FormulaParser to correctly process defined names with underscore
diff --git a/src/java/org/apache/poi/ss/formula/FormulaParser.java b/src/java/org/apache/poi/ss/formula/FormulaParser.java
index 0f186e744..db46b53e8 100644
--- a/src/java/org/apache/poi/ss/formula/FormulaParser.java
+++ b/src/java/org/apache/poi/ss/formula/FormulaParser.java
@@ -417,8 +417,12 @@ public final class FormulaParser {
SimpleRangePart part1 = parseSimpleRangePart();
if (part1 == null) {
if (sheetIden != null) {
- throw new FormulaParseException("Cell reference expected after sheet name at index "
- + _pointer + ".");
+ if(look == '#'){ // error ref like MySheet!#REF!
+ return new ParseNode(ErrPtg.valueOf(parseErrorLiteral()));
+ } else {
+ throw new FormulaParseException("Cell reference expected after sheet name at index "
+ + _pointer + ".");
+ }
}
return parseNonRange(savePointer);
}
diff --git a/src/java/org/apache/poi/ss/usermodel/FormulaError.java b/src/java/org/apache/poi/ss/usermodel/FormulaError.java
index c3c43301e..162f24aa4 100644
--- a/src/java/org/apache/poi/ss/usermodel/FormulaError.java
+++ b/src/java/org/apache/poi/ss/usermodel/FormulaError.java
@@ -57,7 +57,7 @@ public enum FormulaError {
* OFFSET(A1,0,20000) will result in a #REF! error.
*
*/
- REF(0x1D, "#REF!"),
+ REF(0x17, "#REF!"),
/**
* Intended to indicate when what looks like a name is used, but no such name has been defined.
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 5a6e250d9..e9daa37bf 100644
--- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
+++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java
@@ -24,15 +24,7 @@ import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.openxml4j.opc.PackagingURIHelper;
-import org.apache.poi.ss.usermodel.BaseTestBugzillaIssues;
-import org.apache.poi.ss.usermodel.Cell;
-import org.apache.poi.ss.usermodel.DataFormatter;
-import org.apache.poi.ss.usermodel.Font;
-import org.apache.poi.ss.usermodel.FormulaEvaluator;
-import org.apache.poi.ss.usermodel.Name;
-import org.apache.poi.ss.usermodel.Row;
-import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.XSSFITestDataProvider;
import org.apache.poi.xssf.XSSFTestDataSamples;
import org.apache.poi.xssf.usermodel.extensions.XSSFCellFill;
@@ -412,4 +404,29 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
assertEquals("Cycle", wb.getSheetAt(0).getRow(0).getCell(1).getStringCellValue());
}
+
+ public void test49783() throws Exception {
+ Workbook wb = XSSFTestDataSamples.openSampleWorkbook("49783.xlsx");
+ Sheet sheet = wb.getSheetAt(0);
+ FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
+ Cell cell;
+
+ cell = sheet.getRow(0).getCell(0);
+ assertEquals("#REF!*#REF!", cell.getCellFormula());
+ assertEquals(Cell.CELL_TYPE_ERROR, evaluator.evaluateInCell(cell).getCellType());
+ assertEquals("#REF!", FormulaError.forInt(cell.getErrorCellValue()).getString());
+
+ Name nm1 = wb.getName("sale_1");
+ assertNotNull("name sale_1 should be present", nm1);
+ assertEquals("Sheet1!#REF!", nm1.getRefersToFormula());
+ Name nm2 = wb.getName("sale_2");
+ assertNotNull("name sale_2 should be present", nm2);
+ assertEquals("Sheet1!#REF!", nm2.getRefersToFormula());
+
+ cell = sheet.getRow(1).getCell(0);
+ assertEquals("sale_1*sale_2", cell.getCellFormula());
+ assertEquals(Cell.CELL_TYPE_ERROR, evaluator.evaluateInCell(cell).getCellType());
+ assertEquals("#REF!", FormulaError.forInt(cell.getErrorCellValue()).getString());
+ }
+
}
diff --git a/test-data/spreadsheet/49783.xlsx b/test-data/spreadsheet/49783.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..09cda15b462d1c7688cd318745edb354acdf8eb0
GIT binary patch
literal 8947
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