diff --git a/sheet.go b/sheet.go index b9a0766..6244e02 100644 --- a/sheet.go +++ b/sheet.go @@ -555,46 +555,58 @@ func (f *File) DeleteSheet(name string) { wbRels := f.relsReader(f.getWorkbookRelsPath()) activeSheetName := f.GetSheetName(f.GetActiveSheetIndex()) deleteLocalSheetID := f.GetSheetIndex(name) - // Delete and adjust defined names - if wb.DefinedNames != nil { - for idx := 0; idx < len(wb.DefinedNames.DefinedName); idx++ { - dn := wb.DefinedNames.DefinedName[idx] - if dn.LocalSheetID != nil { - localSheetID := *dn.LocalSheetID - if localSheetID == deleteLocalSheetID { - wb.DefinedNames.DefinedName = append(wb.DefinedNames.DefinedName[:idx], wb.DefinedNames.DefinedName[idx+1:]...) - idx-- - } else if localSheetID > deleteLocalSheetID { - wb.DefinedNames.DefinedName[idx].LocalSheetID = intPtr(*dn.LocalSheetID - 1) + deleteAndAdjustDefinedNames(wb, deleteLocalSheetID) + + for idx, sheet := range wb.Sheets.Sheet { + if !strings.EqualFold(sheet.Name, sheetName) { + continue + } + + wb.Sheets.Sheet = append(wb.Sheets.Sheet[:idx], wb.Sheets.Sheet[idx+1:]...) + var sheetXML, rels string + if wbRels != nil { + for _, rel := range wbRels.Relationships { + if rel.ID == sheet.ID { + sheetXML = f.getWorksheetPath(rel.Target) + rels = "xl/worksheets/_rels/" + strings.TrimPrefix(f.sheetMap[sheetName], "xl/worksheets/") + ".rels" } } } + target := f.deleteSheetFromWorkbookRels(sheet.ID) + f.deleteSheetFromContentTypes(target) + f.deleteCalcChain(sheet.SheetID, "") + delete(f.sheetMap, sheet.Name) + f.Pkg.Delete(sheetXML) + f.Pkg.Delete(rels) + f.Relationships.Delete(rels) + f.Sheet.Delete(sheetXML) + delete(f.xmlAttr, sheetXML) + f.SheetCount-- } - for idx, sheet := range wb.Sheets.Sheet { - if strings.EqualFold(sheet.Name, sheetName) { - wb.Sheets.Sheet = append(wb.Sheets.Sheet[:idx], wb.Sheets.Sheet[idx+1:]...) - var sheetXML, rels string - if wbRels != nil { - for _, rel := range wbRels.Relationships { - if rel.ID == sheet.ID { - sheetXML = f.getWorksheetPath(rel.Target) - rels = "xl/worksheets/_rels/" + strings.TrimPrefix(f.sheetMap[sheetName], "xl/worksheets/") + ".rels" - } - } + f.SetActiveSheet(f.GetSheetIndex(activeSheetName)) +} + +func deleteAndAdjustDefinedNames(wb *xlsxWorkbook, deleteLocalSheetID int) { + if wb == nil { + return + } + + if wb.DefinedNames == nil { + return + } + + for idx := 0; idx < len(wb.DefinedNames.DefinedName); idx++ { + dn := wb.DefinedNames.DefinedName[idx] + if dn.LocalSheetID != nil { + localSheetID := *dn.LocalSheetID + if localSheetID == deleteLocalSheetID { + wb.DefinedNames.DefinedName = append(wb.DefinedNames.DefinedName[:idx], wb.DefinedNames.DefinedName[idx+1:]...) + idx-- + } else if localSheetID > deleteLocalSheetID { + wb.DefinedNames.DefinedName[idx].LocalSheetID = intPtr(*dn.LocalSheetID - 1) } - target := f.deleteSheetFromWorkbookRels(sheet.ID) - f.deleteSheetFromContentTypes(target) - f.deleteCalcChain(sheet.SheetID, "") - delete(f.sheetMap, sheet.Name) - f.Pkg.Delete(sheetXML) - f.Pkg.Delete(rels) - f.Relationships.Delete(rels) - f.Sheet.Delete(sheetXML) - delete(f.xmlAttr, sheetXML) - f.SheetCount-- } } - f.SetActiveSheet(f.GetSheetIndex(activeSheetName)) } // deleteSheetFromWorkbookRels provides a function to remove worksheet