[Go] Excel 處理

程式語言:Go
Package:github.com/tealeg/xlsx
官方 Github
官方文件

功能:處理 excel,只能對 xlsx 處理
提醒:有時因網頁產生的 xlsx 並非正式格式,會導致處理錯誤,可用 office Excel 重新存檔即可

讀寫檔
  1. package main
  2.  
  3. import (
  4. "fmt"
  5.  
  6. "github.com/tealeg/xlsx"
  7. )
  8.  
  9. type dataStruct struct {
  10. C1 string `xlsx:"0"`
  11. C2 bool `xlsx:"1"`
  12. C3 int `xlsx:"2"`
  13. }
  14.  
  15. func main() {
  16. path := `D:\test.xlsx`
  17. fmt.Println("write...")
  18. writeFile(path)
  19. fmt.Println("read...")
  20. readFile(path)
  21. }
  22.  
  23. func readFile(path string) {
  24. var err error
  25.  
  26. xlFile, err := xlsx.OpenFile(path)
  27. if err != nil {
  28. panic("Open file Error")
  29. }
  30.  
  31. // 列印所有數值
  32. for _, sheet := range xlFile.Sheets {
  33. for _, row := range sheet.Rows {
  34. for _, cell := range row.Cells {
  35. text := cell.String()
  36. fmt.Printf("%s\t", text)
  37. }
  38. fmt.Printf("\n")
  39. }
  40. }
  41.  
  42. var sheet *xlsx.Sheet
  43. var row *xlsx.Row
  44. var cell *xlsx.Cell
  45.  
  46. sheet = xlFile.Sheets[0]
  47.  
  48. // 讀取所有值到 slice
  49. var dataSlice [][][]string
  50. dataSlice, err = xlsx.FileToSlice(path)
  51. fmt.Printf("%v\n", dataSlice)
  52.  
  53. // 在 R2 讀取一行 row
  54. readRow(sheet, 1)
  55.  
  56. // 讀取 R3C2 位置
  57. cell = sheet.Cell(2, 1)
  58. fmt.Println(cell.Value)
  59.  
  60. // 讀取第五行到 struct
  61. data := dataStruct{}
  62. row = sheet.Rows[4]
  63. row.ReadStruct(&data)
  64. fmt.Printf("%v", data)
  65. }
  66.  
  67. func readRow(sheet *xlsx.Sheet, n int) {
  68. // 確認有足夠的 rows
  69. if len(sheet.Rows) < n {
  70. fmt.Println("")
  71. }
  72.  
  73. var row = sheet.Rows[n]
  74. fmt.Printf("%v\n", row.Cells)
  75. }
  76.  
  77. func writeFile(path string) {
  78. var file *xlsx.File
  79. var sheet *xlsx.Sheet
  80. var row *xlsx.Row
  81. var cell *xlsx.Cell
  82. var err error
  83.  
  84. // 新增檔案
  85. file = xlsx.NewFile()
  86. sheet, err = file.AddSheet("Sheet123")
  87. if err != nil {
  88. fmt.Printf(err.Error())
  89. }
  90.  
  91. // 在 R2 插入一行 row
  92. insertRow(sheet, 1)
  93.  
  94. // 寫入 R3C2 位置
  95. cell = sheet.Cell(2, 1)
  96. cell.Value = "R3C2"
  97.  
  98. // 寫入 slice
  99. row = sheet.AddRow()
  100. row.WriteSlice(&[]int{1, 2, 3}, -1)
  101.  
  102. // 寫入 struct
  103. data := dataStruct{
  104. C1: "C1",
  105. C2: true,
  106. C3: 3,
  107. }
  108. row = sheet.AddRow()
  109. row.WriteStruct(&data, -1)
  110.  
  111. // 存檔
  112. err = file.Save(path)
  113. if err != nil {
  114. fmt.Printf(err.Error())
  115. }
  116. }
  117.  
  118. func insertRow(sheet *xlsx.Sheet, n int) {
  119. // 確認有足夠的 rows
  120. for ; len(sheet.Rows) < n; sheet.AddRow() {
  121.  
  122. }
  123.  
  124. var row = xlsx.Row{Sheet: sheet}
  125. rear := append([]*xlsx.Row{}, sheet.Rows[n:]...)
  126. sheet.Rows = append(sheet.Rows[:n], &row)
  127. sheet.Rows = append(sheet.Rows, rear...)
  128. cell := row.AddCell()
  129. cell.Value = fmt.Sprintf("R%d 插入一行 row", n+1)
  130. }

參考

替代方案 excelize

留言