sheet_test.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  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. fmt.Println(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. fmt.Println(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. fmt.Println(err)
  39. }
  40. if err := f.GetPageLayout("Sheet1", &paperSize); err != nil {
  41. fmt.Println(err)
  42. }
  43. if err := f.GetPageLayout("Sheet1", &fitToHeight); err != nil {
  44. fmt.Println(err)
  45. }
  46. if err := f.GetPageLayout("Sheet1", &fitToWidth); err != nil {
  47. fmt.Println(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 TestNewSheet(t *testing.T) {
  62. f := excelize.NewFile()
  63. sheetID := f.NewSheet("Sheet2")
  64. f.SetActiveSheet(sheetID)
  65. // delete original sheet
  66. f.DeleteSheet(f.GetSheetName(f.GetSheetIndex("Sheet1")))
  67. assert.NoError(t, f.SaveAs(filepath.Join("test", "TestNewSheet.xlsx")))
  68. }
  69. func TestSetPane(t *testing.T) {
  70. f := excelize.NewFile()
  71. assert.NoError(t, f.SetPanes("Sheet1", `{"freeze":false,"split":false}`))
  72. f.NewSheet("Panes 2")
  73. assert.NoError(t, f.SetPanes("Panes 2", `{"freeze":true,"split":false,"x_split":1,"y_split":0,"top_left_cell":"B1","active_pane":"topRight","panes":[{"sqref":"K16","active_cell":"K16","pane":"topRight"}]}`))
  74. f.NewSheet("Panes 3")
  75. assert.NoError(t, f.SetPanes("Panes 3", `{"freeze":false,"split":true,"x_split":3270,"y_split":1800,"top_left_cell":"N57","active_pane":"bottomLeft","panes":[{"sqref":"I36","active_cell":"I36"},{"sqref":"G33","active_cell":"G33","pane":"topRight"},{"sqref":"J60","active_cell":"J60","pane":"bottomLeft"},{"sqref":"O60","active_cell":"O60","pane":"bottomRight"}]}`))
  76. f.NewSheet("Panes 4")
  77. assert.NoError(t, f.SetPanes("Panes 4", `{"freeze":true,"split":false,"x_split":0,"y_split":9,"top_left_cell":"A34","active_pane":"bottomLeft","panes":[{"sqref":"A11:XFD11","active_cell":"A11","pane":"bottomLeft"}]}`))
  78. assert.NoError(t, f.SetPanes("Panes 4", ""))
  79. assert.EqualError(t, f.SetPanes("SheetN", ""), "sheet SheetN is not exist")
  80. assert.NoError(t, f.SaveAs(filepath.Join("test", "TestSetPane.xlsx")))
  81. }
  82. func TestPageLayoutOption(t *testing.T) {
  83. const sheet = "Sheet1"
  84. testData := []struct {
  85. container excelize.PageLayoutOptionPtr
  86. nonDefault excelize.PageLayoutOption
  87. }{
  88. {new(excelize.PageLayoutOrientation), excelize.PageLayoutOrientation(excelize.OrientationLandscape)},
  89. {new(excelize.PageLayoutPaperSize), excelize.PageLayoutPaperSize(10)},
  90. {new(excelize.FitToHeight), excelize.FitToHeight(2)},
  91. {new(excelize.FitToWidth), excelize.FitToWidth(2)},
  92. }
  93. for i, test := range testData {
  94. t.Run(fmt.Sprintf("TestData%d", i), func(t *testing.T) {
  95. opt := test.nonDefault
  96. t.Logf("option %T", opt)
  97. def := deepcopy.Copy(test.container).(excelize.PageLayoutOptionPtr)
  98. val1 := deepcopy.Copy(def).(excelize.PageLayoutOptionPtr)
  99. val2 := deepcopy.Copy(def).(excelize.PageLayoutOptionPtr)
  100. f := excelize.NewFile()
  101. // Get the default value
  102. assert.NoError(t, f.GetPageLayout(sheet, def), opt)
  103. // Get again and check
  104. assert.NoError(t, f.GetPageLayout(sheet, val1), opt)
  105. if !assert.Equal(t, val1, def, opt) {
  106. t.FailNow()
  107. }
  108. // Set the same value
  109. assert.NoError(t, f.SetPageLayout(sheet, val1), opt)
  110. // Get again and check
  111. assert.NoError(t, f.GetPageLayout(sheet, val1), opt)
  112. if !assert.Equal(t, val1, def, "%T: value should not have changed", opt) {
  113. t.FailNow()
  114. }
  115. // Set a different value
  116. assert.NoError(t, f.SetPageLayout(sheet, test.nonDefault), opt)
  117. assert.NoError(t, f.GetPageLayout(sheet, val1), opt)
  118. // Get again and compare
  119. assert.NoError(t, f.GetPageLayout(sheet, val2), opt)
  120. if !assert.Equal(t, val1, val2, "%T: value should not have changed", opt) {
  121. t.FailNow()
  122. }
  123. // Value should not be the same as the default
  124. if !assert.NotEqual(t, def, val1, "%T: value should have changed from default", opt) {
  125. t.FailNow()
  126. }
  127. // Restore the default value
  128. assert.NoError(t, f.SetPageLayout(sheet, def), opt)
  129. assert.NoError(t, f.GetPageLayout(sheet, val1), opt)
  130. if !assert.Equal(t, def, val1) {
  131. t.FailNow()
  132. }
  133. })
  134. }
  135. }
  136. func TestSearchSheet(t *testing.T) {
  137. f, err := excelize.OpenFile(filepath.Join("test", "SharedStrings.xlsx"))
  138. if !assert.NoError(t, err) {
  139. t.FailNow()
  140. }
  141. // Test search in a not exists worksheet.
  142. _, err = f.SearchSheet("Sheet4", "")
  143. assert.EqualError(t, err, "sheet Sheet4 is not exist")
  144. var expected []string
  145. // Test search a not exists value.
  146. result, err := f.SearchSheet("Sheet1", "X")
  147. assert.NoError(t, err)
  148. assert.EqualValues(t, expected, result)
  149. result, err = f.SearchSheet("Sheet1", "A")
  150. assert.NoError(t, err)
  151. assert.EqualValues(t, []string{"A1"}, result)
  152. // Test search the coordinates where the numerical value in the range of
  153. // "0-9" of Sheet1 is described by regular expression:
  154. result, err = f.SearchSheet("Sheet1", "[0-9]", true)
  155. assert.NoError(t, err)
  156. assert.EqualValues(t, expected, result)
  157. // Test search worksheet data after set cell value
  158. f = excelize.NewFile()
  159. assert.NoError(t, f.SetCellValue("Sheet1", "A1", true))
  160. _, err = f.SearchSheet("Sheet1", "")
  161. assert.NoError(t, err)
  162. }
  163. func TestSetPageLayout(t *testing.T) {
  164. f := excelize.NewFile()
  165. // Test set page layout on not exists worksheet.
  166. assert.EqualError(t, f.SetPageLayout("SheetN"), "sheet SheetN is not exist")
  167. }
  168. func TestGetPageLayout(t *testing.T) {
  169. f := excelize.NewFile()
  170. // Test get page layout on not exists worksheet.
  171. assert.EqualError(t, f.GetPageLayout("SheetN"), "sheet SheetN is not exist")
  172. }
  173. func TestSetHeaderFooter(t *testing.T) {
  174. f := excelize.NewFile()
  175. assert.NoError(t, f.SetCellStr("Sheet1", "A1", "Test SetHeaderFooter"))
  176. // Test set header and footer on not exists worksheet.
  177. assert.EqualError(t, f.SetHeaderFooter("SheetN", nil), "sheet SheetN is not exist")
  178. // Test set header and footer with illegal setting.
  179. assert.EqualError(t, f.SetHeaderFooter("Sheet1", &excelize.FormatHeaderFooter{
  180. OddHeader: strings.Repeat("c", 256),
  181. }), "field OddHeader must be less than 255 characters")
  182. assert.NoError(t, f.SetHeaderFooter("Sheet1", nil))
  183. assert.NoError(t, f.SetHeaderFooter("Sheet1", &excelize.FormatHeaderFooter{
  184. DifferentFirst: true,
  185. DifferentOddEven: true,
  186. OddHeader: "&R&P",
  187. OddFooter: "&C&F",
  188. EvenHeader: "&L&P",
  189. EvenFooter: "&L&D&R&T",
  190. FirstHeader: `&CCenter &"-,Bold"Bold&"-,Regular"HeaderU+000A&D`,
  191. }))
  192. assert.NoError(t, f.SaveAs(filepath.Join("test", "TestSetHeaderFooter.xlsx")))
  193. }
  194. func TestDefinedName(t *testing.T) {
  195. f := excelize.NewFile()
  196. assert.NoError(t, f.SetDefinedName(&excelize.DefinedName{
  197. Name: "Amount",
  198. RefersTo: "Sheet1!$A$2:$D$5",
  199. Comment: "defined name comment",
  200. Scope: "Sheet1",
  201. }))
  202. assert.NoError(t, f.SetDefinedName(&excelize.DefinedName{
  203. Name: "Amount",
  204. RefersTo: "Sheet1!$A$2:$D$5",
  205. Comment: "defined name comment",
  206. }))
  207. assert.EqualError(t, f.SetDefinedName(&excelize.DefinedName{
  208. Name: "Amount",
  209. RefersTo: "Sheet1!$A$2:$D$5",
  210. Comment: "defined name comment",
  211. }), "the same name already exists on the scope")
  212. assert.EqualError(t, f.DeleteDefinedName(&excelize.DefinedName{
  213. Name: "No Exist Defined Name",
  214. }), "no defined name on the scope")
  215. assert.Exactly(t, "Sheet1!$A$2:$D$5", f.GetDefinedName()[1].RefersTo)
  216. assert.NoError(t, f.DeleteDefinedName(&excelize.DefinedName{
  217. Name: "Amount",
  218. }))
  219. assert.Exactly(t, "Sheet1!$A$2:$D$5", f.GetDefinedName()[0].RefersTo)
  220. assert.Exactly(t, 1, len(f.GetDefinedName()))
  221. assert.NoError(t, f.SaveAs(filepath.Join("test", "TestDefinedName.xlsx")))
  222. }
  223. func TestGroupSheets(t *testing.T) {
  224. f := excelize.NewFile()
  225. sheets := []string{"Sheet2", "Sheet3"}
  226. for _, sheet := range sheets {
  227. f.NewSheet(sheet)
  228. }
  229. assert.EqualError(t, f.GroupSheets([]string{"Sheet1", "SheetN"}), "sheet SheetN is not exist")
  230. assert.EqualError(t, f.GroupSheets([]string{"Sheet2", "Sheet3"}), "group worksheet must contain an active worksheet")
  231. assert.NoError(t, f.GroupSheets([]string{"Sheet1", "Sheet2"}))
  232. assert.NoError(t, f.SaveAs(filepath.Join("test", "TestGroupSheets.xlsx")))
  233. }
  234. func TestUngroupSheets(t *testing.T) {
  235. f := excelize.NewFile()
  236. sheets := []string{"Sheet2", "Sheet3", "Sheet4", "Sheet5"}
  237. for _, sheet := range sheets {
  238. f.NewSheet(sheet)
  239. }
  240. assert.NoError(t, f.UngroupSheets())
  241. }
  242. func TestInsertPageBreak(t *testing.T) {
  243. f := excelize.NewFile()
  244. assert.NoError(t, f.InsertPageBreak("Sheet1", "A1"))
  245. assert.NoError(t, f.InsertPageBreak("Sheet1", "B2"))
  246. assert.NoError(t, f.InsertPageBreak("Sheet1", "C3"))
  247. assert.NoError(t, f.InsertPageBreak("Sheet1", "C3"))
  248. assert.EqualError(t, f.InsertPageBreak("Sheet1", "A"), `cannot convert cell "A" to coordinates: invalid cell name "A"`)
  249. assert.EqualError(t, f.InsertPageBreak("SheetN", "C3"), "sheet SheetN is not exist")
  250. assert.NoError(t, f.SaveAs(filepath.Join("test", "TestInsertPageBreak.xlsx")))
  251. }
  252. func TestRemovePageBreak(t *testing.T) {
  253. f := excelize.NewFile()
  254. assert.NoError(t, f.RemovePageBreak("Sheet1", "A2"))
  255. assert.NoError(t, f.InsertPageBreak("Sheet1", "A2"))
  256. assert.NoError(t, f.InsertPageBreak("Sheet1", "B2"))
  257. assert.NoError(t, f.RemovePageBreak("Sheet1", "A1"))
  258. assert.NoError(t, f.RemovePageBreak("Sheet1", "B2"))
  259. assert.NoError(t, f.InsertPageBreak("Sheet1", "C3"))
  260. assert.NoError(t, f.RemovePageBreak("Sheet1", "C3"))
  261. assert.NoError(t, f.InsertPageBreak("Sheet1", "A3"))
  262. assert.NoError(t, f.RemovePageBreak("Sheet1", "B3"))
  263. assert.NoError(t, f.RemovePageBreak("Sheet1", "A3"))
  264. f.NewSheet("Sheet2")
  265. assert.NoError(t, f.InsertPageBreak("Sheet2", "B2"))
  266. assert.NoError(t, f.InsertPageBreak("Sheet2", "C2"))
  267. assert.NoError(t, f.RemovePageBreak("Sheet2", "B2"))
  268. assert.EqualError(t, f.RemovePageBreak("Sheet1", "A"), `cannot convert cell "A" to coordinates: invalid cell name "A"`)
  269. assert.EqualError(t, f.RemovePageBreak("SheetN", "C3"), "sheet SheetN is not exist")
  270. assert.NoError(t, f.SaveAs(filepath.Join("test", "TestRemovePageBreak.xlsx")))
  271. }
  272. func TestGetSheetName(t *testing.T) {
  273. f, _ := excelize.OpenFile(filepath.Join("test", "Book1.xlsx"))
  274. assert.Equal(t, "Sheet1", f.GetSheetName(1))
  275. assert.Equal(t, "Sheet2", f.GetSheetName(2))
  276. assert.Equal(t, "", f.GetSheetName(0))
  277. assert.Equal(t, "", f.GetSheetName(3))
  278. }
  279. func TestGetSheetMap(t *testing.T) {
  280. expectedMap := map[int]string{
  281. 1: "Sheet1",
  282. 2: "Sheet2",
  283. }
  284. f, _ := excelize.OpenFile(filepath.Join("test", "Book1.xlsx"))
  285. sheetMap := f.GetSheetMap()
  286. for idx, name := range sheetMap {
  287. assert.Equal(t, expectedMap[idx], name)
  288. }
  289. assert.Equal(t, len(sheetMap), 2)
  290. }