Search in sources :

Example 1 with NameType

use of org.apache.poi.ss.util.CellReference.NameType in project poi by apache.

the class OperationEvaluationContext method getDynamicReference.

/**
     * Resolves a cell or area reference dynamically.
     * @param workbookName the name of the workbook containing the reference.  If <code>null</code>
     * the current workbook is assumed.  Note - to evaluate formulas which use multiple workbooks,
     * a {@link CollaboratingWorkbooksEnvironment} must be set up.
     * @param sheetName the name of the sheet containing the reference.  May be <code>null</code>
     * (when <tt>workbookName</tt> is also null) in which case the current workbook and sheet is
     * assumed.
     * @param refStrPart1 the single cell reference or first part of the area reference.  Must not
     * be <code>null</code>.
     * @param refStrPart2 the second part of the area reference. For single cell references this
     * parameter must be <code>null</code>
     * @param isA1Style specifies the format for <tt>refStrPart1</tt> and <tt>refStrPart2</tt>.
     * Pass <code>true</code> for 'A1' style and <code>false</code> for 'R1C1' style.
     * TODO - currently POI only supports 'A1' reference style
     * @return a {@link RefEval} or {@link AreaEval}
     */
public ValueEval getDynamicReference(String workbookName, String sheetName, String refStrPart1, String refStrPart2, boolean isA1Style) {
    if (!isA1Style) {
        throw new RuntimeException("R1C1 style not supported yet");
    }
    SheetRefEvaluator se = createExternSheetRefEvaluator(workbookName, sheetName);
    if (se == null) {
        return ErrorEval.REF_INVALID;
    }
    SheetRangeEvaluator sre = new SheetRangeEvaluator(_sheetIndex, se);
    // ugly typecast - TODO - make spreadsheet version more easily accessible
    SpreadsheetVersion ssVersion = ((FormulaParsingWorkbook) _workbook).getSpreadsheetVersion();
    NameType part1refType = classifyCellReference(refStrPart1, ssVersion);
    switch(part1refType) {
        case BAD_CELL_OR_NAMED_RANGE:
            return ErrorEval.REF_INVALID;
        case NAMED_RANGE:
            EvaluationName nm = ((FormulaParsingWorkbook) _workbook).getName(refStrPart1, _sheetIndex);
            if (!nm.isRange()) {
                throw new RuntimeException("Specified name '" + refStrPart1 + "' is not a range as expected.");
            }
            return _bookEvaluator.evaluateNameFormula(nm.getNameDefinition(), this);
    }
    if (refStrPart2 == null) {
        // no ':'
        switch(part1refType) {
            case COLUMN:
            case ROW:
                return ErrorEval.REF_INVALID;
            case CELL:
                CellReference cr = new CellReference(refStrPart1);
                return new LazyRefEval(cr.getRow(), cr.getCol(), sre);
        }
        throw new IllegalStateException("Unexpected reference classification of '" + refStrPart1 + "'.");
    }
    NameType part2refType = classifyCellReference(refStrPart1, ssVersion);
    switch(part2refType) {
        case BAD_CELL_OR_NAMED_RANGE:
            return ErrorEval.REF_INVALID;
        case NAMED_RANGE:
            throw new RuntimeException("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;
            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:
            // 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;
            cr = new CellReference(refStrPart1);
            firstRow = cr.getRow();
            firstCol = cr.getCol();
            cr = new CellReference(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);
}
Also used : NameType(org.apache.poi.ss.util.CellReference.NameType) SpreadsheetVersion(org.apache.poi.ss.SpreadsheetVersion) CellReference(org.apache.poi.ss.util.CellReference)

Example 2 with NameType

use of org.apache.poi.ss.util.CellReference.NameType in project poi by apache.

the class TestCellReference method confirmNameType.

private void confirmNameType(String ref, NameType expectedResult) {
    NameType actualResult = CellReference.classifyCellReference(ref, SpreadsheetVersion.EXCEL97);
    assertEquals(expectedResult, actualResult);
}
Also used : NameType(org.apache.poi.ss.util.CellReference.NameType)

Aggregations

NameType (org.apache.poi.ss.util.CellReference.NameType)2 SpreadsheetVersion (org.apache.poi.ss.SpreadsheetVersion)1 CellReference (org.apache.poi.ss.util.CellReference)1