Beispiel #1
0
        public ValueEval Evaluate(ValueEval[] args, OperationEvaluationContext ec)
        {
            int nIncomingArgs = args.Length;

            if (nIncomingArgs < 1)
            {
                throw new Exception("function name argument missing");
            }

            ValueEval nameArg      = args[0];
            String    functionName = string.Empty;

            if (nameArg is FunctionNameEval)
            {
                functionName = ((FunctionNameEval)nameArg).FunctionName;
            }
            else
            {
                throw new Exception("First argument should be a NameEval, but got ("
                                    + nameArg.GetType().Name + ")");
            }
            FreeRefFunction targetFunc = ec.FindUserDefinedFunction(functionName);

            if (targetFunc == null)
            {
                throw new NotImplementedFunctionException(functionName);
            }
            int nOutGoingArgs = nIncomingArgs - 1;

            ValueEval[] outGoingArgs = new ValueEval[nOutGoingArgs];
            Array.Copy(args, 1, outGoingArgs, 0, nOutGoingArgs);
            return(targetFunc.Evaluate(outGoingArgs, ec));
        }
        /**
         * returns the OperationEval concrete impl instance corresponding
         * to the supplied operationPtg
         */
        public static ValueEval Evaluate(OperationPtg ptg, ValueEval[] args,
                                         OperationEvaluationContext ec)
        {
            if (ptg == null)
            {
                throw new ArgumentException("ptg must not be null");
            }
            NPOI.SS.Formula.Functions.Function result = _instancesByPtgClass[ptg] as NPOI.SS.Formula.Functions.Function;

            FreeRefFunction udfFunc = null;

            if (result == null)
            {
                if (ptg is AbstractFunctionPtg)
                {
                    AbstractFunctionPtg fptg = (AbstractFunctionPtg)ptg;
                    int functionIndex        = fptg.FunctionIndex;
                    switch (functionIndex)
                    {
                    case NPOI.SS.Formula.Function.FunctionMetadataRegistry.FUNCTION_INDEX_INDIRECT:
                        udfFunc = Indirect.instance;
                        break;

                    case NPOI.SS.Formula.Function.FunctionMetadataRegistry.FUNCTION_INDEX_EXTERNAL:
                        udfFunc = UserDefinedFunction.instance;
                        break;

                    default:
                        result = FunctionEval.GetBasicFunction(functionIndex);
                        break;
                    }
                }
            }

            if (result != null)
            {
                if (result is ArrayFunction)
                {
                    ArrayFunction func = (ArrayFunction)result;
                    ValueEval     eval = EvaluateArrayFunction(func, args, ec);
                    if (eval != null)
                    {
                        return(eval);
                    }
                }
                return(result.Evaluate(args, ec.RowIndex, (short)ec.ColumnIndex));
            }
            else if (udfFunc != null)
            {
                return(udfFunc.Evaluate(args, ec));
            }
            throw new Exception("Unexpected operation ptg class (" + ptg.GetType().Name + ")");
        }
Beispiel #3
0
        private void CheckValue(double startDate, int monthInc, double expectedResult)
        {
            NumberEval result = (NumberEval)eOMonth.Evaluate(new ValueEval[] { new NumberEval(startDate), new NumberEval(monthInc) }, ec);

            Assert.AreEqual(expectedResult, result.NumberValue);
        }