in poi/src/main/java/org/apache/poi/ss/formula/OperationEvaluationContext.java [213:345]
public ValueEval getDynamicReference(String workbookName, String sheetName, String refStrPart1,
String refStrPart2, boolean isA1Style) {
SheetRefEvaluator se = createExternSheetRefEvaluator(workbookName, sheetName);
if (se == null) {
return ErrorEval.REF_INVALID;
}
SheetRangeEvaluator sre = new SheetRangeEvaluator(_sheetIndex, se);
SpreadsheetVersion ssVersion = _workbook.getSpreadsheetVersion();
NameType part1refType = isA1Style ? classifyCellReference(refStrPart1, ssVersion) : getR1C1CellType(refStrPart1);
switch (part1refType) {
case BAD_CELL_OR_NAMED_RANGE:
return ErrorEval.REF_INVALID;
case NAMED_RANGE:
EvaluationName nm = _workbook.getName(refStrPart1, _sheetIndex);
if (nm == null) {
throw new IllegalStateException("Specified name '" + refStrPart1 +
"' is not found in the workbook (sheetIndex=" + _sheetIndex + ").");
}
if (!nm.isRange()) {
throw new IllegalStateException("Specified name '" + refStrPart1 + "' is not a range as expected.");
}
return _bookEvaluator.evaluateNameFormula(nm.getNameDefinition(), this);
}
if (refStrPart2 == null) {
// no ':'
switch (part1refType) {
case COLUMN:
if (isA1Style) {
return ErrorEval.REF_INVALID;
} else {
try {
String upRef = refStrPart1.toUpperCase(LocaleUtil.getUserLocale());
int cpos = upRef.indexOf('C');
String cval = refStrPart1.substring(cpos + 1).trim();
int absoluteC;
if (cval.startsWith("[") && cval.endsWith("]")) {
int relativeC = Integer.parseInt(cval.substring(1, cval.length() - 1).trim());
absoluteC = getColumnIndex() + relativeC;
} else if (!cval.isEmpty()) {
absoluteC = Integer.parseInt(cval) - 1;
} else {
return ErrorEval.REF_INVALID;
}
return new LazyAreaEval(0, absoluteC, ssVersion.getLastRowIndex(), absoluteC, sre);
} catch (Exception e) {
return ErrorEval.REF_INVALID;
}
}
case ROW:
if (isA1Style) {
return ErrorEval.REF_INVALID;
} else {
try {
String upRef = refStrPart1.toUpperCase(LocaleUtil.getUserLocale());
int rpos = upRef.indexOf('R');
String rval = refStrPart1.substring(rpos + 1).trim();
int absoluteR;
if (rval.startsWith("[") && rval.endsWith("]")) {
int relativeR = Integer.parseInt(rval.substring(1, rval.length() - 1).trim());
absoluteR = getRowIndex() + relativeR;
} else if (!rval.isEmpty()) {
absoluteR = Integer.parseInt(rval) - 1;
} else {
return ErrorEval.REF_INVALID;
}
return new LazyAreaEval(absoluteR, 0, absoluteR, ssVersion.getLastColumnIndex(), sre);
} catch (Exception e) {
return ErrorEval.REF_INVALID;
}
}
case CELL:
CellReference cr;
if (isA1Style) {
cr = new CellReference(refStrPart1);
} else {
cr = applyR1C1Reference(new CellReference(getRowIndex(), getColumnIndex()), refStrPart1);
}
return new LazyRefEval(cr.getRow(), cr.getCol(), sre);
}
throw new IllegalStateException("Unexpected reference classification of '" + refStrPart1 + "'.");
}
NameType part2refType = isA1Style ? classifyCellReference(refStrPart2, ssVersion) : getR1C1CellType(refStrPart2);
switch (part2refType) {
case BAD_CELL_OR_NAMED_RANGE:
return ErrorEval.REF_INVALID;
case NAMED_RANGE:
throw new IllegalStateException("Cannot evaluate '" + refStrPart1
+ "'. Indirect evaluation of defined names not supported yet");
}
if (part2refType != part1refType) {
// LHS and RHS of ':' must be compatible
return ErrorEval.REF_INVALID;
}
int firstRow, firstCol, lastRow, lastCol;
switch (part1refType) {
case COLUMN:
firstRow = 0;
lastRow = ssVersion.getLastRowIndex();
firstCol = parseRowRef(refStrPart1);
lastCol = parseRowRef(refStrPart2);
break;
case ROW:
// support of cell range in the form of integer:integer
firstCol = 0;
lastCol = ssVersion.getLastColumnIndex();
firstRow = parseColRef(refStrPart1);
lastRow = parseColRef(refStrPart2);
break;
case CELL:
CellReference cr;
if (isA1Style) {
cr = new CellReference(refStrPart1);
} else {
cr = applyR1C1Reference(new CellReference(getRowIndex(), getColumnIndex()), refStrPart1);
}
firstRow = cr.getRow();
firstCol = cr.getCol();
if (isA1Style) {
cr = new CellReference(refStrPart2);
} else {
cr = applyR1C1Reference(new CellReference(getRowIndex(), getColumnIndex()), refStrPart2);
}
lastRow = cr.getRow();
lastCol = cr.getCol();
break;
default:
throw new IllegalStateException("Unexpected reference classification of '" + refStrPart1 + "'.");
}
return new LazyAreaEval(firstRow, firstCol, lastRow, lastCol, sre);
}