From 6b277c61d22419b1006e9b5c557e1175fb2f2d99 Mon Sep 17 00:00:00 2001 From: xuri Date: Thu, 18 Nov 2021 08:06:14 +0800 Subject: Fix sheet deletion fail in some case --- sheet.go | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/sheet.go b/sheet.go index 1aa378b..b9a0766 100644 --- a/sheet.go +++ b/sheet.go @@ -122,6 +122,19 @@ func (f *File) getWorkbookRelsPath() (path string) { return } +// getWorksheetPath construct a target XML as xl/worksheets/sheet%d by split +// path, compatible with different types of relative paths in +// workbook.xml.rels, for example: worksheets/sheet%d.xml +// and /xl/worksheets/sheet%d.xml +func (f *File) getWorksheetPath(relTarget string) (path string) { + path = filepath.ToSlash(strings.TrimPrefix( + strings.Replace(filepath.Clean(fmt.Sprintf("%s/%s", filepath.Dir(f.getWorkbookPath()), relTarget)), "\\", "/", -1), "/")) + if strings.HasPrefix(relTarget, "/") { + path = filepath.ToSlash(strings.TrimPrefix(strings.Replace(filepath.Clean(relTarget), "\\", "/", -1), "/")) + } + return path +} + // workbookReader provides a function to get the pointer to the workbook.xml // structure after deserialization. func (f *File) workbookReader() *xlsxWorkbook { @@ -491,15 +504,7 @@ func (f *File) getSheetMap() map[string]string { for _, v := range f.workbookReader().Sheets.Sheet { for _, rel := range f.relsReader(f.getWorkbookRelsPath()).Relationships { if rel.ID == v.ID { - // Construct a target XML as xl/worksheets/sheet%d by split - // path, compatible with different types of relative paths in - // workbook.xml.rels, for example: worksheets/sheet%d.xml - // and /xl/worksheets/sheet%d.xml - path := filepath.ToSlash(strings.TrimPrefix( - strings.Replace(filepath.Clean(fmt.Sprintf("%s/%s", filepath.Dir(f.getWorkbookPath()), rel.Target)), "\\", "/", -1), "/")) - if strings.HasPrefix(rel.Target, "/") { - path = filepath.ToSlash(strings.TrimPrefix(strings.Replace(filepath.Clean(rel.Target), "\\", "/", -1), "/")) - } + path := f.getWorksheetPath(rel.Target) if _, ok := f.Pkg.Load(path); ok { maps[v.Name] = path } @@ -572,7 +577,7 @@ func (f *File) DeleteSheet(name string) { if wbRels != nil { for _, rel := range wbRels.Relationships { if rel.ID == sheet.ID { - sheetXML = rel.Target + sheetXML = f.getWorksheetPath(rel.Target) rels = "xl/worksheets/_rels/" + strings.TrimPrefix(f.sheetMap[sheetName], "xl/worksheets/") + ".rels" } } -- cgit v1.2.1