]> source.dussan.org Git - poi.git/commitdiff
Bug 54720: Support for Row/Col Area Range like 8:8 or H:H
authorCédric Walter <cedricwalter@apache.org>
Fri, 16 Aug 2013 17:35:16 +0000 (17:35 +0000)
committerCédric Walter <cedricwalter@apache.org>
Fri, 16 Aug 2013 17:35:16 +0000 (17:35 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1514812 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/ss/formula/OperationEvaluationContext.java
src/testcases/org/apache/poi/ss/formula/functions/TestIndirectFunctionFromSpreadsheet.java [new file with mode: 0644]
src/testcases/org/apache/poi/ss/formula/functions/TestMatchFunctionsFromSpreadsheet.java
test-data/spreadsheet/IndirectFunctionTestCaseData.xls [new file with mode: 0644]

index 87018e6abe7fe2914f64fd74ec8a1466a308aeba..d1407c064bb533a2d17151d879c7843856d0870b 100644 (file)
@@ -37,6 +37,7 @@ import org.apache.poi.ss.util.CellReference.NameType;
  * For POI internal use only
  *
  * @author Josh Micich
+ * @author Cédric Walter
  */
 public final class OperationEvaluationContext {
        public static final FreeRefFunction UDF = UserDefinedFunction.instance;
@@ -83,13 +84,13 @@ public final class OperationEvaluationContext {
                } else {
                        // look up sheet by name from external workbook
                        String workbookName = externalSheet.getWorkbookName();
-                       try {\r
-                               targetEvaluator = _bookEvaluator.getOtherWorkbookEvaluator(workbookName);\r
-                       } catch (WorkbookNotFoundException e) {\r
-                               throw new RuntimeException(e.getMessage(), e);\r
-                       }\r
-                       otherSheetIndex = targetEvaluator.getSheetIndex(externalSheet.getSheetName());\r
-                       if (otherSheetIndex < 0) {\r
+                       try {
+                               targetEvaluator = _bookEvaluator.getOtherWorkbookEvaluator(workbookName);
+                       } catch (WorkbookNotFoundException e) {
+                               throw new RuntimeException(e.getMessage(), e);
+                       }
+                       otherSheetIndex = targetEvaluator.getSheetIndex(externalSheet.getSheetName());
+                       if (otherSheetIndex < 0) {
                                throw new RuntimeException("Invalid sheet name '" + externalSheet.getSheetName()
                                                + "' in bool '" + workbookName + "'.");
                        }
@@ -195,16 +196,32 @@ public final class OperationEvaluationContext {
                int firstRow, firstCol, lastRow, lastCol;
                switch (part1refType) {
                        case COLUMN:
-                               firstRow =0;
-                               lastRow = ssVersion.getLastRowIndex();
-                               firstCol = parseColRef(refStrPart1);
-                               lastCol = parseColRef(refStrPart2);
-                               break;
+                firstRow =0;
+                if (part2refType.equals(NameType.COLUMN))
+                {
+                    lastRow = ssVersion.getLastRowIndex();
+                    firstCol = parseRowRef(refStrPart1);
+                    lastCol = parseRowRef(refStrPart2);
+                }
+                else {
+                    lastRow = ssVersion.getLastRowIndex();
+                    firstCol = parseColRef(refStrPart1);
+                    lastCol = parseColRef(refStrPart2);
+                }
+                break;
                        case ROW:
-                               firstCol = 0;
-                               lastCol = ssVersion.getLastColumnIndex();
-                               firstRow = parseRowRef(refStrPart1);
-                               lastRow = parseRowRef(refStrPart2);
+                // support of cell range in the form of integer:integer
+                firstCol = 0;
+                if (part2refType.equals(NameType.ROW))
+                {
+                    firstRow = parseColRef(refStrPart1);
+                    lastRow = parseColRef(refStrPart2);
+                    lastCol = ssVersion.getLastColumnIndex();
+                } else {
+                    lastCol = ssVersion.getLastColumnIndex();
+                    firstRow = parseRowRef(refStrPart1);
+                    lastRow = parseRowRef(refStrPart2);
+                }
                                break;
                        case CELL:
                                CellReference cr;
diff --git a/src/testcases/org/apache/poi/ss/formula/functions/TestIndirectFunctionFromSpreadsheet.java b/src/testcases/org/apache/poi/ss/formula/functions/TestIndirectFunctionFromSpreadsheet.java
new file mode 100644 (file)
index 0000000..b777dca
--- /dev/null
@@ -0,0 +1,35 @@
+/* ====================================================================\r
+   Licensed to the Apache Software Foundation (ASF) under one or more\r
+   contributor license agreements.  See the NOTICE file distributed with\r
+   this work for additional information regarding copyright ownership.\r
+   The ASF licenses this file to You under the Apache License, Version 2.0\r
+   (the "License"); you may not use this file except in compliance with\r
+   the License.  You may obtain a copy of the License at\r
+\r
+       http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+   Unless required by applicable law or agreed to in writing, software\r
+   distributed under the License is distributed on an "AS IS" BASIS,\r
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+   See the License for the specific language governing permissions and\r
+   limitations under the License.\r
+==================================================================== */\r
+\r
+package org.apache.poi.ss.formula.functions;\r
+\r
+/**\r
+ * Tests INDIRECT() as loaded from a test data spreadsheet.<p/>\r
+ *\r
+ * Tests for bug fixes and specific/tricky behaviour can be found in the corresponding test class\r
+ * (<tt>TestXxxx</tt>) of the target (<tt>Xxxx</tt>) implementor, where execution can be observed\r
+ *  more easily.\r
+ *\r
+ * @author Cédric Walter\r
+ */\r
+public final class TestIndirectFunctionFromSpreadsheet extends BaseTestFunctionsFromSpreadsheet {\r
+\r
+    @Override\r
+    protected String getFilename() {\r
+        return "IndirectFunctionTestCaseData.xls";\r
+    }\r
+}\r
index 7fcb1fa13b2591ccf22ff7a9fa48ffe834408bae..29aeec8d1e8c07857d004eba1510ca632dcee484 100644 (file)
@@ -20,16 +20,13 @@ package org.apache.poi.ss.formula.functions;
 \r
 \r
 /**\r
- * Tests lookup functions (VLOOKUP, HLOOKUP, LOOKUP, MATCH) as loaded from a test data spreadsheet.<p/>\r
- * These tests have been separated from the common function and operator tests because the lookup\r
- * functions have more complex test cases and test data setup.\r
+ * Tests Match functions as loaded from a test data spreadsheet.<p/>\r
  *\r
  * Tests for bug fixes and specific/tricky behaviour can be found in the corresponding test class\r
  * (<tt>TestXxxx</tt>) of the target (<tt>Xxxx</tt>) implementor, where execution can be observed\r
  *  more easily.\r
  *\r
- * @author Josh Micich\r
- * @author Cedric Walter at innoveo.com\r
+ * @author Cédric Walter\r
  */\r
 public final class TestMatchFunctionsFromSpreadsheet extends BaseTestFunctionsFromSpreadsheet {\r
 \r
diff --git a/test-data/spreadsheet/IndirectFunctionTestCaseData.xls b/test-data/spreadsheet/IndirectFunctionTestCaseData.xls
new file mode 100644 (file)
index 0000000..c7f7173
Binary files /dev/null and b/test-data/spreadsheet/IndirectFunctionTestCaseData.xls differ