• 一文搞懂Go读写Excel文件


    先给大家看下我们今天的主角:一只可爱的囊地鼠正在准备食用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
    
    • 1
    • 2
    • 3
    • 4

    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)
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    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)
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    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()
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    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)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    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)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    3 小总结

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

    今天的分享就到这里~

  • 相关阅读:
    自适应辛普森法积分算法推导
    现代 CSS 解决方案:CSS 数学函数
    自然语言处理 (NLP) 简介
    机器学习实验------密度聚类方法之DB-Scan
    Springboot毕设项目城市空气质量数据管理系统futcv(java+VUE+Mybatis+Maven+Mysql)
    嵌入式简介
    Matlab坐标轴标签中文设置宋体
    记录一次更新inter arc显卡驱动失败
    力扣(LeetCode)325. 和等于 k 的最长子数组长度(2022.11.22)
    【23真题】发错试卷?想多了,只是题型大改!
  • 原文地址:https://blog.csdn.net/Mr_YanMingXin/article/details/127590137