sheet_test.go 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. package excelize_test
  2. import (
  3. "fmt"
  4. "path/filepath"
  5. "strings"
  6. "testing"
  7. "github.com/360EntSecGroup-Skylar/excelize/v2"
  8. "github.com/mohae/deepcopy"
  9. "github.com/stretchr/testify/assert"
  10. )
  11. func ExampleFile_SetPageLayout() {
  12. f := excelize.NewFile()
  13. if err := f.SetPageLayout(
  14. "Sheet1",
  15. excelize.PageLayoutOrientation(excelize.OrientationLandscape),
  16. ); err != nil {
  17. panic(err)
  18. }
  19. if err := f.SetPageLayout(
  20. "Sheet1",
  21. excelize.PageLayoutPaperSize(10),
  22. excelize.FitToHeight(2),
  23. excelize.FitToWidth(2),
  24. ); err != nil {
  25. panic(err)
  26. }
  27. // Output:
  28. }
  29. func ExampleFile_GetPageLayout() {
  30. f := excelize.NewFile()
  31. var (
  32. orientation excelize.PageLayoutOrientation
  33. paperSize excelize.PageLayoutPaperSize
  34. fitToHeight excelize.FitToHeight
  35. fitToWidth excelize.FitToWidth
  36. )
  37. if err := f.GetPageLayout("Sheet1", &orientation); err != nil {
  38. panic(err)
  39. }
  40. if err := f.GetPageLayout("Sheet1", &paperSize); err != nil {
  41. panic(err)
  42. }
  43. if err := f.GetPageLayout("Sheet1", &fitToHeight); err != nil {
  44. panic(err)
  45. }
  46. if err := f.GetPageLayout("Sheet1", &fitToWidth); err != nil {
  47. panic(err)
  48. }
  49. fmt.Println("Defaults:")
  50. fmt.Printf("- orientation: %q\n", orientation)
  51. fmt.Printf("- paper size: %d\n", paperSize)
  52. fmt.Printf("- fit to height: %d\n", fitToHeight)
  53. fmt.Printf("- fit to width: %d\n", fitToWidth)
  54. // Output:
  55. // Defaults:
  56. // - orientation: "portrait"
  57. // - paper size: 1
  58. // - fit to height: 1
  59. // - fit to width: 1
  60. }
  61. func TestPageLayoutOption(t *testing.T) {
  62. const sheet = "Sheet1"
  63. testData := []struct {
  64. container excelize.PageLayoutOptionPtr
  65. nonDefault excelize.PageLayoutOption
  66. }{
  67. {new(excelize.PageLayoutOrientation), excelize.PageLayoutOrientation(excelize.OrientationLandscape)},
  68. {new(excelize.PageLayoutPaperSize), excelize.PageLayoutPaperSize(10)},
  69. {new(excelize.FitToHeight), excelize.FitToHeight(2)},
  70. {new(excelize.FitToWidth), excelize.FitToWidth(2)},
  71. }
  72. for i, test := range testData {
  73. t.Run(fmt.Sprintf("TestData%d", i), func(t *testing.T) {
  74. opt := test.nonDefault
  75. t.Logf("option %T", opt)
  76. def := deepcopy.Copy(test.container).(excelize.PageLayoutOptionPtr)
  77. val1 := deepcopy.Copy(def).(excelize.PageLayoutOptionPtr)
  78. val2 := deepcopy.Copy(def).(excelize.PageLayoutOptionPtr)
  79. f := excelize.NewFile()
  80. // Get the default value
  81. assert.NoError(t, f.GetPageLayout(sheet, def), opt)
  82. // Get again and check
  83. assert.NoError(t, f.GetPageLayout(sheet, val1), opt)
  84. if !assert.Equal(t, val1, def, opt) {
  85. t.FailNow()
  86. }
  87. // Set the same value
  88. assert.NoError(t, f.SetPageLayout(sheet, val1), opt)
  89. // Get again and check
  90. assert.NoError(t, f.GetPageLayout(sheet, val1), opt)
  91. if !assert.Equal(t, val1, def, "%T: value should not have changed", opt) {
  92. t.FailNow()
  93. }
  94. // Set a different value
  95. assert.NoError(t, f.SetPageLayout(sheet, test.nonDefault), opt)
  96. assert.NoError(t, f.GetPageLayout(sheet, val1), opt)
  97. // Get again and compare
  98. assert.NoError(t, f.GetPageLayout(sheet, val2), opt)
  99. if !assert.Equal(t, val1, val2, "%T: value should not have changed", opt) {
  100. t.FailNow()
  101. }
  102. // Value should not be the same as the default
  103. if !assert.NotEqual(t, def, val1, "%T: value should have changed from default", opt) {
  104. t.FailNow()
  105. }
  106. // Restore the default value
  107. assert.NoError(t, f.SetPageLayout(sheet, def), opt)
  108. assert.NoError(t, f.GetPageLayout(sheet, val1), opt)
  109. if !assert.Equal(t, def, val1) {
  110. t.FailNow()
  111. }
  112. })
  113. }
  114. }
  115. func TestSearchSheet(t *testing.T) {
  116. f, err := excelize.OpenFile(filepath.Join("test", "SharedStrings.xlsx"))
  117. if !assert.NoError(t, err) {
  118. t.FailNow()
  119. }
  120. // Test search in a not exists worksheet.
  121. _, err = f.SearchSheet("Sheet4", "")
  122. assert.EqualError(t, err, "sheet Sheet4 is not exist")
  123. var expected []string
  124. // Test search a not exists value.
  125. result, err := f.SearchSheet("Sheet1", "X")
  126. assert.NoError(t, err)
  127. assert.EqualValues(t, expected, result)
  128. result, err = f.SearchSheet("Sheet1", "A")
  129. assert.NoError(t, err)
  130. assert.EqualValues(t, []string{"A1"}, result)
  131. // Test search the coordinates where the numerical value in the range of
  132. // "0-9" of Sheet1 is described by regular expression:
  133. result, err = f.SearchSheet("Sheet1", "[0-9]", true)
  134. assert.NoError(t, err)
  135. assert.EqualValues(t, expected, result)
  136. }
  137. func TestSetPageLayout(t *testing.T) {
  138. f := excelize.NewFile()
  139. // Test set page layout on not exists worksheet.
  140. assert.EqualError(t, f.SetPageLayout("SheetN"), "sheet SheetN is not exist")
  141. }
  142. func TestGetPageLayout(t *testing.T) {
  143. f := excelize.NewFile()
  144. // Test get page layout on not exists worksheet.
  145. assert.EqualError(t, f.GetPageLayout("SheetN"), "sheet SheetN is not exist")
  146. }
  147. func TestSetHeaderFooter(t *testing.T) {
  148. f := excelize.NewFile()
  149. f.SetCellStr("Sheet1", "A1", "Test SetHeaderFooter")
  150. // Test set header and footer on not exists worksheet.
  151. assert.EqualError(t, f.SetHeaderFooter("SheetN", nil), "sheet SheetN is not exist")
  152. // Test set header and footer with illegal setting.
  153. assert.EqualError(t, f.SetHeaderFooter("Sheet1", &excelize.FormatHeaderFooter{
  154. OddHeader: strings.Repeat("c", 256),
  155. }), "field OddHeader must be less than 255 characters")
  156. assert.NoError(t, f.SetHeaderFooter("Sheet1", nil))
  157. assert.NoError(t, f.SetHeaderFooter("Sheet1", &excelize.FormatHeaderFooter{
  158. DifferentFirst: true,
  159. DifferentOddEven: true,
  160. OddHeader: "&R&P",
  161. OddFooter: "&C&F",
  162. EvenHeader: "&L&P",
  163. EvenFooter: "&L&D&R&T",
  164. FirstHeader: `&CCenter &"-,Bold"Bold&"-,Regular"HeaderU+000A&D`,
  165. }))
  166. assert.NoError(t, f.SaveAs(filepath.Join("test", "TestSetHeaderFooter.xlsx")))
  167. }
  168. func TestDefinedName(t *testing.T) {
  169. f := excelize.NewFile()
  170. assert.NoError(t, f.SetDefinedName(&excelize.DefinedName{
  171. Name: "Amount",
  172. RefersTo: "Sheet1!$A$2:$D$5",
  173. Comment: "defined name comment",
  174. Scope: "Sheet1",
  175. }))
  176. assert.NoError(t, f.SetDefinedName(&excelize.DefinedName{
  177. Name: "Amount",
  178. RefersTo: "Sheet1!$A$2:$D$5",
  179. Comment: "defined name comment",
  180. }))
  181. assert.EqualError(t, f.SetDefinedName(&excelize.DefinedName{
  182. Name: "Amount",
  183. RefersTo: "Sheet1!$A$2:$D$5",
  184. Comment: "defined name comment",
  185. }), "the same name already exists on scope")
  186. assert.Exactly(t, "Sheet1!$A$2:$D$5", f.GetDefinedName()[1].RefersTo)
  187. assert.NoError(t, f.SaveAs(filepath.Join("test", "TestDefinedName.xlsx")))
  188. }
  189. func TestGroupSheets(t *testing.T) {
  190. f := excelize.NewFile()
  191. sheets := []string{"Sheet2", "Sheet3"}
  192. for _, sheet := range sheets {
  193. f.NewSheet(sheet)
  194. }
  195. assert.EqualError(t, f.GroupSheets([]string{"Sheet1", "SheetN"}), "sheet SheetN is not exist")
  196. assert.EqualError(t, f.GroupSheets([]string{"Sheet2", "Sheet3"}), "group worksheet must contain an active worksheet")
  197. assert.NoError(t, f.GroupSheets([]string{"Sheet1", "Sheet2"}))
  198. assert.NoError(t, f.SaveAs(filepath.Join("test", "TestGroupSheets.xlsx")))
  199. }
  200. func TestUngroupSheets(t *testing.T) {
  201. f := excelize.NewFile()
  202. sheets := []string{"Sheet2", "Sheet3", "Sheet4", "Sheet5"}
  203. for _, sheet := range sheets {
  204. f.NewSheet(sheet)
  205. }
  206. assert.NoError(t, f.UngroupSheets())
  207. }
  208. func TestGetSheetName(t *testing.T) {
  209. f, _ := excelize.OpenFile(filepath.Join("test", "Book1.xlsx"))
  210. assert.Equal(t, "Sheet1", f.GetSheetName(1))
  211. assert.Equal(t, "Sheet2", f.GetSheetName(2))
  212. assert.Equal(t, "", f.GetSheetName(0))
  213. assert.Equal(t, "", f.GetSheetName(3))
  214. }
  215. func TestGetSheetMap(t *testing.T) {
  216. expectedMap := map[int]string{
  217. 1: "Sheet1",
  218. 2: "Sheet2",
  219. }
  220. f, _ := excelize.OpenFile(filepath.Join("test", "Book1.xlsx"))
  221. sheetMap := f.GetSheetMap()
  222. for idx, name := range sheetMap {
  223. assert.Equal(t, expectedMap[idx], name)
  224. }
  225. assert.Equal(t, len(sheetMap), 2)
  226. }