@@ -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.
694719func (f * File ) getPivotTableFieldsSubtotal (fields []PivotTableField ) []string {
695720 field := make ([]string , len (fields ))
0 commit comments