日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

一文帶你搞懂Go如何讀寫Excel文件_Golang

作者:Barry?Yan ? 更新時(shí)間: 2022-12-08 編程語(yǔ)言

Excelize是一個(gè)用純Go語(yǔ)言編寫的庫(kù),提供了一組函數(shù),可以對(duì)XLAM / XLSM / XLSX / XLTM / XLTX文件進(jìn)行讀寫。支持讀寫由Microsoft Excel?2007及以后版本生成的電子表格文檔。通過高兼容性支持復(fù)雜組件,并提供流API從具有大量數(shù)據(jù)的工作表中生成或讀取數(shù)據(jù)。該庫(kù)需要Go 1.16或更高版本。

那么本篇文章將會(huì)介紹我們操作Excel的常用功能,如下:

  • 生成一個(gè)新的Excel文件
  • 向Excel文件中追加內(nèi)容
  • 解析Excel文件內(nèi)容
  • 使用Http協(xié)議上傳并解析Excel文件
  • 使用Http協(xié)議將數(shù)據(jù)轉(zhuǎn)換為Excel文件并下載

1.下載依賴庫(kù)

go get github.com/xuri/excelize

# Go Modules使用這個(gè)命令
go get github.com/xuri/excelize/v2

2.具體操作

2.1 生成一個(gè)新的Excel文件

func WriteNewExcel() {
   f := excelize.NewFile()
   // 創(chuàng)建一個(gè)sheet
   index := f.NewSheet("Sheet2")
   // 根據(jù)sheet和坐標(biāo) 確定一個(gè)值
   // 例如f.SetCellValue("Sheet2", "A2", "Hello world.")就是在Sheet表中A列第2行的格子里填入Hello world.
   f.SetCellValue("Sheet2", "A2", "Hello world.")
   f.SetCellValue("Sheet1", "B1", 100)
   f.SetCellValue("Sheet1", "B2", 100)
   // 將新的sheet添加到Excel中
   f.SetActiveSheet(index)
   // 保存Excel
   if err := f.SaveAs("Book1.xlsx"); err != nil {
      fmt.Println(err)
   }
}

2.2 向Excel文件中追加內(nèi)容

func WriteExcel() {
   f, _ := excelize.OpenFile("Book1.xlsx")
   index := f.NewSheet("Sheet2")
   f.SetCellValue("Sheet2", "A2", "Hello world.")
   f.SetCellValue("Sheet1", "B1", 100)
   f.SetCellValue("Sheet1", "B2", 100)
   f.SetActiveSheet(index)
   if err := f.SaveAs("Book1.xlsx"); err != nil {
      fmt.Println(err)
   }
}

2.3 解析Excel文件內(nèi)容

func ReadExcel() {
   f, err := excelize.OpenFile("Book1.xlsx")
   if err != nil {
      fmt.Println(err)
      return
   }
   defer func() {
      if err := f.Close(); err != nil {
         fmt.Println(err)
      }
   }()
   // 根據(jù)sheet和坐標(biāo)讀取某一個(gè)格子的值
   cell, err := f.GetCellValue("Sheet1", "B2")
   if err != nil {
      fmt.Println(err)
      return
   }
   fmt.Println(cell)
   // 按行讀取全部
   rows, err := f.GetRows("Sheet1")
   if err != nil {
      fmt.Println(err)
      return
   }
   for _, row := range rows {
      for _, colCell := range row {
         fmt.Print(colCell, "\t")
      }
      fmt.Println()
   }
}

2.4 使用Http協(xié)議上傳并解析Excel文件

func HttpReadExcel() {
   f := func(read io.Reader) {
      file, err := excelize.OpenReader(read)
      if err != nil {
         fmt.Println(err)
         return
      }
      for _, item := range file.GetSheetList() {
         rows, _ := file.GetRows(item)
         // rows是一個(gè)二維數(shù)組
         for i := range rows {
            strs := rows[i]
            for j := range strs {
               str := rows[i][j]
               fmt.Println(str)
            }
         }
      }
   }
   http.HandleFunc("/excel", func(w http.ResponseWriter, r *http.Request) {
      file, _, err := r.FormFile("file")
      if err != nil {
         fmt.Println(err)
         return
      }
      fileBytes, err := ioutil.ReadAll(file)
      if err != nil {
         fmt.Println(err)
         return
      }
      reader := bytes.NewReader(fileBytes)
      f(reader)
      w.Write([]byte("Hello Http Get!"))
   })
   http.ListenAndServe(":8080", nil)
}

2.5 使用Http協(xié)議將數(shù)據(jù)轉(zhuǎn)換為Excel文件并下載

func HttpDownloadExcel() {
   fun := func(fileName string) *bytes.Reader {
      f := excelize.NewFile()
      f.SetCellValue("Sheet1", "B1", 100)
      err := f.SaveAs(fileName)
      if err != nil {
         fmt.Println(err)
      }
      var buffer bytes.Buffer
      _ = f.Write(&buffer)
      return bytes.NewReader(buffer.Bytes())
   }
   http.HandleFunc("/downloadExcel", func(w http.ResponseWriter, r *http.Request) {
      reader := fun("Book2.xlsx")
      // 重新設(shè)置文件名稱
      w.Header().Set("Content-Disposition", "attachment; filename="+"Book2.xlsx")
      io.Copy(w, reader)
   })
   http.ListenAndServe(":8080", nil)
}

3.小總結(jié)

以上功能只需靈活擴(kuò)展后基本上就可以覆蓋大部分業(yè)務(wù)了,但是有一點(diǎn)需要注意,在2.5使用Http協(xié)議將數(shù)據(jù)轉(zhuǎn)換為Excel文件并下載這個(gè)操作中,需要將文件進(jìn)行重命名,這個(gè)名稱可以自定義,也可以由服務(wù)端指定,但是需要以相關(guān)文件類型的名稱做后綴,否則會(huì)輸出zip壓縮文件,很難看懂。

原文鏈接:https://blog.csdn.net/Mr_YanMingXin/article/details/127590137

欄目分類
最近更新