pivotTable_test.go 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  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: []PivotTableField{{Data: "Month"}, {Data: "Year"}},
  29. Columns: []PivotTableField{{Data: "Type"}},
  30. Data: []PivotTableField{{Data: "Sales", Subtotal: "Sum", Name: "Summarize by Sum"}},
  31. }))
  32. // Use different order of coordinate tests
  33. assert.NoError(t, f.AddPivotTable(&PivotTableOption{
  34. DataRange: "Sheet1!$A$1:$E$31",
  35. PivotTableRange: "Sheet1!$U$34:$O$2",
  36. Rows: []PivotTableField{{Data: "Month"}, {Data: "Year"}},
  37. Columns: []PivotTableField{{Data: "Type"}},
  38. Data: []PivotTableField{{Data: "Sales", Subtotal: "Average", Name: "Summarize by Average"}},
  39. }))
  40. assert.NoError(t, f.AddPivotTable(&PivotTableOption{
  41. DataRange: "Sheet1!$A$1:$E$31",
  42. PivotTableRange: "Sheet1!$W$2:$AC$34",
  43. Rows: []PivotTableField{{Data: "Month"}, {Data: "Year"}},
  44. Columns: []PivotTableField{{Data: "Region"}},
  45. Data: []PivotTableField{{Data: "Sales", Subtotal: "Count", Name: "Summarize by Count"}},
  46. }))
  47. assert.NoError(t, f.AddPivotTable(&PivotTableOption{
  48. DataRange: "Sheet1!$A$1:$E$31",
  49. PivotTableRange: "Sheet1!$G$37:$W$50",
  50. Rows: []PivotTableField{{Data: "Month"}},
  51. Columns: []PivotTableField{{Data: "Region"}, {Data: "Year"}},
  52. Data: []PivotTableField{{Data: "Sales", Subtotal: "CountNums", Name: "Summarize by CountNums"}},
  53. }))
  54. assert.NoError(t, f.AddPivotTable(&PivotTableOption{
  55. DataRange: "Sheet1!$A$1:$E$31",
  56. PivotTableRange: "Sheet1!$AE$2:$AG$33",
  57. Rows: []PivotTableField{{Data: "Month"}, {Data: "Year"}},
  58. Data: []PivotTableField{{Data: "Sales", Subtotal: "Max", Name: "Summarize by Max"}},
  59. }))
  60. f.NewSheet("Sheet2")
  61. assert.NoError(t, f.AddPivotTable(&PivotTableOption{
  62. DataRange: "Sheet1!$A$1:$E$31",
  63. PivotTableRange: "Sheet2!$A$1:$AR$15",
  64. Rows: []PivotTableField{{Data: "Month"}},
  65. Columns: []PivotTableField{{Data: "Region"}, {Data: "Type"}, {Data: "Year"}},
  66. Data: []PivotTableField{{Data: "Sales", Subtotal: "Min", Name: "Summarize by Min"}},
  67. }))
  68. assert.NoError(t, f.AddPivotTable(&PivotTableOption{
  69. DataRange: "Sheet1!$A$1:$E$31",
  70. PivotTableRange: "Sheet2!$A$18:$AR$54",
  71. Rows: []PivotTableField{{Data: "Month"}, {Data: "Type"}},
  72. Columns: []PivotTableField{{Data: "Region"}, {Data: "Year"}},
  73. Data: []PivotTableField{{Data: "Sales", Subtotal: "Product", Name: "Summarize by Product"}},
  74. }))
  75. // Test empty pivot table options
  76. assert.EqualError(t, f.AddPivotTable(nil), "parameter is required")
  77. // Test invalid data range
  78. assert.EqualError(t, f.AddPivotTable(&PivotTableOption{
  79. DataRange: "Sheet1!$A$1:$A$1",
  80. PivotTableRange: "Sheet1!$U$34:$O$2",
  81. Rows: []PivotTableField{{Data: "Month"}, {Data: "Year"}},
  82. Columns: []PivotTableField{{Data: "Type"}},
  83. Data: []PivotTableField{{Data: "Sales"}},
  84. }), `parameter 'DataRange' parsing error: parameter is invalid`)
  85. // Test the data range of the worksheet that is not declared
  86. assert.EqualError(t, f.AddPivotTable(&PivotTableOption{
  87. DataRange: "$A$1:$E$31",
  88. PivotTableRange: "Sheet1!$U$34:$O$2",
  89. Rows: []PivotTableField{{Data: "Month"}, {Data: "Year"}},
  90. Columns: []PivotTableField{{Data: "Type"}},
  91. Data: []PivotTableField{{Data: "Sales"}},
  92. }), `parameter 'DataRange' parsing error: parameter is invalid`)
  93. // Test the worksheet declared in the data range does not exist
  94. assert.EqualError(t, f.AddPivotTable(&PivotTableOption{
  95. DataRange: "SheetN!$A$1:$E$31",
  96. PivotTableRange: "Sheet1!$U$34:$O$2",
  97. Rows: []PivotTableField{{Data: "Month"}, {Data: "Year"}},
  98. Columns: []PivotTableField{{Data: "Type"}},
  99. Data: []PivotTableField{{Data: "Sales"}},
  100. }), "sheet SheetN is not exist")
  101. // Test the pivot table range of the worksheet that is not declared
  102. assert.EqualError(t, f.AddPivotTable(&PivotTableOption{
  103. DataRange: "Sheet1!$A$1:$E$31",
  104. PivotTableRange: "$U$34:$O$2",
  105. Rows: []PivotTableField{{Data: "Month"}, {Data: "Year"}},
  106. Columns: []PivotTableField{{Data: "Type"}},
  107. Data: []PivotTableField{{Data: "Sales"}},
  108. }), `parameter 'PivotTableRange' parsing error: parameter is invalid`)
  109. // Test the worksheet declared in the pivot table range does not exist
  110. assert.EqualError(t, f.AddPivotTable(&PivotTableOption{
  111. DataRange: "Sheet1!$A$1:$E$31",
  112. PivotTableRange: "SheetN!$U$34:$O$2",
  113. Rows: []PivotTableField{{Data: "Month"}, {Data: "Year"}},
  114. Columns: []PivotTableField{{Data: "Type"}},
  115. Data: []PivotTableField{{Data: "Sales"}},
  116. }), "sheet SheetN is not exist")
  117. // Test not exists worksheet in data range
  118. assert.EqualError(t, f.AddPivotTable(&PivotTableOption{
  119. DataRange: "SheetN!$A$1:$E$31",
  120. PivotTableRange: "Sheet1!$U$34:$O$2",
  121. Rows: []PivotTableField{{Data: "Month"}, {Data: "Year"}},
  122. Columns: []PivotTableField{{Data: "Type"}},
  123. Data: []PivotTableField{{Data: "Sales"}},
  124. }), "sheet SheetN is not exist")
  125. // Test invalid row number in data range
  126. assert.EqualError(t, f.AddPivotTable(&PivotTableOption{
  127. DataRange: "Sheet1!$A$0:$E$31",
  128. PivotTableRange: "Sheet1!$U$34:$O$2",
  129. Rows: []PivotTableField{{Data: "Month"}, {Data: "Year"}},
  130. Columns: []PivotTableField{{Data: "Type"}},
  131. Data: []PivotTableField{{Data: "Sales"}},
  132. }), `parameter 'DataRange' parsing error: cannot convert cell "A0" to coordinates: invalid cell name "A0"`)
  133. assert.NoError(t, f.SaveAs(filepath.Join("test", "TestAddPivotTable1.xlsx")))
  134. // Test with field names that exceed the length limit and invalid subtotal
  135. assert.NoError(t, f.AddPivotTable(&PivotTableOption{
  136. DataRange: "Sheet1!$A$1:$E$31",
  137. PivotTableRange: "Sheet1!$G$2:$M$34",
  138. Rows: []PivotTableField{{Data: "Month"}, {Data: "Year"}},
  139. Columns: []PivotTableField{{Data: "Type"}},
  140. Data: []PivotTableField{{Data: "Sales", Subtotal: "-", Name: strings.Repeat("s", 256)}},
  141. }))
  142. // Test adjust range with invalid range
  143. _, _, err := f.adjustRange("")
  144. assert.EqualError(t, err, "parameter is required")
  145. // Test get pivot fields order with empty data range
  146. _, err = f.getPivotFieldsOrder("")
  147. assert.EqualError(t, err, `parameter 'DataRange' parsing error: parameter is required`)
  148. // Test add pivot cache with empty data range
  149. assert.EqualError(t, f.addPivotCache(0, "", &PivotTableOption{}, nil), "parameter 'DataRange' parsing error: parameter is required")
  150. // Test add pivot cache with invalid data range
  151. assert.EqualError(t, f.addPivotCache(0, "", &PivotTableOption{
  152. DataRange: "$A$1:$E$31",
  153. PivotTableRange: "Sheet1!$U$34:$O$2",
  154. Rows: []PivotTableField{{Data: "Month"}, {Data: "Year"}},
  155. Columns: []PivotTableField{{Data: "Type"}},
  156. Data: []PivotTableField{{Data: "Sales"}},
  157. }, nil), "parameter 'DataRange' parsing error: parameter is invalid")
  158. // Test add pivot table with empty options
  159. assert.EqualError(t, f.addPivotTable(0, 0, "", &PivotTableOption{}), "parameter 'PivotTableRange' parsing error: parameter is required")
  160. // Test add pivot table with invalid data range
  161. assert.EqualError(t, f.addPivotTable(0, 0, "", &PivotTableOption{}), "parameter 'PivotTableRange' parsing error: parameter is required")
  162. // Test add pivot fields with empty data range
  163. assert.EqualError(t, f.addPivotFields(nil, &PivotTableOption{
  164. DataRange: "$A$1:$E$31",
  165. PivotTableRange: "Sheet1!$U$34:$O$2",
  166. Rows: []PivotTableField{{Data: "Month"}, {Data: "Year"}},
  167. Columns: []PivotTableField{{Data: "Type"}},
  168. Data: []PivotTableField{{Data: "Sales"}},
  169. }), `parameter 'DataRange' parsing error: parameter is invalid`)
  170. // Test get pivot fields index with empty data range
  171. _, err = f.getPivotFieldsIndex([]PivotTableField{}, &PivotTableOption{})
  172. assert.EqualError(t, err, `parameter 'DataRange' parsing error: parameter is required`)
  173. }
  174. func TestInStrSlice(t *testing.T) {
  175. assert.EqualValues(t, -1, inStrSlice([]string{}, ""))
  176. }
  177. func TestGetPivotTableFieldName(t *testing.T) {
  178. f := NewFile()
  179. f.getPivotTableFieldName("-", []PivotTableField{})
  180. }