public void Recalc(TCellList CellList, ExcelFile aXls, int SheetIndexBase1) { //Do this loop in normal order, not reversed, to help avoid stack overflows. Normally references grow down and to the right //(for example cell A2 = "A1+1"). If we do the loop in reverse, we start by A900, and to calculate it we need A899 so we need A898... //And this can lead to an stack overflow error. Of course this is no guarantee, an user migh have A2= A3-1, etc, but that is less likely. TFormulaRecord r = FirstFormula; while (r != null) { if (aXls != null) { aXls.SetUnsupportedFormulaCellAddress(new TCellAddress(aXls.GetSheetName(SheetIndexBase1), r.FRow + 1, r.Col + 1, false, false)); } TCalcState CalcState = new TCalcState(); TFormulaRecord rPrev = r.Prev; //r.prev won't be modified by Recalc, as it has already been recalculated r.Recalc(CellList, aXls, SheetIndexBase1, CalcState, new TCalcStack()); if (rPrev == null) { r = FirstFormula; } else { r = rPrev.Next; //Recalc might reorder the calc chain, so we want the next in the chain position, not the next to the modified r.. } r = r.Next; } }
internal override void SaveToXlsx(TOpenXmlWriter DataStream, int Row, TCellList CellList, bool Dates1904) { TxBaseRecord MySelf = new TxBaseRecord(Id, Data); int MyOfs = 6; TExcelString XS = new TExcelString(TStrLenLength.is16bits, ref MySelf, ref MyOfs); DataStream.WriteAtt("t", "inlineStr"); DataStream.WriteStartElement("is"); DataStream.WriteRichText(XS, CellList.Workbook); DataStream.WriteEndElement(); }
internal override void SaveToXlsx(TOpenXmlWriter DataStream, int Row, TCellList CellList, bool Dates1904) { if (ErrFlag == 0) { DataStream.WriteAtt("t", "b"); DataStream.WriteElement("v", BoolErr == 1); } else { DataStream.WriteAtt("t", "e"); DataStream.WriteElement("v", TFormulaMessages.ErrString(ErrCodeToFlxFormulaErrorValue(BoolErr))); } }
internal void ConvertFormulasToValues(int SheetIndex, bool OnlyExternal) { TCellList Cells = Sheets[SheetIndex].Cells.CellList; int RowCount = Cells.Count; for (int r = 0; r < RowCount; r++) { int ColCount = Cells[r].Count; for (int c = ColCount - 1; c >= 0; c--) { TFormulaRecord fr = (Cells[r][c] as TFormulaRecord); if (fr != null && (!OnlyExternal || fr.HasExternRefs())) { Cells.SetValue(r, fr.Col, fr.FormulaValue, fr.XF); } } } }
internal int AddName(TXlsNamedRange Range, TWorkbookGlobals Globals, TCellList CellList) { int aCount = Count; bool IsInternal; bool ValidName = TXlsNamedRange.IsValidRangeName(Range.Name, out IsInternal); if (IsInternal) { Range.OptionFlags |= 0x020; } for (int i = 0; i < aCount; i++) { //Documentation is wrong. We need the sheet index (1 based) not the externsheetindex /*int rSheet=-1; * if (this[i].RangeSheet>=0) * { * rSheet = GetSheet(this[i].RangeSheet); * } */ int rSheet = this[i].RangeSheet; if ( (rSheet == Range.NameSheetIndex) && (String.Equals(this[i].Name, Range.Name, StringComparison.CurrentCultureIgnoreCase)) ) { this[i] = new TNameRecord(Range, Globals, CellList); //We have to be careful not to change name ordering, or formulas would point to wrong ranges. //If we found it, then it *is* a valid name return(i); } } if (!ValidName) { XlsMessages.ThrowException(XlsErr.ErrInvalidNameForARange, Convert.ToString(Range.Name)); } Add(new TNameRecord(Range, Globals, CellList)); CheckInternalNames(Range.OptionFlags, Globals); return(Count - 1); }
internal override void SaveToXlsx(TOpenXmlWriter DataStream, int Row, TCellList CellList, bool Dates1904) { //nothing, it gets empty }
internal override void SaveToXlsx(TOpenXmlWriter DataStream, int Row, TCellList CellList, bool Dates1904) { DataStream.WriteElement("v", (double)GetValue()); }
internal override void SaveToXlsx(TOpenXmlWriter DataStream, int Row, TCellList CellList, bool Dates1904) { FlxMessages.ThrowException(FlxErr.ErrInternal); }
internal override void SaveToXlsx(TOpenXmlWriter DataStream, int Row, TCellList CellList, bool Dates1904) { DataStream.WriteAtt("t", "s"); DataStream.WriteElement("v", PosInTable); }
internal void ReplaceName(int Index, TXlsNamedRange Range, TWorkbookGlobals Globals, TCellList CellList) { bool IsInternal; bool ValidName = TXlsNamedRange.IsValidRangeName(Range.Name, out IsInternal); if (!ValidName) { XlsMessages.ThrowException(XlsErr.ErrInvalidNameForARange, Convert.ToString(Range.Name)); } if (Index < 0 || Index >= Count) { XlsMessages.ThrowException(XlsErr.ErrXlsIndexOutBounds, Index, "Index", 0, Count - 1); } if (IsInternal) { Range.OptionFlags |= 0x020; } this[Index] = new TNameRecord(Range, Globals, CellList); //We have to be careful not to change name ordering, or formulas would point to wrong ranges. CheckInternalNames(Range.OptionFlags, Globals); }
/// <summary> /// You cannot create instances of this class. It must be returned with a call to <see cref="XlsFile.GetChart(int, string)"/> /// </summary> internal XlsChart(XlsFile aWorkbook, TFlxChart aCurrentChart) : base() { Workbook = aWorkbook; CurrentChart = aCurrentChart; CurrentSheet = aWorkbook.InternalWorkbook.Sheets[aWorkbook.ActiveSheet - 1]; if (aWorkbook.InternalWorkbook.IsWorkSheet(aWorkbook.ActiveSheet - 1)) { CellList = aWorkbook.InternalWorkbook.WorkSheets(aWorkbook.ActiveSheet - 1).Cells.CellList; } else { CellList = new TCellList(aWorkbook.InternalWorkbook.Globals, null, null); //for chart sheets. } FHorizontalFontScaling = 1; FVerticalFontScaling = 1; FPlotEmptyCells = TPlotEmptyCells.NotPlotted; if (CurrentChart != null && CurrentChart.Chart.GetChartCache != null) { List <TDataLabel> ArrDataLabels = new List <TDataLabel>(); TChartRecordList Children = CurrentChart.Chart.GetChartCache.Children; for (int i = 0; i < Children.Count; i++) { TxChartBaseRecord R = Children[i] as TxChartBaseRecord; if (R != null) { switch ((xlr)R.Id) { case xlr.ChartPlotgrowth: TChartPlotGrowthRecord PlotGrowth = R as TChartPlotGrowthRecord; FHorizontalFontScaling = PlotGrowth.XScaling / 65536.0; FVerticalFontScaling = PlotGrowth.YScaling / 65536.0; break; case xlr.ChartFrame: TChartFrameRecord BackgroundFrame = R as TChartFrameRecord; if (BackgroundFrame != null) { FBackground = BackgroundFrame.GetFrameOptions(); } break; case xlr.ChartDefaulttext: TChartDefaultTextRecord DT = R as TChartDefaultTextRecord; switch (DT.AppliesTo) { case 2: //default text for all text in the chart. { if (i + 1 < Children.Count) { TChartTextRecord TR = Children[i + 1] as TChartTextRecord; if (TR != null) { TChartFontXRecord FontX = (TChartFontXRecord)TR.FindRec <TChartFontXRecord>(); if (FontX != null) { FDefaultFont = FontX.GetFont(Workbook.InternalWorkbook.Globals, Math.Min(FVerticalFontScaling, FHorizontalFontScaling)); } } } break; } case 0: { if (i + 1 < Children.Count) { TChartTextRecord TR = Children[i + 1] as TChartTextRecord; if (TR != null) { TChartFontXRecord FontX = (TChartFontXRecord)TR.FindRec <TChartFontXRecord>(); if (FontX != null) { FDefaultLabelFont = FontX.GetFont(Workbook.InternalWorkbook.Globals, Math.Min(FVerticalFontScaling, FHorizontalFontScaling)); } } } break; } case 3: //Not documented, but it is the default font for axis. { if (i + 1 < Children.Count) { TChartTextRecord TR = Children[i + 1] as TChartTextRecord; if (TR != null) { TChartFontXRecord FontX = (TChartFontXRecord)TR.FindRec <TChartFontXRecord>(); if (FontX != null) { FDefaultAxisFont = FontX.GetFont(Workbook.InternalWorkbook.Globals, Math.Min(FVerticalFontScaling, FHorizontalFontScaling)); } } } break; } } break; case xlr.ChartText: { if (i - 1 < 0 || !(Children[i - 1] is TChartDefaultTextRecord)) { TChartTextRecord TR = R as TChartTextRecord; int SheetIndex = Workbook.InternalWorkbook.Sheets.IndexOf(CurrentSheet) + 1; if (SheetIndex >= 1) { ArrDataLabels.Add(TR.GetDataLabel(Workbook, CellList, SheetIndex, true, true, Math.Min(FVerticalFontScaling, FHorizontalFontScaling))); } } break; } case xlr.ChartShtprops: TChartShtPropsRecord SP = R as TChartShtPropsRecord; FPlotEmptyCells = (TPlotEmptyCells)SP.PlotEmptyCells; break; } } } FDataLabels = ArrDataLabels.ToArray(); } if (FDefaultFont == null) //FDefaultFont = Workbook.GetFont(15); //Excel does not use this one. { FDefaultFont = new TFlxChartFont(); FDefaultFont.Font.Size20 = 200; FDefaultFont.Font.Name = "Arial"; FDefaultFont.Font.Style = TFlxFontStyles.None; FDefaultFont.Scale = 1; } if (FDefaultLabelFont == null) { FDefaultLabelFont = FDefaultFont; } if (FDefaultAxisFont == null) { FDefaultAxisFont = new TFlxChartFont(); FDefaultAxisFont.Font = Workbook.GetFormat(FlxConsts.DefaultFormatId).Font; //We do not fall out to FDefaultFont, but rather to the default font in the workbook. FDefaultAxisFont.Scale = 1; } }