Forráskód Böngészése

This improves compatibility for worksheet relative XML path and multi rules auto filter

xuri 4 éve
szülő
commit
3648335d7f
4 módosított fájl, 22 hozzáadás és 22 törlés
  1. 9 9
      sheet.go
  2. 1 1
      stream_test.go
  3. 8 8
      table.go
  4. 4 4
      xmlTable.go

+ 9 - 9
sheet.go

@@ -447,17 +447,17 @@ func (f *File) GetSheetList() (list []string) {
 // getSheetMap provides a function to get worksheet name and XML file path map
 // of the spreadsheet.
 func (f *File) getSheetMap() map[string]string {
-	content := f.workbookReader()
-	rels := f.relsReader(f.getWorkbookRelsPath())
 	maps := map[string]string{}
-	for _, v := range content.Sheets.Sheet {
-		for _, rel := range rels.Relationships {
+	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
-				pathInfo := strings.Split(rel.Target, "/")
-				pathInfoLen := len(pathInfo)
-				if pathInfoLen > 1 {
-					maps[v.Name] = fmt.Sprintf("xl/%s", strings.Join(pathInfo[pathInfoLen-2:], "/"))
+				// 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(filepath.Clean(fmt.Sprintf("%s/%s", filepath.Dir(f.getWorkbookPath()), rel.Target)), "/"))
+				if _, ok := f.XLSX[path]; ok {
+					maps[v.Name] = path
 				}
 			}
 		}

+ 1 - 1
stream_test.go

@@ -76,7 +76,7 @@ func TestStreamWriter(t *testing.T) {
 	file = NewFile()
 	streamWriter, err = file.NewStreamWriter("Sheet1")
 	assert.NoError(t, err)
-	for rowID := 10; rowID <= 51200; rowID++ {
+	for rowID := 10; rowID <= 25600; rowID++ {
 		row := make([]interface{}, 50)
 		for colID := 0; colID < 50; colID++ {
 			row[colID] = rand.Intn(640000)

+ 8 - 8
table.go

@@ -348,9 +348,9 @@ func (f *File) autoFilter(sheet, ref string, refRange, col int, formatSet *forma
 		return fmt.Errorf("incorrect index of column '%s'", formatSet.Column)
 	}
 
-	filter.FilterColumn = &xlsxFilterColumn{
+	filter.FilterColumn = append(filter.FilterColumn, &xlsxFilterColumn{
 		ColID: offset,
-	}
+	})
 	re := regexp.MustCompile(`"(?:[^"]|"")*"|\S+`)
 	token := re.FindAllString(formatSet.Expression, -1)
 	if len(token) != 3 && len(token) != 7 {
@@ -372,14 +372,14 @@ func (f *File) writeAutoFilter(filter *xlsxAutoFilter, exp []int, tokens []strin
 		// Single equality.
 		var filters []*xlsxFilter
 		filters = append(filters, &xlsxFilter{Val: tokens[0]})
-		filter.FilterColumn.Filters = &xlsxFilters{Filter: filters}
+		filter.FilterColumn[0].Filters = &xlsxFilters{Filter: filters}
 	} else if len(exp) == 3 && exp[0] == 2 && exp[1] == 1 && exp[2] == 2 {
 		// Double equality with "or" operator.
 		filters := []*xlsxFilter{}
 		for _, v := range tokens {
 			filters = append(filters, &xlsxFilter{Val: v})
 		}
-		filter.FilterColumn.Filters = &xlsxFilters{Filter: filters}
+		filter.FilterColumn[0].Filters = &xlsxFilters{Filter: filters}
 	} else {
 		// Non default custom filter.
 		expRel := map[int]int{0: 0, 1: 2}
@@ -387,7 +387,7 @@ func (f *File) writeAutoFilter(filter *xlsxAutoFilter, exp []int, tokens []strin
 		for k, v := range tokens {
 			f.writeCustomFilter(filter, exp[expRel[k]], v)
 			if k == 1 {
-				filter.FilterColumn.CustomFilters.And = andRel[exp[k]]
+				filter.FilterColumn[0].CustomFilters.And = andRel[exp[k]]
 			}
 		}
 	}
@@ -408,12 +408,12 @@ func (f *File) writeCustomFilter(filter *xlsxAutoFilter, operator int, val strin
 		Operator: operators[operator],
 		Val:      val,
 	}
-	if filter.FilterColumn.CustomFilters != nil {
-		filter.FilterColumn.CustomFilters.CustomFilter = append(filter.FilterColumn.CustomFilters.CustomFilter, &customFilter)
+	if filter.FilterColumn[0].CustomFilters != nil {
+		filter.FilterColumn[0].CustomFilters.CustomFilter = append(filter.FilterColumn[0].CustomFilters.CustomFilter, &customFilter)
 	} else {
 		customFilters := []*xlsxCustomFilter{}
 		customFilters = append(customFilters, &customFilter)
-		filter.FilterColumn.CustomFilters = &xlsxCustomFilters{CustomFilter: customFilters}
+		filter.FilterColumn[0].CustomFilters = &xlsxCustomFilters{CustomFilter: customFilters}
 	}
 }
 

+ 4 - 4
xmlTable.go

@@ -1,4 +1,4 @@
-// Copyright 2016 - 2020 The excelize Authors. All rights reserved. Use of
+// Copyright 2016 - 2021 The excelize Authors. All rights reserved. Use of
 // this source code is governed by a BSD-style license that can be found in
 // the LICENSE file.
 //
@@ -46,9 +46,9 @@ type xlsxTable struct {
 // applied column by column to a table of data in the worksheet. This collection
 // expresses AutoFilter settings.
 type xlsxAutoFilter struct {
-	XMLName      xml.Name          `xml:"autoFilter"`
-	Ref          string            `xml:"ref,attr"`
-	FilterColumn *xlsxFilterColumn `xml:"filterColumn"`
+	XMLName      xml.Name            `xml:"autoFilter"`
+	Ref          string              `xml:"ref,attr"`
+	FilterColumn []*xlsxFilterColumn `xml:"filterColumn"`
 }
 
 // xlsxFilterColumn directly maps the filterColumn element. The filterColumn