pivotTable_test.go 8.2 KB

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