sheet_test.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. package excelize
  2. import (
  3. "fmt"
  4. "path/filepath"
  5. "strings"
  6. "testing"
  7. "github.com/mohae/deepcopy"
  8. "github.com/stretchr/testify/assert"
  9. )
  10. func ExampleFile_SetPageLayout() {
  11. f := NewFile()
  12. if err := f.SetPageLayout(
  13. "Sheet1",
  14. PageLayoutOrientation(OrientationLandscape),
  15. ); err != nil {
  16. fmt.Println(err)
  17. }
  18. if err := f.SetPageLayout(
  19. "Sheet1",
  20. PageLayoutPaperSize(10),
  21. FitToHeight(2),
  22. FitToWidth(2),
  23. ); err != nil {
  24. fmt.Println(err)
  25. }
  26. // Output:
  27. }
  28. func ExampleFile_GetPageLayout() {
  29. f := NewFile()
  30. var (
  31. orientation PageLayoutOrientation
  32. paperSize PageLayoutPaperSize
  33. fitToHeight FitToHeight
  34. fitToWidth FitToWidth
  35. )
  36. if err := f.GetPageLayout("Sheet1", &orientation); err != nil {
  37. fmt.Println(err)
  38. }
  39. if err := f.GetPageLayout("Sheet1", &paperSize); err != nil {
  40. fmt.Println(err)
  41. }
  42. if err := f.GetPageLayout("Sheet1", &fitToHeight); err != nil {
  43. fmt.Println(err)
  44. }
  45. if err := f.GetPageLayout("Sheet1", &fitToWidth); err != nil {
  46. fmt.Println(err)
  47. }
  48. fmt.Println("Defaults:")
  49. fmt.Printf("- orientation: %q\n", orientation)
  50. fmt.Printf("- paper size: %d\n", paperSize)
  51. fmt.Printf("- fit to height: %d\n", fitToHeight)
  52. fmt.Printf("- fit to width: %d\n", fitToWidth)
  53. // Output:
  54. // Defaults:
  55. // - orientation: "portrait"
  56. // - paper size: 1
  57. // - fit to height: 1
  58. // - fit to width: 1
  59. }
  60. func TestNewSheet(t *testing.T) {
  61. f := NewFile()
  62. sheetID := f.NewSheet("Sheet2")
  63. f.SetActiveSheet(sheetID)
  64. // delete original sheet
  65. f.DeleteSheet(f.GetSheetName(f.GetSheetIndex("Sheet1")))
  66. assert.NoError(t, f.SaveAs(filepath.Join("test", "TestNewSheet.xlsx")))
  67. // create new worksheet with already exists name
  68. assert.Equal(t, f.GetSheetIndex("Sheet2"), f.NewSheet("Sheet2"))
  69. }
  70. func TestSetPane(t *testing.T) {
  71. f := NewFile()
  72. assert.NoError(t, f.SetPanes("Sheet1", `{"freeze":false,"split":false}`))
  73. f.NewSheet("Panes 2")
  74. 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"}]}`))
  75. f.NewSheet("Panes 3")
  76. 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"}]}`))
  77. f.NewSheet("Panes 4")
  78. 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"}]}`))
  79. assert.NoError(t, f.SetPanes("Panes 4", ""))
  80. assert.EqualError(t, f.SetPanes("SheetN", ""), "sheet SheetN is not exist")
  81. assert.NoError(t, f.SaveAs(filepath.Join("test", "TestSetPane.xlsx")))
  82. }
  83. func TestPageLayoutOption(t *testing.T) {
  84. const sheet = "Sheet1"
  85. testData := []struct {
  86. container PageLayoutOptionPtr
  87. nonDefault PageLayoutOption
  88. }{
  89. {new(PageLayoutOrientation), PageLayoutOrientation(OrientationLandscape)},
  90. {new(PageLayoutPaperSize), PageLayoutPaperSize(10)},
  91. {new(FitToHeight), FitToHeight(2)},
  92. {new(FitToWidth), FitToWidth(2)},
  93. }
  94. for i, test := range testData {
  95. t.Run(fmt.Sprintf("TestData%d", i), func(t *testing.T) {
  96. opt := test.nonDefault
  97. t.Logf("option %T", opt)
  98. def := deepcopy.Copy(test.container).(PageLayoutOptionPtr)
  99. val1 := deepcopy.Copy(def).(PageLayoutOptionPtr)
  100. val2 := deepcopy.Copy(def).(PageLayoutOptionPtr)
  101. f := NewFile()
  102. // Get the default value
  103. assert.NoError(t, f.GetPageLayout(sheet, def), opt)
  104. // Get again and check
  105. assert.NoError(t, f.GetPageLayout(sheet, val1), opt)
  106. if !assert.Equal(t, val1, def, opt) {
  107. t.FailNow()
  108. }
  109. // Set the same value
  110. assert.NoError(t, f.SetPageLayout(sheet, val1), opt)
  111. // Get again and check
  112. assert.NoError(t, f.GetPageLayout(sheet, val1), opt)
  113. if !assert.Equal(t, val1, def, "%T: value should not have changed", opt) {
  114. t.FailNow()
  115. }
  116. // Set a different value
  117. assert.NoError(t, f.SetPageLayout(sheet, test.nonDefault), opt)
  118. assert.NoError(t, f.GetPageLayout(sheet, val1), opt)
  119. // Get again and compare
  120. assert.NoError(t, f.GetPageLayout(sheet, val2), opt)
  121. if !assert.Equal(t, val1, val2, "%T: value should not have changed", opt) {
  122. t.FailNow()
  123. }
  124. // Value should not be the same as the default
  125. if !assert.NotEqual(t, def, val1, "%T: value should have changed from default", opt) {
  126. t.FailNow()
  127. }
  128. // Restore the default value
  129. assert.NoError(t, f.SetPageLayout(sheet, def), opt)
  130. assert.NoError(t, f.GetPageLayout(sheet, val1), opt)
  131. if !assert.Equal(t, def, val1) {
  132. t.FailNow()
  133. }
  134. })
  135. }
  136. }
  137. func TestSearchSheet(t *testing.T) {
  138. f, err := OpenFile(filepath.Join("test", "SharedStrings.xlsx"))
  139. if !assert.NoError(t, err) {
  140. t.FailNow()
  141. }
  142. // Test search in a not exists worksheet.
  143. _, err = f.SearchSheet("Sheet4", "")
  144. assert.EqualError(t, err, "sheet Sheet4 is not exist")
  145. var expected []string
  146. // Test search a not exists value.
  147. result, err := f.SearchSheet("Sheet1", "X")
  148. assert.NoError(t, err)
  149. assert.EqualValues(t, expected, result)
  150. result, err = f.SearchSheet("Sheet1", "A")
  151. assert.NoError(t, err)
  152. assert.EqualValues(t, []string{"A1"}, result)
  153. // Test search the coordinates where the numerical value in the range of
  154. // "0-9" of Sheet1 is described by regular expression:
  155. result, err = f.SearchSheet("Sheet1", "[0-9]", true)
  156. assert.NoError(t, err)
  157. assert.EqualValues(t, expected, result)
  158. // Test search worksheet data after set cell value
  159. f = NewFile()
  160. assert.NoError(t, f.SetCellValue("Sheet1", "A1", true))
  161. _, err = f.SearchSheet("Sheet1", "")
  162. assert.NoError(t, err)
  163. }
  164. func TestSetPageLayout(t *testing.T) {
  165. f := NewFile()
  166. // Test set page layout on not exists worksheet.
  167. assert.EqualError(t, f.SetPageLayout("SheetN"), "sheet SheetN is not exist")
  168. }
  169. func TestGetPageLayout(t *testing.T) {
  170. f := NewFile()
  171. // Test get page layout on not exists worksheet.
  172. assert.EqualError(t, f.GetPageLayout("SheetN"), "sheet SheetN is not exist")
  173. }
  174. func TestSetHeaderFooter(t *testing.T) {
  175. f := NewFile()
  176. assert.NoError(t, f.SetCellStr("Sheet1", "A1", "Test SetHeaderFooter"))
  177. // Test set header and footer on not exists worksheet.
  178. assert.EqualError(t, f.SetHeaderFooter("SheetN", nil), "sheet SheetN is not exist")
  179. // Test set header and footer with illegal setting.
  180. assert.EqualError(t, f.SetHeaderFooter("Sheet1", &FormatHeaderFooter{
  181. OddHeader: strings.Repeat("c", 256),
  182. }), "field OddHeader must be less than 255 characters")
  183. assert.NoError(t, f.SetHeaderFooter("Sheet1", nil))
  184. assert.NoError(t, f.SetHeaderFooter("Sheet1", &FormatHeaderFooter{
  185. DifferentFirst: true,
  186. DifferentOddEven: true,
  187. OddHeader: "&R&P",
  188. OddFooter: "&C&F",
  189. EvenHeader: "&L&P",
  190. EvenFooter: "&L&D&R&T",
  191. FirstHeader: `&CCenter &"-,Bold"Bold&"-,Regular"HeaderU+000A&D`,
  192. }))
  193. assert.NoError(t, f.SaveAs(filepath.Join("test", "TestSetHeaderFooter.xlsx")))
  194. }
  195. func TestDefinedName(t *testing.T) {
  196. f := NewFile()
  197. assert.NoError(t, f.SetDefinedName(&DefinedName{
  198. Name: "Amount",
  199. RefersTo: "Sheet1!$A$2:$D$5",
  200. Comment: "defined name comment",
  201. Scope: "Sheet1",
  202. }))
  203. assert.NoError(t, f.SetDefinedName(&DefinedName{
  204. Name: "Amount",
  205. RefersTo: "Sheet1!$A$2:$D$5",
  206. Comment: "defined name comment",
  207. }))
  208. assert.EqualError(t, f.SetDefinedName(&DefinedName{
  209. Name: "Amount",
  210. RefersTo: "Sheet1!$A$2:$D$5",
  211. Comment: "defined name comment",
  212. }), "the same name already exists on the scope")
  213. assert.EqualError(t, f.DeleteDefinedName(&DefinedName{
  214. Name: "No Exist Defined Name",
  215. }), "no defined name on the scope")
  216. assert.Exactly(t, "Sheet1!$A$2:$D$5", f.GetDefinedName()[1].RefersTo)
  217. assert.NoError(t, f.DeleteDefinedName(&DefinedName{
  218. Name: "Amount",
  219. }))
  220. assert.Exactly(t, "Sheet1!$A$2:$D$5", f.GetDefinedName()[0].RefersTo)
  221. assert.Exactly(t, 1, len(f.GetDefinedName()))
  222. assert.NoError(t, f.SaveAs(filepath.Join("test", "TestDefinedName.xlsx")))
  223. }
  224. func TestGroupSheets(t *testing.T) {
  225. f := NewFile()
  226. sheets := []string{"Sheet2", "Sheet3"}
  227. for _, sheet := range sheets {
  228. f.NewSheet(sheet)
  229. }
  230. assert.EqualError(t, f.GroupSheets([]string{"Sheet1", "SheetN"}), "sheet SheetN is not exist")
  231. assert.EqualError(t, f.GroupSheets([]string{"Sheet2", "Sheet3"}), "group worksheet must contain an active worksheet")
  232. assert.NoError(t, f.GroupSheets([]string{"Sheet1", "Sheet2"}))
  233. assert.NoError(t, f.SaveAs(filepath.Join("test", "TestGroupSheets.xlsx")))
  234. }
  235. func TestUngroupSheets(t *testing.T) {
  236. f := NewFile()
  237. sheets := []string{"Sheet2", "Sheet3", "Sheet4", "Sheet5"}
  238. for _, sheet := range sheets {
  239. f.NewSheet(sheet)
  240. }
  241. assert.NoError(t, f.UngroupSheets())
  242. }
  243. func TestInsertPageBreak(t *testing.T) {
  244. f := NewFile()
  245. assert.NoError(t, f.InsertPageBreak("Sheet1", "A1"))
  246. assert.NoError(t, f.InsertPageBreak("Sheet1", "B2"))
  247. assert.NoError(t, f.InsertPageBreak("Sheet1", "C3"))
  248. assert.NoError(t, f.InsertPageBreak("Sheet1", "C3"))
  249. assert.EqualError(t, f.InsertPageBreak("Sheet1", "A"), `cannot convert cell "A" to coordinates: invalid cell name "A"`)
  250. assert.EqualError(t, f.InsertPageBreak("SheetN", "C3"), "sheet SheetN is not exist")
  251. assert.NoError(t, f.SaveAs(filepath.Join("test", "TestInsertPageBreak.xlsx")))
  252. }
  253. func TestRemovePageBreak(t *testing.T) {
  254. f := NewFile()
  255. assert.NoError(t, f.RemovePageBreak("Sheet1", "A2"))
  256. assert.NoError(t, f.InsertPageBreak("Sheet1", "A2"))
  257. assert.NoError(t, f.InsertPageBreak("Sheet1", "B2"))
  258. assert.NoError(t, f.RemovePageBreak("Sheet1", "A1"))
  259. assert.NoError(t, f.RemovePageBreak("Sheet1", "B2"))
  260. assert.NoError(t, f.InsertPageBreak("Sheet1", "C3"))
  261. assert.NoError(t, f.RemovePageBreak("Sheet1", "C3"))
  262. assert.NoError(t, f.InsertPageBreak("Sheet1", "A3"))
  263. assert.NoError(t, f.RemovePageBreak("Sheet1", "B3"))
  264. assert.NoError(t, f.RemovePageBreak("Sheet1", "A3"))
  265. f.NewSheet("Sheet2")
  266. assert.NoError(t, f.InsertPageBreak("Sheet2", "B2"))
  267. assert.NoError(t, f.InsertPageBreak("Sheet2", "C2"))
  268. assert.NoError(t, f.RemovePageBreak("Sheet2", "B2"))
  269. assert.EqualError(t, f.RemovePageBreak("Sheet1", "A"), `cannot convert cell "A" to coordinates: invalid cell name "A"`)
  270. assert.EqualError(t, f.RemovePageBreak("SheetN", "C3"), "sheet SheetN is not exist")
  271. assert.NoError(t, f.SaveAs(filepath.Join("test", "TestRemovePageBreak.xlsx")))
  272. }
  273. func TestGetSheetName(t *testing.T) {
  274. f, err := OpenFile(filepath.Join("test", "Book1.xlsx"))
  275. assert.NoError(t, err)
  276. assert.Equal(t, "Sheet1", f.GetSheetName(0))
  277. assert.Equal(t, "Sheet2", f.GetSheetName(1))
  278. assert.Equal(t, "", f.GetSheetName(-1))
  279. assert.Equal(t, "", f.GetSheetName(2))
  280. }
  281. func TestGetSheetMap(t *testing.T) {
  282. expectedMap := map[int]string{
  283. 1: "Sheet1",
  284. 2: "Sheet2",
  285. }
  286. f, err := OpenFile(filepath.Join("test", "Book1.xlsx"))
  287. assert.NoError(t, err)
  288. sheetMap := f.GetSheetMap()
  289. for idx, name := range sheetMap {
  290. assert.Equal(t, expectedMap[idx], name)
  291. }
  292. assert.Equal(t, len(sheetMap), 2)
  293. }
  294. func TestSetActiveSheet(t *testing.T) {
  295. f := NewFile()
  296. f.WorkBook.BookViews = nil
  297. f.SetActiveSheet(1)
  298. f.WorkBook.BookViews = &xlsxBookViews{WorkBookView: []xlsxWorkBookView{}}
  299. f.Sheet["xl/worksheets/sheet1.xml"].SheetViews = &xlsxSheetViews{SheetView: []xlsxSheetView{}}
  300. f.SetActiveSheet(1)
  301. f.Sheet["xl/worksheets/sheet1.xml"].SheetViews = nil
  302. f.SetActiveSheet(1)
  303. f = NewFile()
  304. f.SetActiveSheet(-1)
  305. assert.Equal(t, f.GetActiveSheetIndex(), 0)
  306. }
  307. func TestSetSheetName(t *testing.T) {
  308. f := NewFile()
  309. // Test set workksheet with the same name.
  310. f.SetSheetName("Sheet1", "Sheet1")
  311. assert.Equal(t, "Sheet1", f.GetSheetName(0))
  312. }