pivotTable_test.go 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. package excelize
  2. import (
  3. "fmt"
  4. "math/rand"
  5. "path/filepath"
  6. "testing"
  7. "github.com/stretchr/testify/assert"
  8. )
  9. func TestAddPivotTable(t *testing.T) {
  10. f := NewFile()
  11. // Create some data in a sheet
  12. month := []string{"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}
  13. year := []int{2017, 2018, 2019}
  14. types := []string{"Meat", "Dairy", "Beverages", "Produce"}
  15. region := []string{"East", "West", "North", "South"}
  16. assert.NoError(t, f.SetSheetRow("Sheet1", "A1", &[]string{"Month", "Year", "Type", "Sales", "Region"}))
  17. for i := 0; i < 30; i++ {
  18. assert.NoError(t, f.SetCellValue("Sheet1", fmt.Sprintf("A%d", i+2), month[rand.Intn(12)]))
  19. assert.NoError(t, f.SetCellValue("Sheet1", fmt.Sprintf("B%d", i+2), year[rand.Intn(3)]))
  20. assert.NoError(t, f.SetCellValue("Sheet1", fmt.Sprintf("C%d", i+2), types[rand.Intn(4)]))
  21. assert.NoError(t, f.SetCellValue("Sheet1", fmt.Sprintf("D%d", i+2), rand.Intn(5000)))
  22. assert.NoError(t, f.SetCellValue("Sheet1", fmt.Sprintf("E%d", i+2), region[rand.Intn(4)]))
  23. }
  24. assert.NoError(t, f.AddPivotTable(&PivotTableOption{
  25. DataRange: "Sheet1!$A$1:$E$31",
  26. PivotTableRange: "Sheet1!$G$2:$M$34",
  27. Rows: []string{"Month", "Year"},
  28. Columns: []string{"Type"},
  29. Data: []string{"Sales"},
  30. }))
  31. // Use different order of coordinate tests
  32. assert.NoError(t, f.AddPivotTable(&PivotTableOption{
  33. DataRange: "Sheet1!$A$1:$E$31",
  34. PivotTableRange: "Sheet1!$U$34:$O$2",
  35. Rows: []string{"Month", "Year"},
  36. Columns: []string{"Type"},
  37. Data: []string{"Sales"},
  38. }))
  39. assert.NoError(t, f.AddPivotTable(&PivotTableOption{
  40. DataRange: "Sheet1!$A$1:$E$31",
  41. PivotTableRange: "Sheet1!$W$2:$AC$34",
  42. Rows: []string{"Month", "Year"},
  43. Columns: []string{"Region"},
  44. Data: []string{"Sales"},
  45. }))
  46. assert.NoError(t, f.AddPivotTable(&PivotTableOption{
  47. DataRange: "Sheet1!$A$1:$E$31",
  48. PivotTableRange: "Sheet1!$G$37:$W$50",
  49. Rows: []string{"Month"},
  50. Columns: []string{"Region", "Year"},
  51. Data: []string{"Sales"},
  52. }))
  53. assert.NoError(t, f.AddPivotTable(&PivotTableOption{
  54. DataRange: "Sheet1!$A$1:$E$31",
  55. PivotTableRange: "Sheet1!$AE$2:$AG$33",
  56. Rows: []string{"Month", "Year"},
  57. Data: []string{"Sales"},
  58. }))
  59. f.NewSheet("Sheet2")
  60. assert.NoError(t, f.AddPivotTable(&PivotTableOption{
  61. DataRange: "Sheet1!$A$1:$E$31",
  62. PivotTableRange: "Sheet2!$A$1:$AR$15",
  63. Rows: []string{"Month"},
  64. Columns: []string{"Region", "Type", "Year"},
  65. Data: []string{"Sales"},
  66. }))
  67. assert.NoError(t, f.AddPivotTable(&PivotTableOption{
  68. DataRange: "Sheet1!$A$1:$E$31",
  69. PivotTableRange: "Sheet2!$A$18:$AR$54",
  70. Rows: []string{"Month", "Type"},
  71. Columns: []string{"Region", "Year"},
  72. Data: []string{"Sales"},
  73. }))
  74. // Test empty pivot table options
  75. assert.EqualError(t, f.AddPivotTable(nil), "parameter is required")
  76. // Test invalid data range
  77. assert.EqualError(t, f.AddPivotTable(&PivotTableOption{
  78. DataRange: "Sheet1!$A$1:$A$1",
  79. PivotTableRange: "Sheet1!$U$34:$O$2",
  80. Rows: []string{"Month", "Year"},
  81. Columns: []string{"Type"},
  82. Data: []string{"Sales"},
  83. }), `parameter 'DataRange' parsing error: parameter is invalid`)
  84. // Test the data range of the worksheet that is not declared
  85. assert.EqualError(t, f.AddPivotTable(&PivotTableOption{
  86. DataRange: "$A$1:$E$31",
  87. PivotTableRange: "Sheet1!$U$34:$O$2",
  88. Rows: []string{"Month", "Year"},
  89. Columns: []string{"Type"},
  90. Data: []string{"Sales"},
  91. }), `parameter 'DataRange' parsing error: parameter is invalid`)
  92. // Test the worksheet declared in the data range does not exist
  93. assert.EqualError(t, f.AddPivotTable(&PivotTableOption{
  94. DataRange: "SheetN!$A$1:$E$31",
  95. PivotTableRange: "Sheet1!$U$34:$O$2",
  96. Rows: []string{"Month", "Year"},
  97. Columns: []string{"Type"},
  98. Data: []string{"Sales"},
  99. }), "sheet SheetN is not exist")
  100. // Test the pivot table range of the worksheet that is not declared
  101. assert.EqualError(t, f.AddPivotTable(&PivotTableOption{
  102. DataRange: "Sheet1!$A$1:$E$31",
  103. PivotTableRange: "$U$34:$O$2",
  104. Rows: []string{"Month", "Year"},
  105. Columns: []string{"Type"},
  106. Data: []string{"Sales"},
  107. }), `parameter 'PivotTableRange' parsing error: parameter is invalid`)
  108. // Test the worksheet declared in the pivot table range does not exist
  109. assert.EqualError(t, f.AddPivotTable(&PivotTableOption{
  110. DataRange: "Sheet1!$A$1:$E$31",
  111. PivotTableRange: "SheetN!$U$34:$O$2",
  112. Rows: []string{"Month", "Year"},
  113. Columns: []string{"Type"},
  114. Data: []string{"Sales"},
  115. }), "sheet SheetN is not exist")
  116. // Test not exists worksheet in data range
  117. assert.EqualError(t, f.AddPivotTable(&PivotTableOption{
  118. DataRange: "SheetN!$A$1:$E$31",
  119. PivotTableRange: "Sheet1!$U$34:$O$2",
  120. Rows: []string{"Month", "Year"},
  121. Columns: []string{"Type"},
  122. Data: []string{"Sales"},
  123. }), "sheet SheetN is not exist")
  124. // Test invalid row number in data range
  125. assert.EqualError(t, f.AddPivotTable(&PivotTableOption{
  126. DataRange: "Sheet1!$A$0:$E$31",
  127. PivotTableRange: "Sheet1!$U$34:$O$2",
  128. Rows: []string{"Month", "Year"},
  129. Columns: []string{"Type"},
  130. Data: []string{"Sales"},
  131. }), `parameter 'DataRange' parsing error: cannot convert cell "A0" to coordinates: invalid cell name "A0"`)
  132. assert.NoError(t, f.SaveAs(filepath.Join("test", "TestAddPivotTable1.xlsx")))
  133. // Test adjust range with invalid range
  134. _, _, err := f.adjustRange("")
  135. assert.EqualError(t, err, "parameter is required")
  136. // Test get pivot fields order with empty data range
  137. _, err = f.getPivotFieldsOrder("")
  138. assert.EqualError(t, err, `parameter 'DataRange' parsing error: parameter is required`)
  139. // Test add pivot cache with empty data range
  140. assert.EqualError(t, f.addPivotCache(0, "", &PivotTableOption{}, nil), "parameter 'DataRange' parsing error: parameter is required")
  141. // Test add pivot cache with invalid data range
  142. assert.EqualError(t, f.addPivotCache(0, "", &PivotTableOption{
  143. DataRange: "$A$1:$E$31",
  144. PivotTableRange: "Sheet1!$U$34:$O$2",
  145. Rows: []string{"Month", "Year"},
  146. Columns: []string{"Type"},
  147. Data: []string{"Sales"},
  148. }, nil), "parameter 'DataRange' parsing error: parameter is invalid")
  149. // Test add pivot table with empty options
  150. assert.EqualError(t, f.addPivotTable(0, 0, "", &PivotTableOption{}), "parameter 'PivotTableRange' parsing error: parameter is required")
  151. // Test add pivot table with invalid data range
  152. assert.EqualError(t, f.addPivotTable(0, 0, "", &PivotTableOption{}), "parameter 'PivotTableRange' parsing error: parameter is required")
  153. // Test add pivot fields with empty data range
  154. assert.EqualError(t, f.addPivotFields(nil, &PivotTableOption{
  155. DataRange: "$A$1:$E$31",
  156. PivotTableRange: "Sheet1!$U$34:$O$2",
  157. Rows: []string{"Month", "Year"},
  158. Columns: []string{"Type"},
  159. Data: []string{"Sales"},
  160. }), `parameter 'DataRange' parsing error: parameter is invalid`)
  161. // Test get pivot fields index with empty data range
  162. _, err = f.getPivotFieldsIndex([]string{}, &PivotTableOption{})
  163. assert.EqualError(t, err, `parameter 'DataRange' parsing error: parameter is required`)
  164. }