Author: fanningpj
Date: Tue Sep 12 10:36:14 2023
New Revision: 1912263

URL: http://svn.apache.org/viewvc?rev=1912263&view=rev
Log:
[bug-63934] Fix parsing of structure references. Thanks to Matthias Raschhofer. 
This closes #514

Added:
    poi/trunk/test-data/spreadsheet/63934.xlsx   (with props)
Modified:
    
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java
    
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFFormulaParser.java
    poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/FormulaParser.java

Modified: 
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java?rev=1912263&r1=1912262&r2=1912263&view=diff
==============================================================================
--- 
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java
 (original)
+++ 
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java
 Tue Sep 12 10:36:14 2023
@@ -24,6 +24,10 @@ import static org.junit.jupiter.api.Asse
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.MathContext;
+import java.math.RoundingMode;
+import java.text.DecimalFormat;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.function.Function;
@@ -32,6 +36,7 @@ import org.apache.poi.hssf.HSSFTestDataS
 import org.apache.poi.ss.usermodel.BaseTestFormulaEvaluator;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.CellValue;
+import org.apache.poi.ss.usermodel.DataFormatter;
 import org.apache.poi.ss.usermodel.FormulaEvaluator;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
@@ -444,4 +449,17 @@ public final class TestXSSFFormulaEvalua
             assertEquals("another value", value.getStringCellValue(), "wrong 
value A5");
         }
     }
+
+    @Test
+    void testBug63934() throws IOException {
+        try (Workbook wb = 
XSSFTestDataSamples.openSampleWorkbook("63934.xlsx")) {
+
+            final Cell cell = wb.getSheetAt(0).getRow(1).getCell(1);
+            assertNotNull(cell);
+
+            final FormulaEvaluator evaluator = 
wb.getCreationHelper().createFormulaEvaluator();
+            final CellValue value = evaluator.evaluate(cell);
+            assertEquals("Male", value.getStringValue());
+        }
+    }
 }

Modified: 
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFFormulaParser.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFFormulaParser.java?rev=1912263&r1=1912262&r2=1912263&view=diff
==============================================================================
--- 
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFFormulaParser.java
 (original)
+++ 
poi/trunk/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFFormulaParser.java
 Tue Sep 12 10:36:14 2023
@@ -655,6 +655,7 @@ public final class TestXSSFFormulaParser
           16 Table1[[#Headers],[#Data],[col2]]
           17 Table1[[#This Row], [col1]]
           18 Table1[ [col1]:[col2] ]
+          19 Table1[]
         */
 
         final String tbl = "\\_Prime.1";
@@ -697,7 +698,7 @@ public final class TestXSSFFormulaParser
         assertEquals(1, ptgs.length);
         assertEquals("Table!A1:C7", ptgs[0].toFormulaString(), "Table1[#All]");
 
-        ////// Case 5: Evaluate "Table1[#Data]" (excludes Header and Data 
rows) ////////
+        ////// Case 5: Evaluate "Table1[#Data]" (excludes Header and Total 
rows) ////////
         ptgs = parse(fpb, tbl+"[#Data]");
         assertEquals(1, ptgs.length);
         assertEquals("Table!A2:C7", ptgs[0].toFormulaString(), 
"Table1[#Data]");
@@ -790,6 +791,13 @@ public final class TestXSSFFormulaParser
         assertEquals(1, ptgs.length);
         assertEquals("Table!B2:C7", ptgs[0].toFormulaString(), 
"Table1[[col]:[col2]]");
 
+        ////// Case 19: Evaluate "Table1[]" ////////
+        // Excludes Header and Total rows, equivalent to Table1[#Data] (see 
case 5).
+        // This is the only case where [] is allowed.
+        ptgs = parse(fpb, tbl+"[]");
+        assertEquals(1, ptgs.length);
+        assertEquals("Table!A2:C7", ptgs[0].toFormulaString(), "Table1[]");
+
         wb.close();
     }
 }

Modified: 
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/FormulaParser.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/FormulaParser.java?rev=1912263&r1=1912262&r2=1912263&view=diff
==============================================================================
--- poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/FormulaParser.java 
(original)
+++ poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/FormulaParser.java 
Tue Sep 12 10:36:14 2023
@@ -595,6 +595,7 @@ public final class FormulaParser {
      * Parses a structured reference, returns it as area reference.
      * Examples:
      * <pre>
+     * Table1[]
      * Table1[col]
      * Table1[[#Totals],[col]]
      * Table1[#Totals]
@@ -637,6 +638,29 @@ public final class FormulaParser {
         int savePtr0 = _pointer;
         nextChar();
 
+        // Special case: Table1[] is equivalent to Table1[#Data]
+        if (look == ']') {
+
+            // Consume the ']' character
+            nextChar();
+
+            // Skip header and total rows if available
+            int actualStartRow = startRow;
+            if (tbl.getHeaderRowCount() > 0) {
+                actualStartRow = startRow + 1;
+            }
+            int actualEndRow = endRow;
+            if (tbl.getTotalsRowCount() > 0) {
+                actualEndRow = endRow - 1;
+            }
+
+            final CellReference topLeft = new CellReference(actualStartRow, 
startCol);
+            final CellReference bottomRight = new CellReference(actualEndRow, 
endCol);
+            final SheetIdentifier sheetIden = new SheetIdentifier( null, new 
NameIdentifier(sheetName, true));
+            final Ptg ptg = _book.get3DReferencePtg(new AreaReference(topLeft, 
bottomRight, _ssVersion), sheetIden);
+            return new ParseNode(ptg);
+        }
+
         boolean isTotalsSpec = false;
         boolean isThisRowSpec = false;
         boolean isDataSpec = false;

Added: poi/trunk/test-data/spreadsheet/63934.xlsx
URL: 
http://svn.apache.org/viewvc/poi/trunk/test-data/spreadsheet/63934.xlsx?rev=1912263&view=auto
==============================================================================
Binary file - no diff available.

Propchange: poi/trunk/test-data/spreadsheet/63934.xlsx
------------------------------------------------------------------------------
--- svn:mime-type (added)
+++ svn:mime-type Tue Sep 12 10:36:14 2023
@@ -0,0 +1 @@
+application/vnd.openxmlformats-officedocument.spreadsheetml.sheet



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to