From e36650f4ffd3e305d2c3834620f97ec382cf6faf Mon Sep 17 00:00:00 2001 From: xuri Date: Thu, 9 Apr 2020 01:00:14 +0800 Subject: [PATCH] Resolve #598, filter support for AddPivotTable --- cell.go | 3 ++- pivotTable.go | 29 +++++++++++++++++++++++++++++ pivotTable_test.go | 1 + xmlPivotTable.go | 6 +++--- 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/cell.go b/cell.go index 95cfbbf..8e7ede1 100644 --- a/cell.go +++ b/cell.go @@ -458,7 +458,8 @@ func (f *File) SetCellHyperLink(sheet, axis, link, linkType string) error { } // SetCellRichText provides a function to set cell with rich text by given -// worksheet. For example: +// worksheet. For example, set rich text on the A1 cell of the worksheet named +// Sheet1: // // package main // diff --git a/pivotTable.go b/pivotTable.go index b7dc859..7061bfe 100644 --- a/pivotTable.go +++ b/pivotTable.go @@ -25,6 +25,7 @@ type PivotTableOption struct { Rows []PivotTableField Columns []PivotTableField Data []PivotTableField + Filter []PivotTableField } // PivotTableField directly maps the field settings of the pivot table. @@ -86,6 +87,7 @@ type PivotTableField struct { // DataRange: "Sheet1!$A$1:$E$31", // PivotTableRange: "Sheet1!$G$2:$M$34", // Rows: []excelize.PivotTableField{{Data: "Month"}, {Data: "Year"}}, +// Filter: []excelize.PivotTableField{{Data: "Region"}}, // Columns: []excelize.PivotTableField{{Data: "Type"}}, // Data: []excelize.PivotTableField{{Data: "Sales", Name: "Summarize", Subtotal: "Sum"}}, // }); err != nil { @@ -283,6 +285,7 @@ func (f *File) addPivotTable(cacheID, pivotTableID int, pivotTableXML string, op Count: 1, I: []*xlsxI{{}}, }, + PageFields: &xlsxPageFields{}, DataFields: &xlsxDataFields{}, PivotTableStyleInfo: &xlsxPivotTableStyleInfo{ Name: "PivotStyleLight16", @@ -320,6 +323,19 @@ func (f *File) addPivotTable(cacheID, pivotTableID int, pivotTableXML string, op return err } + // page fields + pageFieldsIndex, err := f.getPivotFieldsIndex(opt.Filter, opt) + if err != nil { + return err + } + pageFieldsName := f.getPivotTableFieldsName(opt.Filter) + for idx, pageField := range pageFieldsIndex { + pt.PageFields.PageField = append(pt.PageFields.PageField, &xlsxPageField{ + Name: pageFieldsName[idx], + Fld: pageField, + }) + } + // data fields dataFieldsIndex, err := f.getPivotFieldsIndex(opt.Data, opt) if err != nil { @@ -412,6 +428,19 @@ func (f *File) addPivotFields(pt *xlsxPivotTableDefinition, opt *PivotTableOptio }) continue } + if inPivotTableField(opt.Filter, name) != -1 { + pt.PivotFields.PivotField = append(pt.PivotFields.PivotField, &xlsxPivotField{ + Axis: "axisPage", + Name: f.getPivotTableFieldName(name, opt.Columns), + Items: &xlsxItems{ + Count: 1, + Item: []*xlsxItem{ + {T: "default"}, + }, + }, + }) + continue + } if inPivotTableField(opt.Columns, name) != -1 { pt.PivotFields.PivotField = append(pt.PivotFields.PivotField, &xlsxPivotField{ Axis: "axisCol", diff --git a/pivotTable_test.go b/pivotTable_test.go index 4379538..767206b 100644 --- a/pivotTable_test.go +++ b/pivotTable_test.go @@ -29,6 +29,7 @@ func TestAddPivotTable(t *testing.T) { DataRange: "Sheet1!$A$1:$E$31", PivotTableRange: "Sheet1!$G$2:$M$34", Rows: []PivotTableField{{Data: "Month"}, {Data: "Year"}}, + Filter: []PivotTableField{{Data: "Region"}}, Columns: []PivotTableField{{Data: "Type"}}, Data: []PivotTableField{{Data: "Sales", Subtotal: "Sum", Name: "Summarize by Sum"}}, })) diff --git a/xmlPivotTable.go b/xmlPivotTable.go index 82bbf27..2eff026 100644 --- a/xmlPivotTable.go +++ b/xmlPivotTable.go @@ -251,9 +251,9 @@ type xlsxPageFields struct { type xlsxPageField struct { Fld int `xml:"fld,attr"` Item int `xml:"item,attr,omitempty"` - Hier int `xml:"hier,attr"` - Name string `xml:"name,attr"` - Cap string `xml:"cap,attr"` + Hier int `xml:"hier,attr,omitempty"` + Name string `xml:"name,attr,omitempty"` + Cap string `xml:"cap,attr,omitempty"` ExtLst *xlsxExtLst `xml:"extLst"` }