Example #1
0
        private static void ProcessAttr(TBaseParsedToken Token, TFormulaStack ParsedStack)
        {
            TAttrSpaceToken SpaceToken = Token as TAttrSpaceToken;

            if (SpaceToken != null)
            {
                switch (SpaceToken.SpaceType)
                {
                case FormulaAttr.bitFSpace: ParsedStack.FmSpaces += new String(' ', SpaceToken.SpaceCount); break;

                case FormulaAttr.bitFEnter: ParsedStack.FmSpaces += new String('\u000D', SpaceToken.SpaceCount); break;

                case FormulaAttr.bitFPreSpace: ParsedStack.FmPreSpaces += new String(' ', SpaceToken.SpaceCount); break;

                case FormulaAttr.bitFPreEnter: ParsedStack.FmPreSpaces += new String('\u000D', SpaceToken.SpaceCount); break;

                case FormulaAttr.bitFPostSpace: ParsedStack.FmPostSpaces += new String(' ', SpaceToken.SpaceCount); break;

                case FormulaAttr.bitFPostEnter: ParsedStack.FmPostSpaces += new String('\u000D', SpaceToken.SpaceCount); break;

                case FormulaAttr.bitFPreFmlaSpace: break;    //not handled;
                } //case
            }

            if (Token is TAttrSumToken)
            {
                string s = ParsedStack.Pop();
                ParsedStack.Push(ParsedStack.FmSpaces + TXlsFunction.GetData(4).Name + fts(TFormulaToken.fmOpenParen) + ParsedStack.FmPreSpaces + s + ParsedStack.FmPostSpaces + fts(TFormulaToken.fmCloseParen));
            }
        }
Example #2
0
        internal static string AsString(TParsedTokenList Tokens, int CellRow, int CellCol,
                                        ICellList CellList, TWorkbookGlobals Globals, int MaxStringConstantLen, bool WritingXlsx, bool SkipEqual)
        {
            string        StartFormula = fts(TFormulaToken.fmStartFormula); //Formulas do not always begin with "=". Array formulas begin with "{", and they override this var to empty.
            TFormulaStack ParsedStack  = new TFormulaStack();

            bool R1C1 = false;

            if (Globals != null && !WritingXlsx)
            {
                R1C1 = Globals.Workbook.FormulaReferenceStyle == TReferenceStyle.R1C1;
            }

            Tokens.ResetPositionToStart();
            while (!Tokens.Eof())
            {
                TBaseParsedToken Token = Tokens.ForwardPop();
                ptg BaseToken          = Token.GetBaseId;
                Evaluate(Token, R1C1, CellRow, CellCol, BaseToken, Tokens, CellList, Globals, ParsedStack, ref StartFormula, MaxStringConstantLen, WritingXlsx);
            }             //while


            if (WritingXlsx || SkipEqual)
            {
                StartFormula = String.Empty;
            }

            if (ParsedStack.Count == 0)
            {
                return(String.Empty);                         //StartFormula + TFormulaMessages.ErrString(TFlxFormulaErrorValue.ErrRef);  This is needed for deleted named ranges.
            }
            return(StartFormula + ParsedStack.Pop());
        }
Example #3
0
        private static void Evaluate(TBaseParsedToken Token, bool R1C1, int CellRow, int CellCol, ptg BaseToken, TParsedTokenList RPN, ICellList CellList, TWorkbookGlobals Globals, TFormulaStack ParsedStack, ref string StartFormula, int MaxStringConstantLen, bool WritingXlsx)
        {
            string s1; string s2; string s3;

            switch (BaseToken)
            {
            case ptg.Exp: AddArray(Token, CellRow, CellCol, CellList, Globals, ParsedStack, MaxStringConstantLen, WritingXlsx);
                StartFormula = String.Empty;
                break;

            case ptg.Tbl: AddTable(R1C1, Token, CellList, ParsedStack);
                StartFormula = String.Empty;
                break;

            case ptg.Add: s2 = ParsedStack.Pop(); s1 = ParsedStack.Pop(); ParsedStack.Push(s1 + ParsedStack.FmSpaces + fts(TFormulaToken.fmPlus) + s2); break;

            case ptg.Sub: s2 = ParsedStack.Pop(); s1 = ParsedStack.Pop(); ParsedStack.Push(s1 + ParsedStack.FmSpaces + fts(TFormulaToken.fmMinus) + s2); break;

            case ptg.Mul: s2 = ParsedStack.Pop(); s1 = ParsedStack.Pop(); ParsedStack.Push(s1 + ParsedStack.FmSpaces + fts(TFormulaToken.fmMul) + s2); break;

            case ptg.Div: s2 = ParsedStack.Pop(); s1 = ParsedStack.Pop(); ParsedStack.Push(s1 + ParsedStack.FmSpaces + fts(TFormulaToken.fmDiv) + s2); break;

            case ptg.Power: s2 = ParsedStack.Pop(); s1 = ParsedStack.Pop(); ParsedStack.Push(s1 + ParsedStack.FmSpaces + fts(TFormulaToken.fmPower) + s2); break;

            case ptg.Concat: s2 = ParsedStack.Pop(); s1 = ParsedStack.Pop(); ParsedStack.Push(s1 + ParsedStack.FmSpaces + fts(TFormulaToken.fmAnd) + s2); break;

            case ptg.LT: s2 = ParsedStack.Pop(); s1 = ParsedStack.Pop(); ParsedStack.Push(s1 + ParsedStack.FmSpaces + fts(TFormulaToken.fmLT) + s2); break;

            case ptg.LE: s2 = ParsedStack.Pop(); s1 = ParsedStack.Pop(); ParsedStack.Push(s1 + ParsedStack.FmSpaces + fts(TFormulaToken.fmLE) + s2); break;

            case ptg.EQ: s2 = ParsedStack.Pop(); s1 = ParsedStack.Pop(); ParsedStack.Push(s1 + ParsedStack.FmSpaces + fts(TFormulaToken.fmEQ) + s2); break;

            case ptg.GE: s2 = ParsedStack.Pop(); s1 = ParsedStack.Pop(); ParsedStack.Push(s1 + ParsedStack.FmSpaces + fts(TFormulaToken.fmGE) + s2); break;

            case ptg.GT: s2 = ParsedStack.Pop(); s1 = ParsedStack.Pop(); ParsedStack.Push(s1 + ParsedStack.FmSpaces + fts(TFormulaToken.fmGT) + s2); break;

            case ptg.NE: s2 = ParsedStack.Pop(); s1 = ParsedStack.Pop(); ParsedStack.Push(s1 + ParsedStack.FmSpaces + fts(TFormulaToken.fmNE) + s2); break;

            case ptg.Isect: s2 = ParsedStack.Pop(); s1 = ParsedStack.Pop(); ParsedStack.Push(s1 + ParsedStack.FmSpaces + fts(TFormulaToken.fmIntersect) + s2); break;

            case ptg.Union: s2 = ParsedStack.Pop(); s1 = ParsedStack.Pop(); ParsedStack.Push(s1 + ParsedStack.FmSpaces + fts(TFormulaToken.fmUnion) + s2); break;

            case ptg.Range: s2 = ParsedStack.Pop(); s1 = ParsedStack.Pop(); ParsedStack.Push(s1 + ParsedStack.FmSpaces + fts(TFormulaToken.fmRangeSep) + s2); break;

            case ptg.Uplus: s1 = ParsedStack.Pop(); ParsedStack.Push(ParsedStack.FmSpaces + fts(TFormulaToken.fmPlus) + s1); break;

            case ptg.Uminus: s1 = ParsedStack.Pop(); ParsedStack.Push(ParsedStack.FmSpaces + fts(TFormulaToken.fmMinus) + s1); break;

            case ptg.Percent: s1 = ParsedStack.Pop(); ParsedStack.Push(s1 + ParsedStack.FmSpaces + fts(TFormulaToken.fmPercent)); break;

            case ptg.Paren: s1 = ParsedStack.Pop(); ParsedStack.Push(ParsedStack.FmPreSpaces + fts(TFormulaToken.fmOpenParen) + s1 + ParsedStack.FmPostSpaces + fts(TFormulaToken.fmCloseParen)); break;

            case ptg.MissArg: ParsedStack.Push(ParsedStack.FmSpaces); break;

            case ptg.Str:
                ParsedStack.Push(ParsedStack.FmSpaces + fts(TFormulaToken.fmStr)
                                 + GetString(((TStrDataToken)Token).GetData(), MaxStringConstantLen) + fts(TFormulaToken.fmStr));
                break;

            case ptg.Attr: ProcessAttr(Token, ParsedStack); break;

            case ptg.Sheet:  break;

            case ptg.EndSheet:  break;

            case ptg.Err: ParsedStack.Push(ParsedStack.FmSpaces + GetErrorText(((TErrDataToken)Token).GetData())); break;

            case ptg.Bool: ParsedStack.Push(ParsedStack.FmSpaces + GetBoolText(((TBoolDataToken)Token).GetData())); break;

            case ptg.Int: ParsedStack.Push(ParsedStack.FmSpaces + TFormulaMessages.FloatToString(((TIntDataToken)Token).GetData())); break;

            case ptg.Num: ParsedStack.Push(ParsedStack.FmSpaces + TFormulaMessages.FloatToString(((TNumDataToken)Token).GetData())); break;

            case ptg.Array: ParsedStack.Push(ParsedStack.FmSpaces + GetArrayText(((TArrayDataToken)Token).GetData, MaxStringConstantLen)); break;

            case ptg.Func:
            case ptg.FuncVar:
                int                ArgCount;
                bool               IsAddin;
                StringBuilder      sb         = new StringBuilder();
                TBaseFunctionToken FunctionTk = Token as TBaseFunctionToken;

                s3 = ParsedStack.FmSpaces + GetFuncName(FunctionTk, out ArgCount, WritingXlsx, out IsAddin);

                if (ArgCount > 0)
                {
                    sb.Append(ParsedStack.Pop());
                }
                for (int i = 2; i <= ArgCount; i++)
                {
                    s1 = ParsedStack.Pop();
                    sb.Insert(0, s1 + fts(TFormulaToken.fmFunctionSep));
                }

                if (IsAddin)
                {
                    s3 += ConvertInternalFunctionName(Globals, ParsedStack.Pop());
                }
                ParsedStack.Push(s3 + fts(TFormulaToken.fmOpenParen) + ParsedStack.FmPreSpaces + sb.ToString() + ParsedStack.FmPostSpaces + fts(TFormulaToken.fmCloseParen));
                break;

            case ptg.Name: ParsedStack.Push(ParsedStack.FmSpaces + GetName(((TNameToken)Token).NameIndex, -1, Globals, WritingXlsx)); break;

            case ptg.RefN:
            case ptg.Ref: ParsedStack.Push(ParsedStack.FmSpaces + GetRef(R1C1, (TRefToken)Token, CellRow, CellCol)); break;

            case ptg.AreaN:
            case ptg.Area: ParsedStack.Push(ParsedStack.FmSpaces + GetArea(R1C1, (TAreaToken)Token, CellRow, CellCol)); break;

            case ptg.MemArea: break;

            case ptg.MemErr: break;

            case ptg.MemNoMem: break;

            case ptg.MemFunc: break;

            case ptg.RefErr: ParsedStack.Push(ParsedStack.FmSpaces + TFormulaMessages.ErrString(TFlxFormulaErrorValue.ErrRef)); break;

            case ptg.AreaErr: ParsedStack.Push(ParsedStack.FmSpaces + TFormulaMessages.ErrString(TFlxFormulaErrorValue.ErrRef)); break;

            case ptg.MemAreaN: break;

            case ptg.MemNoMemN: break;

            case ptg.NameX: ParsedStack.Push(ParsedStack.FmSpaces + GetNameX((TNameXToken)Token, Globals, WritingXlsx)); break;

            case ptg.Ref3d: ParsedStack.Push(ParsedStack.FmSpaces + GetRef3D(R1C1, (TRef3dToken)Token, CellRow, CellCol, Globals, false, WritingXlsx)); break;

            case ptg.Area3d: ParsedStack.Push(ParsedStack.FmSpaces + GetArea3D(R1C1, (TArea3dToken)Token, CellRow, CellCol, Globals, false, WritingXlsx)); break;

            case ptg.Ref3dErr: ParsedStack.Push(ParsedStack.FmSpaces + GetRef3D(R1C1, (TRef3dToken)Token, -1, -1, Globals, true, WritingXlsx)); break;

            case ptg.Area3dErr: ParsedStack.Push(ParsedStack.FmSpaces + GetArea3D(R1C1, (TArea3dToken)Token, CellRow, CellCol, Globals, true, WritingXlsx)); break;

            default: XlsMessages.ThrowException(XlsErr.ErrBadToken, Token); break;
            }
        }
Example #4
0
        private static void AddArray(TBaseParsedToken Token, int CellRow, int CellCol, ICellList CellList, TWorkbookGlobals Globals, TFormulaStack ParsedStack, int MaxStringConstantLen, bool WritingXlsx)
        {
            if (CellList == null)
            {
                ParsedStack.Push(" <Ref> ");
                return;
            }

            string Start = "";
            string Stop  = "";

            if (!WritingXlsx)
            {
                Start = fts(TFormulaToken.fmOpenArray);
                Stop  = fts(TFormulaToken.fmCloseArray);
            }
            ParsedStack.Push(Start
                             + TFormulaConvertInternalToText.AsString(CellList.ArrayFormula(((TExp_Token)Token).Row, ((TExp_Token)Token).Col), CellRow, CellCol, CellList, Globals, MaxStringConstantLen, WritingXlsx)
                             + Stop);
        }
Example #5
0
        private static void AddTable(bool R1C1, TBaseParsedToken Token, ICellList CellList, TFormulaStack ParsedStack)
        {
            if (CellList == null || Token is TTableObjToken)
            {
                ParsedStack.Push(" <Table> ");
                return;
            }

            ParsedStack.Push(fts(TFormulaToken.fmOpenArray) + fts(TFormulaToken.fmStartFormula)
                             + fts(TFormulaToken.fmTableText) + fts(TFormulaToken.fmOpenParen)
                             + GetTableText(R1C1, CellList.TableFormula(((TTableToken)Token).Row, ((TTableToken)Token).Col))
                             + fts(TFormulaToken.fmCloseParen) + fts(TFormulaToken.fmCloseArray));
        }