private IEnumerable <TCell> GetAdjacentCells <TCell>(ICell cell, ICellList <TCell> cellList, Predicate <short?> predicate1, Predicate <TCell> predicate2) where TCell : ICell { Point pos = Cell.GetPointFromCell(cell.Id); short?cellId; TCell adjacent; if ((cellId = Cell.GetCellFromPoint(pos.X + 1, pos.Y + 0)) != null && predicate1(cellId) && predicate2(adjacent = cellList[cellId.Value])) { yield return(adjacent); } if ((cellId = Cell.GetCellFromPoint(pos.X + 0, pos.Y + 1)) != null && predicate1(cellId) && predicate2(adjacent = cellList[cellId.Value])) { yield return(adjacent); } if ((cellId = Cell.GetCellFromPoint(pos.X - 1, pos.Y + 0)) != null && predicate1(cellId) && predicate2(adjacent = cellList[cellId.Value])) { yield return(adjacent); } if ((cellId = Cell.GetCellFromPoint(pos.X + 0, pos.Y - 1)) != null && predicate1(cellId) && predicate2(adjacent = cellList[cellId.Value])) { yield return(adjacent); } }
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()); }
internal override object GetValue(ICellList Cells) { TxBaseRecord MySelf = new TxBaseRecord(Id, Data); int MyOfs = 6; TExcelString XS = new TExcelString(TStrLenLength.is16bits, ref MySelf, ref MyOfs); return(XS.Data); }
internal override object GetValue(ICellList Cells) { if ((pSSTEntry != null) && (pSSTEntry.RichTextFormats != null) && (pSSTEntry.RichTextFormats.Length > 0)) { return(AsRichString); } else { return(AsString); } }
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)); }
internal override object GetValue(ICellList Cells) { if (ErrFlag == 0) { if (BoolErr == 0) { return(false); } else { return(true); } } else { return(ErrCodeToFlxFormulaErrorValue(BoolErr)); } }
internal override object GetValue(ICellList Cells) { TxBaseRecord MySelf = new TxBaseRecord(Id, Data); int MyOfs = 6; TExcelString XS = new TExcelString(TStrLenLength.is16bits, ref MySelf, ref MyOfs); byte[] b = new byte[2]; BitOps.ReadMem(ref MySelf, ref MyOfs, b); TRTFRun[] RTFRuns = new TRTFRun[BitOps.GetWord(b, 0)]; for (int i = 0; i < RTFRuns.Length; i++) { BitOps.ReadMem(ref MySelf, ref MyOfs, b); RTFRuns[i].FirstChar = BitOps.GetWord(b, 0); BitOps.ReadMem(ref MySelf, ref MyOfs, b); RTFRuns[i].FontIndex = BitOps.GetWord(b, 0); } return(new TRichString(XS.Data, RTFRuns, Cells.Workbook)); }
internal override object GetValue(ICellList Cells) { return(GetValue()); }
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; } }
internal static string AsString(TParsedTokenList Tokens, int CellRow, int CellCol, ICellList CellList, TWorkbookGlobals Globals, int MaxStringConstantLen, bool WritingXlsx) { return(AsString(Tokens, CellRow, CellCol, CellList, Globals, MaxStringConstantLen, WritingXlsx, false)); }
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); }
internal static string AsString(TParsedTokenList Tokens, int CellRow, int CellCol, ICellList CellList) { TWorkbookGlobals Globals = null; if (CellList != null) { Globals = CellList.Globals; } return(AsString(Tokens, CellRow, CellCol, CellList, Globals, -1, false)); }