Пример #1
0
        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;
            }
        }
Пример #2
0
        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();
        }
Пример #3
0
 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)));
     }
 }
Пример #4
0
        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);
                    }
                }
            }
        }
Пример #5
0
        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);
        }
Пример #6
0
 internal override void SaveToXlsx(TOpenXmlWriter DataStream, int Row, TCellList CellList, bool Dates1904)
 {
     //nothing, it gets empty
 }
Пример #7
0
 internal override void SaveToXlsx(TOpenXmlWriter DataStream, int Row, TCellList CellList, bool Dates1904)
 {
     DataStream.WriteElement("v", (double)GetValue());
 }
Пример #8
0
 internal override void SaveToXlsx(TOpenXmlWriter DataStream, int Row, TCellList CellList, bool Dates1904)
 {
     FlxMessages.ThrowException(FlxErr.ErrInternal);
 }
Пример #9
0
 internal override void SaveToXlsx(TOpenXmlWriter DataStream, int Row, TCellList CellList, bool Dates1904)
 {
     DataStream.WriteAtt("t", "s");
     DataStream.WriteElement("v", PosInTable);
 }
Пример #10
0
        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);
        }
Пример #11
0
        /// <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;
            }
        }