写点什么

一文搞懂 Go 读写 Excel 文件

作者:Barry Yan
  • 2022-11-02
    北京
  • 本文字数:2087 字

    阅读完需:约 7 分钟

先给大家看下我们今天的主角:一只可爱的囊地鼠正在准备食用 Excel~



GitHub 链接:https://github.com/qax-os/excelize


Excelize 是一个用纯 Go 语言编写的库,提供了一组函数,可以对 XLAM / XLSM / XLSX / XLTM / XLTX 文件进行读写。支持读写由 Microsoft Excel™2007 及以后版本生成的电子表格文档。通过高兼容性支持复杂组件,并提供流 API 从具有大量数据的工作表中生成或读取数据。该库需要 Go 1.16 或更高版本


那么本篇文章将会介绍我们操作 Excel 的常用功能,如下:


  • 生成一个新的 Excel 文件

  • 向 Excel 文件中追加内容

  • 解析 Excel 文件内容

  • 使用 Http 协议上传并解析 Excel 文件

  • 使用 Http 协议将数据转换为 Excel 文件并下载

1 下载依赖库

go get github.com/xuri/excelize
# Go Modules使用这个命令go get github.com/xuri/excelize/v2
复制代码

2 具体操作

2.1 生成一个新的 Excel 文件

func WriteNewExcel() {   f := excelize.NewFile()   // 创建一个sheet   index := f.NewSheet("Sheet2")   // 根据sheet和坐标 确定一个值   // 例如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 文件中追加内容

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 文件内容

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)      }   }()   // 根据sheet和坐标读取某一个格子的值   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 协议上传并解析 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是一个二维数组         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 协议将数据转换为 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")      // 重新设置文件名称      w.Header().Set("Content-Disposition", "attachment; filename="+"Book2.xlsx")      io.Copy(w, reader)   })   http.ListenAndServe(":8080", nil)}
复制代码

3 小总结

以上功能只需灵活扩展后基本上就可以覆盖大部分业务了,但是有一点需要注意,在 2.5 使用 Http 协议将数据转换为 Excel 文件并下载这个操作中,需要将文件进行重命名,这个名称可以自定义,也可以由服务端指定,但是需要以相关文件类型的名称做后缀,否则会输出 zip 压缩文件,很难看懂。


今天的分享就到这里~

发布于: 刚刚阅读数: 6
用户头像

Barry Yan

关注

做兴趣使然的Hero 2021-01-14 加入

Just do it.

评论

发布
暂无评论
一文搞懂Go读写Excel文件_Go_Barry Yan_InfoQ写作社区