Search in sources :

Example 6 with TwoDEval

use of org.apache.poi.ss.formula.TwoDEval in project poi by apache.

the class Sumproduct method evaluate.

public ValueEval evaluate(ValueEval[] args, int srcCellRow, int srcCellCol) {
    int maxN = args.length;
    if (maxN < 1) {
        return ErrorEval.VALUE_INVALID;
    }
    ValueEval firstArg = args[0];
    try {
        if (firstArg instanceof NumericValueEval) {
            return evaluateSingleProduct(args);
        }
        if (firstArg instanceof RefEval) {
            return evaluateSingleProduct(args);
        }
        if (firstArg instanceof TwoDEval) {
            TwoDEval ae = (TwoDEval) firstArg;
            if (ae.isRow() && ae.isColumn()) {
                return evaluateSingleProduct(args);
            }
            return evaluateAreaSumProduct(args);
        }
    } catch (EvaluationException e) {
        return e.getErrorEval();
    }
    throw new RuntimeException("Invalid arg type for SUMPRODUCT: (" + firstArg.getClass().getName() + ")");
}
Also used : NumericValueEval(org.apache.poi.ss.formula.eval.NumericValueEval) TwoDEval(org.apache.poi.ss.formula.TwoDEval) RefEval(org.apache.poi.ss.formula.eval.RefEval) NumericValueEval(org.apache.poi.ss.formula.eval.NumericValueEval) ValueEval(org.apache.poi.ss.formula.eval.ValueEval) EvaluationException(org.apache.poi.ss.formula.eval.EvaluationException)

Example 7 with TwoDEval

use of org.apache.poi.ss.formula.TwoDEval in project poi by apache.

the class Sumproduct method evaluateAreaSumProduct.

private static ValueEval evaluateAreaSumProduct(ValueEval[] evalArgs) throws EvaluationException {
    int maxN = evalArgs.length;
    TwoDEval[] args = new TwoDEval[maxN];
    try {
        System.arraycopy(evalArgs, 0, args, 0, maxN);
    } catch (ArrayStoreException e) {
        // one of the other args was not an AreaRef
        return ErrorEval.VALUE_INVALID;
    }
    TwoDEval firstArg = args[0];
    int height = firstArg.getHeight();
    // TODO - junit
    int width = firstArg.getWidth();
    // first check dimensions
    if (!areasAllSameSize(args, height, width)) {
        // but errors in individual cells take precedence
        for (int i = 1; i < args.length; i++) {
            throwFirstError(args[i]);
        }
        return ErrorEval.VALUE_INVALID;
    }
    double acc = 0;
    for (int rrIx = 0; rrIx < height; rrIx++) {
        for (int rcIx = 0; rcIx < width; rcIx++) {
            double term = 1D;
            for (int n = 0; n < maxN; n++) {
                double val = getProductTerm(args[n].getValue(rrIx, rcIx), false);
                term *= val;
            }
            acc += term;
        }
    }
    return new NumberEval(acc);
}
Also used : TwoDEval(org.apache.poi.ss.formula.TwoDEval) NumberEval(org.apache.poi.ss.formula.eval.NumberEval)

Example 8 with TwoDEval

use of org.apache.poi.ss.formula.TwoDEval in project poi by apache.

the class Index method evaluate.

public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1) {
    TwoDEval reference = convertFirstArg(arg0);
    int columnIx = 0;
    try {
        int rowIx = resolveIndexArg(arg1, srcRowIndex, srcColumnIndex);
        if (!reference.isColumn()) {
            if (!reference.isRow()) {
                // Note - the type of error changes if the pRowArg is negative
                return ErrorEval.REF_INVALID;
            }
            // When the two-arg version of INDEX() has been invoked and the reference
            // is a single column ref, the row arg seems to get used as the column index
            columnIx = rowIx;
            rowIx = 0;
        }
        return getValueFromArea(reference, rowIx, columnIx);
    } catch (EvaluationException e) {
        return e.getErrorEval();
    }
}
Also used : TwoDEval(org.apache.poi.ss.formula.TwoDEval) EvaluationException(org.apache.poi.ss.formula.eval.EvaluationException)

Example 9 with TwoDEval

use of org.apache.poi.ss.formula.TwoDEval in project poi by apache.

the class Lookup method evaluate.

public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1, ValueEval arg2) {
    try {
        ValueEval lookupValue = OperandResolver.getSingleValue(arg0, srcRowIndex, srcColumnIndex);
        TwoDEval aeLookupVector = LookupUtils.resolveTableArrayArg(arg1);
        TwoDEval aeResultVector = LookupUtils.resolveTableArrayArg(arg2);
        ValueVector lookupVector = createVector(aeLookupVector);
        ValueVector resultVector = createVector(aeResultVector);
        if (lookupVector.getSize() > resultVector.getSize()) {
            // Excel seems to handle this by accessing past the end of the result vector.
            throw new RuntimeException("Lookup vector and result vector of differing sizes not supported yet");
        }
        int index = LookupUtils.lookupIndexOfValue(lookupValue, lookupVector, true);
        return resultVector.getItem(index);
    } catch (EvaluationException e) {
        return e.getErrorEval();
    }
}
Also used : ValueVector(org.apache.poi.ss.formula.functions.LookupUtils.ValueVector) TwoDEval(org.apache.poi.ss.formula.TwoDEval) ValueEval(org.apache.poi.ss.formula.eval.ValueEval) EvaluationException(org.apache.poi.ss.formula.eval.EvaluationException)

Example 10 with TwoDEval

use of org.apache.poi.ss.formula.TwoDEval in project poi by apache.

the class Vlookup method evaluate.

public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval lookup_value, ValueEval table_array, ValueEval col_index, ValueEval range_lookup) {
    try {
        // Evaluation order:
        // lookup_value , table_array, range_lookup, find lookup value, col_index, fetch result
        ValueEval lookupValue = OperandResolver.getSingleValue(lookup_value, srcRowIndex, srcColumnIndex);
        TwoDEval tableArray = LookupUtils.resolveTableArrayArg(table_array);
        boolean isRangeLookup = LookupUtils.resolveRangeLookupArg(range_lookup, srcRowIndex, srcColumnIndex);
        int rowIndex = LookupUtils.lookupIndexOfValue(lookupValue, LookupUtils.createColumnVector(tableArray, 0), isRangeLookup);
        int colIndex = LookupUtils.resolveRowOrColIndexArg(col_index, srcRowIndex, srcColumnIndex);
        ValueVector resultCol = createResultColumnVector(tableArray, colIndex);
        return resultCol.getItem(rowIndex);
    } catch (EvaluationException e) {
        return e.getErrorEval();
    }
}
Also used : ValueVector(org.apache.poi.ss.formula.functions.LookupUtils.ValueVector) TwoDEval(org.apache.poi.ss.formula.TwoDEval) ValueEval(org.apache.poi.ss.formula.eval.ValueEval) EvaluationException(org.apache.poi.ss.formula.eval.EvaluationException)

Aggregations

TwoDEval (org.apache.poi.ss.formula.TwoDEval)10 EvaluationException (org.apache.poi.ss.formula.eval.EvaluationException)7 ValueEval (org.apache.poi.ss.formula.eval.ValueEval)7 RefEval (org.apache.poi.ss.formula.eval.RefEval)5 ValueVector (org.apache.poi.ss.formula.functions.LookupUtils.ValueVector)4 NumericValueEval (org.apache.poi.ss.formula.eval.NumericValueEval)3 ThreeDEval (org.apache.poi.ss.formula.ThreeDEval)1 NumberEval (org.apache.poi.ss.formula.eval.NumberEval)1 StringEval (org.apache.poi.ss.formula.eval.StringEval)1 StringValueEval (org.apache.poi.ss.formula.eval.StringValueEval)1