excelize_test.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. package excelize
  2. import (
  3. _ "image/gif"
  4. _ "image/jpeg"
  5. _ "image/png"
  6. "strconv"
  7. "testing"
  8. )
  9. func TestOpenFile(t *testing.T) {
  10. // Test update a XLSX file.
  11. xlsx, err := OpenFile("./test/Workbook1.xlsx")
  12. if err != nil {
  13. t.Log(err)
  14. }
  15. // Test get all the rows in a not exists sheet.
  16. rows := xlsx.GetRows("Sheet4")
  17. // Test get all the rows in a sheet.
  18. rows = xlsx.GetRows("Sheet2")
  19. for _, row := range rows {
  20. for _, cell := range row {
  21. t.Log(cell, "\t")
  22. }
  23. t.Log("\r\n")
  24. }
  25. xlsx.UpdateLinkedValue()
  26. xlsx.SetCellDefault("SHEET2", "A1", strconv.FormatFloat(float64(100.1588), 'f', -1, 32))
  27. xlsx.SetCellDefault("SHEET2", "A1", strconv.FormatFloat(float64(-100.1588), 'f', -1, 64))
  28. xlsx.SetCellInt("SHEET2", "A1", 100)
  29. xlsx.SetCellStr("SHEET2", "C11", "Knowns")
  30. // Test max characters in a cell.
  31. var s = "c"
  32. for i := 0; i < 32768; i++ {
  33. s += "c"
  34. }
  35. xlsx.SetCellStr("SHEET2", "D11", s)
  36. xlsx.NewSheet(3, ":\\/?*[]Maximum 31 characters allowed in sheet title.")
  37. // Test set sheet name with illegal name.
  38. xlsx.SetSheetName("Maximum 31 characters allowed i", "[Rename]:\\/?* Maximum 31 characters allowed in sheet title.")
  39. xlsx.SetCellInt("Sheet3", "A23", 10)
  40. xlsx.SetCellStr("SHEET3", "b230", "10")
  41. xlsx.SetCellStr("SHEET10", "b230", "10")
  42. xlsx.SetActiveSheet(2)
  43. xlsx.GetCellFormula("Sheet1", "B19") // Test get cell formula with given rows number.
  44. xlsx.GetCellFormula("Sheet2", "B20") // Test get cell formula with illegal sheet index.
  45. xlsx.GetCellFormula("Sheet1", "B20") // Test get cell formula with illegal rows number.
  46. // Test read cell value with given illegal rows number.
  47. xlsx.GetCellValue("Sheet2", "a-1")
  48. // Test read cell value with given lowercase column number.
  49. xlsx.GetCellValue("Sheet2", "a5")
  50. xlsx.GetCellValue("Sheet2", "C11")
  51. xlsx.GetCellValue("Sheet2", "D11")
  52. xlsx.GetCellValue("Sheet2", "D12")
  53. // Test SetCellValue function.
  54. xlsx.SetCellValue("Sheet2", "F1", "Hello")
  55. xlsx.SetCellValue("Sheet2", "G1", []byte("World"))
  56. xlsx.SetCellValue("Sheet2", "F2", 42)
  57. xlsx.SetCellValue("Sheet2", "F2", int8(42))
  58. xlsx.SetCellValue("Sheet2", "F2", int16(42))
  59. xlsx.SetCellValue("Sheet2", "F2", int32(42))
  60. xlsx.SetCellValue("Sheet2", "F2", int64(42))
  61. xlsx.SetCellValue("Sheet2", "F2", float32(42.65418))
  62. xlsx.SetCellValue("Sheet2", "F2", float64(-42.65418))
  63. xlsx.SetCellValue("Sheet2", "F2", float32(42))
  64. xlsx.SetCellValue("Sheet2", "F2", float64(42))
  65. xlsx.SetCellValue("Sheet2", "G2", nil)
  66. // Test completion column.
  67. xlsx.SetCellValue("Sheet2", "M2", nil)
  68. // Test read cell value with given axis large than exists row.
  69. xlsx.GetCellValue("Sheet2", "E231")
  70. // Test get active sheet of XLSX and get sheet name of XLSX by given sheet index.
  71. xlsx.GetSheetName(xlsx.GetActiveSheetIndex())
  72. // Test get sheet name of XLSX by given invalid sheet index.
  73. xlsx.GetSheetName(4)
  74. // Test get sheet map of XLSX.
  75. xlsx.GetSheetMap()
  76. for i := 1; i <= 300; i++ {
  77. xlsx.SetCellStr("SHEET3", "c"+strconv.Itoa(i), strconv.Itoa(i))
  78. }
  79. err = xlsx.Save()
  80. if err != nil {
  81. t.Log(err)
  82. }
  83. // Test write file to not exist directory.
  84. err = xlsx.WriteTo("")
  85. if err != nil {
  86. t.Log(err)
  87. }
  88. }
  89. func TestAddPicture(t *testing.T) {
  90. xlsx, err := OpenFile("./test/Workbook1.xlsx")
  91. if err != nil {
  92. t.Log(err)
  93. }
  94. // Test add picture to sheet.
  95. err = xlsx.AddPicture("Sheet2", "I9", "./test/images/excel.jpg", `{"x_offset": 140, "y_offset": 120}`)
  96. if err != nil {
  97. t.Log(err)
  98. }
  99. // Test add picture to sheet with offset.
  100. err = xlsx.AddPicture("Sheet1", "F21", "./test/images/excel.png", `{"x_offset": 10, "y_offset": 10}`)
  101. if err != nil {
  102. t.Log(err)
  103. }
  104. // Test add picture to sheet with invalid file path.
  105. err = xlsx.AddPicture("Sheet1", "G21", "./test/images/excel.icon", "")
  106. if err != nil {
  107. t.Log(err)
  108. }
  109. // Test add picture to sheet with unsupport file type.
  110. err = xlsx.AddPicture("Sheet1", "G21", "./test/Workbook1.xlsx", "")
  111. if err != nil {
  112. t.Log(err)
  113. }
  114. // Test write file to given path.
  115. err = xlsx.WriteTo("./test/Workbook_2.xlsx")
  116. if err != nil {
  117. t.Log(err)
  118. }
  119. }
  120. func TestBrokenFile(t *testing.T) {
  121. // Test write file with broken file struct.
  122. xlsx := File{}
  123. err := xlsx.Save()
  124. if err != nil {
  125. t.Log(err)
  126. }
  127. // Test write file with broken file struct with given path.
  128. err = xlsx.WriteTo("./test/Workbook_3.xlsx")
  129. if err != nil {
  130. t.Log(err)
  131. }
  132. // Test set active sheet without BookViews and Sheets maps in xl/workbook.xml.
  133. f3, err := OpenFile("./test/badWorkbook.xlsx")
  134. f3.SetActiveSheet(2)
  135. if err != nil {
  136. t.Log(err)
  137. }
  138. // Test open a XLSX file with given illegal path.
  139. _, err = OpenFile("./test/Workbook.xlsx")
  140. if err != nil {
  141. t.Log(err)
  142. }
  143. }
  144. func TestCreateFile(t *testing.T) {
  145. // Test create a XLSX file.
  146. xlsx := CreateFile()
  147. xlsx.NewSheet(2, "XLSXSheet2")
  148. xlsx.NewSheet(3, "XLSXSheet3")
  149. xlsx.SetCellInt("Sheet2", "A23", 56)
  150. xlsx.SetCellStr("SHEET1", "B20", "42")
  151. xlsx.SetActiveSheet(0)
  152. // Test add picture to sheet with scaling.
  153. err := xlsx.AddPicture("Sheet1", "H2", "./test/images/excel.gif", `{"x_scale": 0.5, "y_scale": 0.5}`)
  154. if err != nil {
  155. t.Log(err)
  156. }
  157. err = xlsx.AddPicture("Sheet1", "C2", "./test/images/excel.png", "")
  158. if err != nil {
  159. t.Log(err)
  160. }
  161. err = xlsx.WriteTo("./test/Workbook_3.xlsx")
  162. if err != nil {
  163. t.Log(err)
  164. }
  165. }
  166. func TestSetColWidth(t *testing.T) {
  167. xlsx := CreateFile()
  168. xlsx.SetColWidth("sheet1", "B", "A", 12)
  169. xlsx.SetColWidth("sheet1", "A", "B", 12)
  170. err := xlsx.WriteTo("./test/Workbook_4.xlsx")
  171. if err != nil {
  172. t.Log(err)
  173. }
  174. }
  175. func TestSetCellHyperLink(t *testing.T) {
  176. xlsx, err := OpenFile("./test/Workbook1.xlsx")
  177. if err != nil {
  178. t.Log(err)
  179. }
  180. // Test set cell hyperlink in a work sheet already have hyperlinks.
  181. xlsx.SetCellHyperLink("sheet1", "B19", "https://github.com/Luxurioust/excelize")
  182. // Test add first hyperlink in a work sheet.
  183. xlsx.SetCellHyperLink("sheet2", "C1", "https://github.com/Luxurioust/excelize")
  184. err = xlsx.Save()
  185. if err != nil {
  186. t.Log(err)
  187. }
  188. }
  189. func TestSetCellFormula(t *testing.T) {
  190. xlsx, err := OpenFile("./test/Workbook1.xlsx")
  191. if err != nil {
  192. t.Log(err)
  193. }
  194. xlsx.SetCellFormula("sheet1", "B19", "SUM(Sheet2!D2,Sheet2!D11)")
  195. xlsx.SetCellFormula("sheet1", "C19", "SUM(Sheet2!D2,Sheet2!D9)")
  196. err = xlsx.Save()
  197. if err != nil {
  198. t.Log(err)
  199. }
  200. }
  201. func TestSetSheetBackground(t *testing.T) {
  202. xlsx, err := OpenFile("./test/Workbook1.xlsx")
  203. if err != nil {
  204. t.Log(err)
  205. }
  206. err = xlsx.SetSheetBackground("sheet2", "./test/images/background.png")
  207. if err != nil {
  208. t.Log(err)
  209. }
  210. err = xlsx.SetSheetBackground("sheet2", "./test/Workbook1.xlsx")
  211. if err != nil {
  212. t.Log(err)
  213. }
  214. err = xlsx.SetSheetBackground("sheet2", "./test/images/background.jpg")
  215. if err != nil {
  216. t.Log(err)
  217. }
  218. err = xlsx.SetSheetBackground("sheet2", "./test/images/background.jpg")
  219. if err != nil {
  220. t.Log(err)
  221. }
  222. err = xlsx.Save()
  223. if err != nil {
  224. t.Log(err)
  225. }
  226. }
  227. func TestMergeCell(t *testing.T) {
  228. xlsx, err := OpenFile("./test/Workbook1.xlsx")
  229. if err != nil {
  230. t.Log(err)
  231. }
  232. xlsx.MergeCell("Sheet1", "D9", "D9")
  233. xlsx.MergeCell("Sheet1", "D9", "E9")
  234. xlsx.MergeCell("Sheet1", "H14", "G13")
  235. xlsx.MergeCell("Sheet1", "C9", "D8")
  236. xlsx.MergeCell("Sheet1", "F11", "G13")
  237. xlsx.MergeCell("Sheet1", "H7", "B15")
  238. xlsx.MergeCell("Sheet1", "D11", "F13")
  239. xlsx.MergeCell("Sheet1", "G10", "K12")
  240. xlsx.SetCellValue("Sheet1", "G11", "set value in merged cell")
  241. xlsx.SetCellInt("Sheet1", "H11", 100)
  242. xlsx.SetCellValue("Sheet1", "I11", float64(0.5))
  243. xlsx.SetCellHyperLink("Sheet1", "J11", "https://github.com/Luxurioust/excelize")
  244. xlsx.SetCellFormula("Sheet1", "G12", "SUM(Sheet1!B19,Sheet1!C19)")
  245. xlsx.GetCellValue("Sheet1", "H11")
  246. xlsx.GetCellFormula("Sheet1", "G12")
  247. err = xlsx.Save()
  248. if err != nil {
  249. t.Log(err)
  250. }
  251. }
  252. func TestSetRowHeight(t *testing.T) {
  253. xlsx := CreateFile()
  254. xlsx.SetRowHeight("Sheet1", 0, 50)
  255. xlsx.SetRowHeight("Sheet1", 3, 90)
  256. err := xlsx.WriteTo("./test/Workbook_5.xlsx")
  257. if err != nil {
  258. t.Log(err)
  259. }
  260. }
  261. func TestSetCellStyleAlignment(t *testing.T) {
  262. xlsx, err := OpenFile("./test/Workbook_2.xlsx")
  263. if err != nil {
  264. t.Log(err)
  265. }
  266. err = xlsx.SetCellStyle("Sheet1", "A22", "A22", `{"alignment":{"horizontal":"center","ident":1,"justify_last_line":true,"reading_order":0,"relative_indent":1,"shrink_to_fit":true,"text_rotation":45,"vertical":"top","wrap_text":true}}`)
  267. err = xlsx.Save()
  268. if err != nil {
  269. t.Log(err)
  270. }
  271. }
  272. func TestSetCellStyleBorder(t *testing.T) {
  273. xlsx, err := OpenFile("./test/Workbook_2.xlsx")
  274. if err != nil {
  275. t.Log(err)
  276. }
  277. // Test set border with invalid style parameter.
  278. err = xlsx.SetCellStyle("Sheet1", "J21", "L25", "")
  279. if err != nil {
  280. t.Log(err)
  281. }
  282. // Test set border with invalid style index number.
  283. err = xlsx.SetCellStyle("Sheet1", "J21", "L25", `{"border":[{"type":"left","color":"0000FF","style":-1},{"type":"top","color":"00FF00","style":14},{"type":"bottom","color":"FFFF00","style":5},{"type":"right","color":"FF0000","style":6},{"type":"diagonalDown","color":"A020F0","style":9},{"type":"diagonalUp","color":"A020F0","style":8}]}`)
  284. if err != nil {
  285. t.Log(err)
  286. }
  287. // Test set border on overlapping area with vertical variants shading styles gradient fill.
  288. err = xlsx.SetCellStyle("Sheet1", "J21", "L25", `{"border":[{"type":"left","color":"0000FF","style":2},{"type":"top","color":"00FF00","style":12},{"type":"bottom","color":"FFFF00","style":5},{"type":"right","color":"FF0000","style":6},{"type":"diagonalDown","color":"A020F0","style":9},{"type":"diagonalUp","color":"A020F0","style":8}]}`)
  289. if err != nil {
  290. t.Log(err)
  291. }
  292. err = xlsx.SetCellStyle("Sheet1", "M28", "K24", `{"border":[{"type":"left","color":"0000FF","style":2},{"type":"top","color":"00FF00","style":3},{"type":"bottom","color":"FFFF00","style":4},{"type":"right","color":"FF0000","style":5},{"type":"diagonalDown","color":"A020F0","style":6},{"type":"diagonalUp","color":"A020F0","style":7}],"fill":{"type":"gradient","color":["#FFFFFF","#E0EBF5"],"shading":1}}`)
  293. if err != nil {
  294. t.Log(err)
  295. }
  296. // Test set border and solid style pattern fill for a single cell.
  297. err = xlsx.SetCellStyle("Sheet1", "O22", "O22", `{"border":[{"type":"left","color":"0000FF","style":8},{"type":"top","color":"00FF00","style":9},{"type":"bottom","color":"FFFF00","style":10},{"type":"right","color":"FF0000","style":11},{"type":"diagonalDown","color":"A020F0","style":12},{"type":"diagonalUp","color":"A020F0","style":13}],"fill":{"type":"pattern","color":["#E0EBF5"],"pattern":1}}`)
  298. if err != nil {
  299. t.Log(err)
  300. }
  301. err = xlsx.Save()
  302. if err != nil {
  303. t.Log(err)
  304. }
  305. }
  306. func TestSetCellStyleFill(t *testing.T) {
  307. xlsx, err := OpenFile("./test/Workbook_2.xlsx")
  308. if err != nil {
  309. t.Log(err)
  310. }
  311. // Test only set fill for a cell.
  312. err = xlsx.SetCellStyle("Sheet1", "N23", "N23", `{"fill":{"type":"gradient","color":["#FFFFFF","#E0EBF5"],"shading":4}}`)
  313. if err != nil {
  314. t.Log(err)
  315. }
  316. err = xlsx.SetCellStyle("Sheet1", "N24", "N24", `{"fill":{"type":"gradient","color":["#FFFFFF","#E0EBF5"],"shading":5}}`)
  317. if err != nil {
  318. t.Log(err)
  319. }
  320. // Test set fill for cell with invalid parameter.
  321. err = xlsx.SetCellStyle("Sheet1", "O23", "O23", `{"fill":{"type":"gradient","color":["#FFFFFF","#E0EBF5"],"shading":6}}`)
  322. if err != nil {
  323. t.Log(err)
  324. }
  325. err = xlsx.SetCellStyle("Sheet1", "O23", "O23", `{"fill":{"type":"gradient","color":["#FFFFFF"],"shading":1}}`)
  326. if err != nil {
  327. t.Log(err)
  328. }
  329. err = xlsx.SetCellStyle("Sheet1", "O23", "O23", `{"fill":{"type":"pattern","color":[],"pattern":1}}`)
  330. if err != nil {
  331. t.Log(err)
  332. }
  333. err = xlsx.SetCellStyle("Sheet1", "O23", "O23", `{"fill":{"type":"pattern","color":["#E0EBF5"],"pattern":19}}`)
  334. if err != nil {
  335. t.Log(err)
  336. }
  337. err = xlsx.Save()
  338. if err != nil {
  339. t.Log(err)
  340. }
  341. }
  342. func TestSetDeleteSheet(t *testing.T) {
  343. xlsx, err := OpenFile("./test/Workbook_3.xlsx")
  344. if err != nil {
  345. t.Log(err)
  346. }
  347. xlsx.DeleteSheet("XLSXSheet3")
  348. err = xlsx.Save()
  349. if err != nil {
  350. t.Log(err)
  351. }
  352. xlsx, err = OpenFile("./test/Workbook_4.xlsx")
  353. if err != nil {
  354. t.Log(err)
  355. }
  356. xlsx.DeleteSheet("Sheet1")
  357. err = xlsx.Save()
  358. if err != nil {
  359. t.Log(err)
  360. }
  361. }