]> source.dussan.org Git - poi.git/commitdiff
fix issue
authorPJ Fanning <fanningpj@apache.org>
Mon, 21 Feb 2022 13:37:35 +0000 (13:37 +0000)
committerPJ Fanning <fanningpj@apache.org>
Mon, 21 Feb 2022 13:37:35 +0000 (13:37 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1898276 13f79535-47bb-0310-9956-ffa450edef68

poi/src/main/java/org/apache/poi/ss/formula/OperationEvaluationContext.java

index 1901ec7e4f377d15bd0d3d975c096ecf704335e8..bdadbfad42a2ce4f286f630c8a80675781dd7e1a 100644 (file)
@@ -223,7 +223,7 @@ public final class OperationEvaluationContext {
 
         SpreadsheetVersion ssVersion = _workbook.getSpreadsheetVersion();
 
-        NameType part1refType = isA1Style ? classifyCellReference(refStrPart1, ssVersion) : NameType.CELL;
+        NameType part1refType = isA1Style ? classifyCellReference(refStrPart1, ssVersion) : getR1C1CellType(refStrPart1);
         switch (part1refType) {
             case BAD_CELL_OR_NAMED_RANGE:
                 return ErrorEval.REF_INVALID;
@@ -255,7 +255,7 @@ public final class OperationEvaluationContext {
             }
             throw new IllegalStateException("Unexpected reference classification of '" + refStrPart1 + "'.");
         }
-        NameType part2refType = isA1Style ? classifyCellReference(refStrPart1, ssVersion) : NameType.CELL;
+        NameType part2refType = isA1Style ? classifyCellReference(refStrPart2, ssVersion) : getR1C1CellType(refStrPart2);
         switch (part2refType) {
             case BAD_CELL_OR_NAMED_RANGE:
                 return ErrorEval.REF_INVALID;
@@ -573,4 +573,23 @@ public final class OperationEvaluationContext {
             throw new IllegalArgumentException(relativeReference + " is not a valid R1C1 reference");
         }
     }
+
+    private static NameType getR1C1CellType(String str) {
+        String upRef = str.toUpperCase(LocaleUtil.getUserLocale());
+        int rpos = upRef.indexOf('R');
+        int cpos = upRef.indexOf('C');
+        if (rpos != -1) {
+            if (cpos == -1) {
+                return NameType.ROW;
+            } else {
+                return NameType.CELL;
+            }
+        } else {
+            if (cpos == -1) {
+                return NameType.BAD_CELL_OR_NAMED_RANGE;
+            } else {
+                return NameType.COLUMN;
+            }
+        }
+    }
 }