public ValueEval getDynamicReference()

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);
    }