Skip to content

Commit d147e85

Browse files
Merge pull request #1 from tespkg/v2
Added support for showDataAs and baseField features in the pivot table
2 parents b7375bc + f567e94 commit d147e85

2 files changed

Lines changed: 32 additions & 7 deletions

File tree

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
module github.com/xuri/excelize/v2
1+
module github.com/tespkg/excelize/v2
22

33
go 1.18
44

pivotTable.go

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ type PivotTableField struct {
9898
Subtotal string
9999
DefaultSubtotal bool
100100
NumFmt int
101+
ShowDataAs string // runTotal for cumulative sum
102+
BaseField string // the field for calculating cumulative aggregation
101103
}
102104

103105
// AddPivotTable provides the method to add pivot table by given pivot table
@@ -475,17 +477,27 @@ func (f *File) addPivotDataFields(pt *xlsxPivotTableDefinition, opts *PivotTable
475477
}
476478
dataFieldsSubtotals := f.getPivotTableFieldsSubtotal(opts.Data)
477479
dataFieldsName := f.getPivotTableFieldsName(opts.Data)
478-
dataFieldsNumFmtID := f.getPivotTableFieldsNumFmtID(opts.Data)
479-
for idx, dataField := range dataFieldsIndex {
480+
for idx, field := range dataFieldsIndex {
481+
data := opts.Data[idx]
480482
if pt.DataFields == nil {
481483
pt.DataFields = &xlsxDataFields{}
482484
}
483-
pt.DataFields.DataField = append(pt.DataFields.DataField, &xlsxDataField{
485+
dataField := &xlsxDataField{
484486
Name: dataFieldsName[idx],
485-
Fld: dataField,
487+
Fld: field,
486488
Subtotal: dataFieldsSubtotals[idx],
487-
NumFmtID: dataFieldsNumFmtID[idx],
488-
})
489+
}
490+
if data.ShowDataAs != "" {
491+
dataField.ShowDataAs = data.ShowDataAs
492+
}
493+
if data.BaseField != "" {
494+
baseField, err := f.getPivotFieldIndex(data.BaseField, opts)
495+
if err != nil {
496+
return err
497+
}
498+
dataField.BaseField = baseField
499+
}
500+
pt.DataFields.DataField = append(pt.DataFields.DataField, dataField)
489501
}
490502

491503
// count data fields
@@ -690,6 +702,19 @@ func (f *File) getPivotFieldsIndex(fields []PivotTableField, opts *PivotTableOpt
690702
return pivotFieldsIndex, nil
691703
}
692704

705+
// getPivotFieldIndex returns the index of pivot field by given pivot option.
706+
func (f *File) getPivotFieldIndex(fieldName string, opts *PivotTableOptions) (int, error) {
707+
var pivotFieldIndex int
708+
orders, err := f.getTableFieldsOrder(opts)
709+
if err != nil {
710+
return pivotFieldIndex, err
711+
}
712+
if pos := inStrSlice(orders, fieldName, true); pos != -1 {
713+
pivotFieldIndex = pos
714+
}
715+
return pivotFieldIndex, nil
716+
}
717+
693718
// getPivotTableFieldsSubtotal prepare fields subtotal by given pivot table fields.
694719
func (f *File) getPivotTableFieldsSubtotal(fields []PivotTableField) []string {
695720
field := make([]string, len(fields))

0 commit comments

Comments
 (0)