Ejemplo n.º 1
0
        internal void CleanUnusedNames(TWorkbook Workbook)
        {
            TDeletedRanges DeletedRanges = Workbook.FindUnreferencedRanges(-1, 0);

            for (int i = DeletedRanges.Count - 1; i >= 0; i--)
            {
                if (!DeletedRanges.Referenced(i) && !this[i].HasFormulaData && CanDeleteName(i))                  //don't delete internal names, or macro names.
                {
                    FList.RemoveAt(i);
                    DeletedRanges.AddNameForDelete(i);
                }
            }

            if (DeletedRanges.NeedsUpdate)
            {
                Workbook.UpdateDeletedRanges(-1, 0, DeletedRanges);
            }
        }
Ejemplo n.º 2
0
        private static void FindReferences(TNameToken r, TDeletedRanges DeletedRanges)
        {
            int NameId = r.NameIndex - 1;

            if (NameId < 0 || NameId >= DeletedRanges.Count)
            {
                return;
            }
            if (DeletedRanges.Referenced(NameId))
            {
                return;                                   //Avoid infinite loop if one range refers to other and vice versa.
            }
            DeletedRanges.Reference(NameId);

            //We also need to recursively find all other names referenced by this name.
            TNameRecord Name = DeletedRanges.Names[NameId];

            Name.UpdateDeletedRanges(DeletedRanges);
        }
Ejemplo n.º 3
0
        internal void DeleteName(int Index, TWorkbook Workbook)
        {
            if (Index < 0 || Index >= Count)
            {
                XlsMessages.ThrowException(XlsErr.ErrXlsIndexOutBounds, Index, "Index", 0, Count - 1);
            }

            TDeletedRanges DeletedRanges = Workbook.FindUnreferencedRanges(-1, 0);

            if (!DeletedRanges.Referenced(Index) && CanDeleteName(Index))              //don't delete internal names, or macro names.
            {
                FList.RemoveAt(Index);
                DeletedRanges.AddNameForDelete(Index);
                Workbook.UpdateDeletedRanges(-1, 0, DeletedRanges);
            }
            else
            {
                ClearName(Index);
            }
        }
Ejemplo n.º 4
0
        private static void UpdateRange(TNameToken r, TDeletedRanges DeletedRanges)
        {
            int NameId = r.NameIndex - 1;

            if (NameId < 0 || NameId >= DeletedRanges.Count)
            {
                return;
            }

            Debug.Assert(DeletedRanges.Referenced(NameId), "Can't delete ranges that have references. Excel does not do it, and doesn't provide a way to create invalid references for ranges.");

            int ofs = DeletedRanges.Offset(NameId);

            if (ofs == 0)
            {
                return;
            }

            NameId -= ofs;
            Debug.Assert(NameId >= 0);

            r.NameIndex = NameId + 1;
        }
Ejemplo n.º 5
0
        internal void DeleteSheets(int SheetIndex, int SheetCount, TWorkbook Workbook)
        {
            TDeletedRanges DeletedRanges = Workbook.FindUnreferencedRanges(SheetIndex, SheetCount);

            for (int i = Count - 1; i >= 0; i--)
            {
                if ((this[i].RangeSheet >= SheetIndex) && (this[i].RangeSheet < SheetIndex + SheetCount))
                {
                    /* We cannot just delete the range, or formulas referring this range would crash (or refer to the wrong name).
                     * To actually delete here, we need to first find out whether this range is used.
                     * If it is not, go through all the formulas, charts, pivot tables, etc, and update the references to
                     * ranges less than this one to one less.
                     */

                    if (!DeletedRanges.Referenced(i) && CanDeleteName(i))  //don't delete internal names, or macro names.
                    {
                        FList.RemoveAt(i);
                        DeletedRanges.AddNameForDelete(i);
                    }
                    else
                    {
                        EnsureUniqueGlobalName(i);
                        this[i].RangeSheet = -1;
                    }
                }
                else
                {
                    this[i].ArrangeInsertSheets(SheetIndex, -SheetCount);
                }
            }

            if (DeletedRanges.NeedsUpdate)
            {
                Workbook.UpdateDeletedRanges(SheetIndex, SheetCount, DeletedRanges); //Update formulas, charts, etc.
            }
        }