Example #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));
        }
Example #2
0
        /**
         * Register a ATP function in runtime.
         *
         * @param name  the function name
         * @param func  the functoin to register
         * @throws ArgumentException if the function is unknown or already  registered.
         * @since 3.8 beta6
         */
        public static void RegisterFunction(String name, FreeRefFunction func)
        {
            AnalysisToolPak inst = (AnalysisToolPak)instance;

            if (!IsATPFunction(name))
            {
                FunctionMetadata metaData = FunctionMetadataRegistry.GetFunctionByName(name);
                if (metaData != null)
                {
                    throw new ArgumentException(name + " is a built-in Excel function. " +
                                                "Use FunctoinEval.RegisterFunction(String name, Function func) instead.");
                }
                else
                {
                    throw new ArgumentException(name + " is not a function from the Excel Analysis Toolpack.");
                }
            }
            FreeRefFunction f = inst.FindFunction(name);

            if (f != null && !(f is NotImplemented))
            {
                throw new ArgumentException("POI already implememts " + name +
                                            ". You cannot override POI's implementations of Excel functions");
            }
            if (_functionsByName.ContainsKey(name))
            {
                _functionsByName[name] = func;
            }
            else
            {
                _functionsByName.Add(name, func);
            }
        }
Example #3
0
        public override FreeRefFunction FindFunction(string name)
        {
            FreeRefFunction function = base.FindFunction(name);

            if (function != null)
            {
                this._funcMap[this.GetFunctionIndex(name)] = name;
            }
            return(function);
        }
Example #4
0
        public override FreeRefFunction FindFunction(String name)
        {
            FreeRefFunction func = base.FindFunction(name);

            if (func != null)
            {
                int idx = GetFunctionIndex(name);
                _funcMap[idx] = name;
            }
            return(func);
        }
        /**
         * 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 + ")");
        }
        public NameXPtg GetNameXPtg(String name)
        {
            IndexedUDFFinder udfFinder = (IndexedUDFFinder)GetUDFFinder();
            FreeRefFunction  func      = udfFinder.FindFunction(name);

            if (func == null)
            {
                return(null);
            }
            else
            {
                return(new NameXPtg(0, udfFinder.GetFunctionIndex(name)));
            }
        }
Example #7
0
        /**
         * Returns a collection of ATP function names NOT implemented by POI.
         *
         * @return an array of not supported functions
         * @since 3.8 beta6
         */
        public static ReadOnlyCollection <String> GetNotSupportedFunctionNames()
        {
            AnalysisToolPak inst = (AnalysisToolPak)instance;
            List <String>   lst  = new List <String>();

            foreach (String name in AnalysisToolPak._functionsByName.Keys)
            {
                FreeRefFunction func = (FreeRefFunction)AnalysisToolPak._functionsByName[(name)];
                if (func != null && (func is NotImplemented))
                {
                    lst.Add(name);
                }
            }
            return(lst.AsReadOnly()); //Collections.unmodifiableCollection(lst);
        }
Example #8
0
 public DefaultUDFFinder(String[] functionNames, FreeRefFunction[] functionImpls)
 {
     int nFuncs = functionNames.Length;
     if (functionImpls.Length != nFuncs)
     {
         throw new ArgumentException(
                 "Mismatch in number of function names and implementations");
     }
     Dictionary<String, FreeRefFunction> m = new Dictionary<String, FreeRefFunction>(nFuncs * 3 / 2);
     for (int i = 0; i < functionImpls.Length; i++)
     {
         m[functionNames[i].ToUpper()]= functionImpls[i];
     }
     _functionsByName = m;
 }
Example #9
0
        /**
         * Returns a collection of ATP function names implemented by POI.
         *
         * @return an array of supported functions
         * @since 3.8 beta6
         */
        public static ReadOnlyCollection <String> GetSupportedFunctionNames()
        {
            AnalysisToolPak inst = (AnalysisToolPak)instance;
            List <String>   lst  = new List <String>();

            foreach (KeyValuePair <String, FreeRefFunction> me in AnalysisToolPak._functionsByName)
            {
                FreeRefFunction func = me.Value;
                if (func != null && !(func is NotImplemented))
                {
                    lst.Add(me.Key);
                }
            }
            return(lst.AsReadOnly()); //Collections.unmodifiableCollection(lst);
        }
Example #10
0
        /// <summary>
        /// Return an external name (named range, function, user-defined function) Pxg
        /// </summary>
        /// <param name="name"></param>
        /// <param name="sheet"></param>
        /// <returns></returns>
        public Ptg GetNameXPtg(String name, SheetIdentifier sheet)
        {
            // First, try to find it as a User Defined Function
            IndexedUDFFinder udfFinder = (IndexedUDFFinder)GetUDFFinder();
            FreeRefFunction  func      = udfFinder.FindFunction(name);

            if (func != null)
            {
                return(new NameXPxg(null, name));
            }

            // Otherwise, try it as a named range
            if (sheet == null)
            {
                if (_uBook.GetNames(name).Count > 0)
                {
                    return(new NameXPxg(null, name));
                }
                return(null);
            }
            if (sheet._sheetIdentifier == null)
            {
                // Workbook + Named Range only
                int bookIndex = ResolveBookIndex(sheet._bookName);
                return(new NameXPxg(bookIndex, null, name));
            }

            // Use the sheetname and process
            String sheetName = sheet._sheetIdentifier.Name;

            if (sheet._bookName != null)
            {
                int bookIndex = ResolveBookIndex(sheet._bookName);
                return(new NameXPxg(bookIndex, sheetName, name));
            }
            else
            {
                return(new NameXPxg(sheetName, name));
            }
        }
Example #11
0
        private static void r(Hashtable m, String functionName, FreeRefFunction pFunc)
        {
            FreeRefFunction func = pFunc == null ? new NotImplemented(functionName) : pFunc;

            m[functionName] = func;
        }
Example #12
0
 /**
  * Register a ATP function in runtime.
  *
  * @param name  the function name
  * @param func  the functoin to register
  * @throws ArgumentException if the function is unknown or already  registered.
  * @since 3.8 beta6
  */
 public static void RegisterFunction(String name, FreeRefFunction func)
 {
     AnalysisToolPak inst = (AnalysisToolPak)instance;
     if (!IsATPFunction(name))
     {
         FunctionMetadata metaData = FunctionMetadataRegistry.GetFunctionByName(name);
         if (metaData != null)
         {
             throw new ArgumentException(name + " is a built-in Excel function. " +
                     "Use FunctoinEval.RegisterFunction(String name, Function func) instead.");
         }
         else
         {
             throw new ArgumentException(name + " is not a function from the Excel Analysis Toolpack.");
         }
     }
     FreeRefFunction f = inst.FindFunction(name);
     if (f != null && !(f is NotImplemented))
     {
         throw new ArgumentException("POI already implememts " + name +
                 ". You cannot override POI's implementations of Excel functions");
     }
     if (_functionsByName.ContainsKey(name))
         _functionsByName[name] = func;
     else
         _functionsByName.Add(name, func);
 }
Example #13
0
 private static void r(Hashtable m, String functionName, FreeRefFunction pFunc)
 {
     FreeRefFunction func = pFunc == null ? new NotImplemented(functionName) : pFunc;
     m[functionName] = func;
 }
Example #14
0
        private static void r(Dictionary <object, object> m, String functionName, FreeRefFunction pFunc)
        {
            FreeRefFunction func = pFunc == null ? new NotImplemented(functionName) : pFunc;

            m[functionName] = func;
        }
Example #15
0
 /**
  * Register a ATP function in runtime.
  *
  * @param name  the function name
  * @param func  the functoin to register
  * @throws IllegalArgumentException if the function is unknown or already  registered.
  * @since 3.8 beta6
  */
 public static void RegisterFunction(String name, FreeRefFunction func)
 {
     AnalysisToolPak.RegisterFunction(name, func);
 }
Example #16
0
 private static void AddMapping(Hashtable m, int offset, FreeRefFunction frf)
 {
     m[CreateFRFKey(offset)] = frf;
 }
Example #17
0
        /**
         * Register a ATP function in runtime.
         *
         * @param name  the function name
         * @param func  the functoin to register
         * @throws IllegalArgumentException if the function is unknown or already  registered.
         * @since 3.8 beta6
         */

        public static void RegisterFunction(string name, FreeRefFunction func)
        {
            AnalysisToolPak.RegisterFunction(name, func);
        }
Example #18
0
        protected void ConfirmFindFunction(String name)
        {
            FreeRefFunction func = _instance.FindFunction(name);

            Assert.IsNotNull(func);
        }