Example #1
0
        public void AddToken(FormulaTokenCode code, object[] data)
        {
            FormulaToken token = FormulaTokensFactory.CreateFromCode(this.worksheet, code);

            this.tokens.Add(token);
            token.DelayInitialize(data);
        }
Example #2
0
        public static byte[] ConvertNameRecordRangeToRpnBytes(ExcelWorksheet sheet, CellRange range, string sheetName, ExcelWorksheetCollection worksheets)
        {
            FormulaToken token = null;
            string       str   = string.Empty;

            if ((range.Width == 1) && (range.Height == 1))
            {
                Match  match = RefFormulaToken.IsCellRegex.Match(range.ToString());
                string str2  = ConvertToAbsolute(match.Groups["Row"].Value);
                string str3  = ConvertToAbsolute(match.Groups["Column"].Value);
                str   = sheetName + "!" + str3 + str2;
                token = new Ref3dFormulaToken(sheet, FormulaTokenCode.Ref3d1);
            }
            else
            {
                Match  match2 = AreaFormulaToken.IsCellRangeRegex.Match(range.ToString());
                string str4   = ConvertToAbsolute(match2.Groups["Row1"].Value);
                string str5   = ConvertToAbsolute(match2.Groups["Column1"].Value);
                string str6   = ConvertToAbsolute(match2.Groups["Row2"].Value);
                string str7   = ConvertToAbsolute(match2.Groups["Column2"].Value);
                str   = sheetName + "!" + str5 + str4 + ":" + str7 + str6;
                token = new Area3dFormulaToken(FormulaTokenCode.Area3d1);
            }
            token.DelayInitialize(new object[] { str, worksheets });
            return(token.ConvertToBytes());
        }
Example #3
0
        private static void ProcessFunction(FormulaToken token, Stack operandsStack)
        {
            byte num = (token is FunctionFormulaToken) ? (token as FunctionFormulaToken).ArgumentsCount : (token as FunctionVarFormulaToken).ArgumentsCount;

            if (token is FunctionFormulaToken)
            {
                ushort code = (token as FunctionFormulaToken).Function.Code;
            }
            else
            {
                ushort num1 = (token as FunctionVarFormulaToken).Function.Code;
            }
            StringBuilder builder = new StringBuilder();

            builder.Append(token.ToString());
            builder.Append("(");
            string[] strArray = new string[num];
            for (byte i = 0; i < num; i = (byte)(i + 1))
            {
                strArray[i] = operandsStack.Pop() as string;
            }
            for (byte j = num; j > 0; j = (byte)(j - 1))
            {
                string str = strArray[j - 1];
                builder.Append(str);
                if (j != 1)
                {
                    builder.Append(",");
                }
            }
            builder.Append(")");
            operandsStack.Push(builder.ToString());
        }
Example #4
0
        public static FormulaToken CreateFrom(ExcelWorksheet sheet, byte[] rpnBytes, int startIndex)
        {
            byte         code  = rpnBytes[startIndex];
            FormulaToken token = CreateFromCode(sheet, code);

            token.Read(rpnBytes, startIndex + 1);
            return(token);
        }
Example #5
0
 private void TokensToString(Stack operandsStack, FormulaToken[] tokens)
 {
     for (int i = 0; i < tokens.Length; i++)
     {
         FormulaToken token = tokens[i];
         ProcessToken(token, operandsStack);
     }
 }
Example #6
0
        private static void ProcessUnaryOperator(FormulaToken token, Stack operandsStack)
        {
            string str = operandsStack.Pop() as string;

            if (token.Code == 20)
            {
                operandsStack.Push(str + token.ToString());
            }
            else if (token.Code == 21)
            {
                operandsStack.Push("(" + str + ")");
            }
            else
            {
                operandsStack.Push(token.ToString() + str);
            }
        }
Example #7
0
        public static FormulaToken CreateFunctionFromName(string name, FormulaTokenClass tokenClass, byte argumentsCount)
        {
            FormulaToken token = null;

            if (FormulaFunctionsTable.Instance[name].IsFixedArgumentCount)
            {
                switch (tokenClass)
                {
                case FormulaTokenClass.Reference:
                    token = new FunctionFormulaToken(FormulaTokenCode.Func1);
                    break;

                case FormulaTokenClass.Variable:
                    token = new FunctionFormulaToken(FormulaTokenCode.Func2);
                    break;

                case FormulaTokenClass.Array:
                    token = new FunctionFormulaToken(FormulaTokenCode.Func3);
                    break;
                }
            }
            else
            {
                switch (tokenClass)
                {
                case FormulaTokenClass.Reference:
                    token = new FunctionVarFormulaToken(FormulaTokenCode.FuncVar1);
                    break;

                case FormulaTokenClass.Variable:
                    token = new FunctionVarFormulaToken(FormulaTokenCode.FuncVar2);
                    break;

                case FormulaTokenClass.Array:
                    token = new FunctionVarFormulaToken(FormulaTokenCode.FuncVar3);
                    break;
                }
                token.DelayInitialize(new object[] { name, argumentsCount });
                return(token);
            }
            token.DelayInitialize(new object[] { name });
            return(token);
        }
Example #8
0
 private static void ProcessToken(FormulaToken token, Stack operandsStack)
 {
     if (token.Type.IsUnary)
     {
         ProcessUnaryOperator(token, operandsStack);
     }
     else if (token.Type.IsBinary)
     {
         ProcessBinaryOperator(token, operandsStack);
     }
     else if (token.Type.IsOperand)
     {
         ProcessOperand(token, operandsStack);
     }
     else if (token.Type.IsFunction)
     {
         ProcessFunction(token, operandsStack);
     }
     else if (!token.Type.IsControl)
     {
         throw new ArgumentException("Invalid RPN token code.");
     }
 }
Example #9
0
        private bool TokenBytesToString(Stack operandsStack)
        {
            byte[] destinationArray = new byte[this.RpnBytes.Length];
            Array.Copy(this.RpnBytes, 0, destinationArray, 0, this.RpnBytes.Length);
            int  startIndex = 0;
            bool flag       = false;
            bool flag2      = false;

            while (startIndex < this.RpnBytes.Length)
            {
                FormulaToken token = FormulaTokensFactory.CreateFrom(this.sheet, destinationArray, startIndex);
                if (token.Type.IsControl)
                {
                    flag2 = true;
                }
                else
                {
                    flag = true;
                }
                ProcessToken(token, operandsStack);
                startIndex += token.Size;
            }
            return(!flag && flag2);
        }
Example #10
0
 public void AddToken(FormulaToken token)
 {
     this.tokens.Add(token);
 }
Example #11
0
 private static void ProcessOperand(FormulaToken token, Stack operandsStack)
 {
     operandsStack.Push(token.ToString());
 }
Example #12
0
 private static void ProcessBinaryOperator(FormulaToken token, Stack operandsStack)
 {
     operandsStack.Push((operandsStack.Pop() as string) + token.ToString() + (operandsStack.Pop() as string));
 }