Skip to content

Commit 9c27836

Browse files
committed
This closes qax-os#1945, an error will be return if column header cell is empty in pivot table data range
- Update unit tests
1 parent 307e533 commit 9c27836

File tree

2 files changed

+27
-2
lines changed

2 files changed

+27
-2
lines changed

pivotTable.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,9 @@ func (f *File) getTableFieldsOrder(opts *PivotTableOptions) ([]string, error) {
260260
if err != nil {
261261
return order, err
262262
}
263+
if name == "" {
264+
return order, ErrParameterInvalid
265+
}
263266
order = append(order, name)
264267
}
265268
return order, nil
@@ -272,8 +275,10 @@ func (f *File) addPivotCache(opts *PivotTableOptions) error {
272275
if err != nil {
273276
return newPivotTableDataRangeError(err.Error())
274277
}
275-
// data range has been checked
276-
order, _ := f.getTableFieldsOrder(opts)
278+
order, err := f.getTableFieldsOrder(opts)
279+
if err != nil {
280+
return newPivotTableDataRangeError(err.Error())
281+
}
277282
topLeftCell, _ := CoordinatesToCellName(coordinates[0], coordinates[1])
278283
bottomRightCell, _ := CoordinatesToCellName(coordinates[2], coordinates[3])
279284
pc := xlsxPivotCacheDefinition{

pivotTable_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,7 @@ func TestPivotTable(t *testing.T) {
300300
assert.EqualError(t, err, `parameter 'DataRange' parsing error: parameter is required`)
301301
// Test add pivot table with unsupported charset content types.
302302
f = NewFile()
303+
assert.NoError(t, f.SetSheetRow("Sheet1", "A1", &[]string{"Month", "Year", "Type", "Sales", "Region"}))
303304
f.ContentTypes = nil
304305
f.Pkg.Store(defaultXMLPathContentTypes, MacintoshCyrillicCharset)
305306
assert.EqualError(t, f.AddPivotTable(&PivotTableOptions{
@@ -393,6 +394,25 @@ func TestPivotTableDataRange(t *testing.T) {
393394
f.Relationships.Delete("xl/worksheets/_rels/sheet1.xml.rels")
394395
f.Pkg.Delete("xl/worksheets/_rels/sheet1.xml.rels")
395396
assert.EqualError(t, f.DeletePivotTable("Sheet1", "PivotTable1"), "table PivotTable1 does not exist")
397+
398+
t.Run("data_range_with_empty_column", func(t *testing.T) {
399+
// Test add pivot table with data range doesn't organized as a list with labeled columns
400+
f := NewFile()
401+
// Create some data in a sheet
402+
month := []string{"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}
403+
types := []string{"Meat", "Dairy", "Beverages", "Produce"}
404+
assert.NoError(t, f.SetSheetRow("Sheet1", "A1", &[]string{"Month", "", "Type"}))
405+
for row := 2; row < 32; row++ {
406+
assert.NoError(t, f.SetCellValue("Sheet1", fmt.Sprintf("A%d", row), month[rand.Intn(12)]))
407+
assert.NoError(t, f.SetCellValue("Sheet1", fmt.Sprintf("C%d", row), types[rand.Intn(4)]))
408+
}
409+
assert.Equal(t, newPivotTableDataRangeError("parameter is invalid"), f.AddPivotTable(&PivotTableOptions{
410+
DataRange: "Sheet1!A1:E31",
411+
PivotTableRange: "Sheet1!G2:M34",
412+
Rows: []PivotTableField{{Data: "Month", DefaultSubtotal: true}},
413+
Data: []PivotTableField{{Data: "Type"}},
414+
}))
415+
})
396416
}
397417

398418
func TestParseFormatPivotTableSet(t *testing.T) {

0 commit comments

Comments
 (0)