Selaa lähdekoodia

Resolve #511, allow empty columns in the pivot table

xuri 6 vuotta sitten
vanhempi
commit
87390cdd99
6 muutettua tiedostoa jossa 51 lisäystä ja 17 poistoa
  1. 1 1
      calcchain.go
  2. 30 11
      pivotTable.go
  3. 6 0
      pivotTable_test.go
  4. 1 1
      rows_test.go
  5. 9 0
      sheet_test.go
  6. 4 4
      xmlDrawing.go

+ 1 - 1
calcchain.go

@@ -56,7 +56,7 @@ type xlsxCalcChainCollection []xlsxCalcChainC
 
 // Filter provides a function to filter calculation chain.
 func (c xlsxCalcChainCollection) Filter(fn func(v xlsxCalcChainC) bool) []xlsxCalcChainC {
-	results := make([]xlsxCalcChainC, 0)
+	var results []xlsxCalcChainC
 	for _, v := range c {
 		if fn(v) {
 			results = append(results, v)

+ 30 - 11
pivotTable.go

@@ -253,7 +253,10 @@ func (f *File) addPivotTable(cacheID, pivotTableID int, pivotTableXML string, op
 				},
 			},
 		},
-		ColFields:  &xlsxColFields{},
+		ColItems: &xlsxColItems{
+			Count: 1,
+			I:     []*xlsxI{{}},
+		},
 		DataFields: &xlsxDataFields{},
 		PivotTableStyleInfo: &xlsxPivotTableStyleInfo{
 			Name:           "PivotStyleLight16",
@@ -286,19 +289,10 @@ func (f *File) addPivotTable(cacheID, pivotTableID int, pivotTableXML string, op
 	// count row fields
 	pt.RowFields.Count = len(pt.RowFields.Field)
 
-	// col fields
-	colFieldsIndex, err := f.getPivotFieldsIndex(opt.Columns, opt)
+	err = f.addPivotColFields(&pt, opt)
 	if err != nil {
 		return err
 	}
-	for _, filedIdx := range colFieldsIndex {
-		pt.ColFields.Field = append(pt.ColFields.Field, &xlsxField{
-			X: filedIdx,
-		})
-	}
-
-	// count col fields
-	pt.ColFields.Count = len(pt.ColFields.Field)
 
 	// data fields
 	dataFieldsIndex, err := f.getPivotFieldsIndex(opt.Data, opt)
@@ -330,6 +324,31 @@ func inStrSlice(a []string, x string) int {
 	return -1
 }
 
+// addPivotColFields create pivot column fields by given pivot table
+// definition and option.
+func (f *File) addPivotColFields(pt *xlsxPivotTableDefinition, opt *PivotTableOption) error {
+	if len(opt.Columns) == 0 {
+		return nil
+	}
+
+	pt.ColFields = &xlsxColFields{}
+
+	// col fields
+	colFieldsIndex, err := f.getPivotFieldsIndex(opt.Columns, opt)
+	if err != nil {
+		return err
+	}
+	for _, filedIdx := range colFieldsIndex {
+		pt.ColFields.Field = append(pt.ColFields.Field, &xlsxField{
+			X: filedIdx,
+		})
+	}
+
+	// count col fields
+	pt.ColFields.Count = len(pt.ColFields.Field)
+	return err
+}
+
 // addPivotFields create pivot fields based on the column order of the first
 // row in the data region by given pivot table definition and option.
 func (f *File) addPivotFields(pt *xlsxPivotTableDefinition, opt *PivotTableOption) error {

+ 6 - 0
pivotTable_test.go

@@ -54,6 +54,12 @@ func TestAddPivotTable(t *testing.T) {
 		Columns:         []string{"Region", "Year"},
 		Data:            []string{"Sales"},
 	}))
+	assert.NoError(t, f.AddPivotTable(&PivotTableOption{
+		DataRange:       "Sheet1!$A$1:$E$31",
+		PivotTableRange: "Sheet1!$AE$2:$AG$33",
+		Rows:            []string{"Month", "Year"},
+		Data:            []string{"Sales"},
+	}))
 	f.NewSheet("Sheet2")
 	assert.NoError(t, f.AddPivotTable(&PivotTableOption{
 		DataRange:       "Sheet1!$A$1:$E$31",

+ 1 - 1
rows_test.go

@@ -22,7 +22,7 @@ func TestRows(t *testing.T) {
 		t.FailNow()
 	}
 
-	collectedRows := make([][]string, 0)
+	var collectedRows [][]string
 	for rows.Next() {
 		columns, err := rows.Columns()
 		assert.NoError(t, err)

+ 9 - 0
sheet_test.go

@@ -66,6 +66,15 @@ func ExampleFile_GetPageLayout() {
 	// - fit to width: 1
 }
 
+func TestNewSheet(t *testing.T) {
+	f := excelize.NewFile()
+	sheetID := f.NewSheet("Sheet2")
+	f.SetActiveSheet(sheetID)
+	// delete original sheet
+	f.DeleteSheet(f.GetSheetName(f.GetSheetIndex("Sheet1")))
+	assert.NoError(t, f.SaveAs(filepath.Join("test", "TestNewSheet.xlsx")))
+}
+
 func TestPageLayoutOption(t *testing.T) {
 	const sheet = "Sheet1"
 

+ 4 - 4
xmlDrawing.go

@@ -47,10 +47,10 @@ const (
 	NameSpaceDublinCore                  = "http://purl.org/dc/elements/1.1/"
 	NameSpaceDublinCoreTerms             = "http://purl.org/dc/terms/"
 	NameSpaceDublinCoreMetadataIntiative = "http://purl.org/dc/dcmitype/"
-	// The extLst child element ([ISO/IEC29500-1:2016] section 18.2.10) of the
-	// worksheet element ([ISO/IEC29500-1:2016] section 18.3.1.99) is extended by
-	// the addition of new child ext elements ([ISO/IEC29500-1:2016] section
-	// 18.2.7)
+	// ExtURIConditionalFormattings is the extLst child element
+	// ([ISO/IEC29500-1:2016] section 18.2.10) of the worksheet element
+	// ([ISO/IEC29500-1:2016] section 18.3.1.99) is extended by the addition of
+	// new child ext elements ([ISO/IEC29500-1:2016] section 18.2.7)
 	ExtURIConditionalFormattings = "{78C0D931-6437-407D-A8EE-F0AAD7539E65}"
 	ExtURIDataValidations        = "{CCE6A557-97BC-4B89-ADB6-D9C93CAAB3DF}"
 	ExtURISparklineGroups        = "{05C60535-1F16-4fd2-B633-F4F36F0B64E0}"