一文带你搞懂Go如何读写Excel文件

 更新时间:2022年11月08日 15:34:42   作者:Barry Yan  
Excelize是一个用纯Go语言编写的库,提供了一组函数,可以对XLAM / XLSM / XLSX / XLTM / XLTX文件进行读写。支持读写由Microsoft Excel™2007及以后版本生成的电子表格文档。本文就将用它实现读写Excel文件操作,感兴趣的可以学习一下

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压缩文件,很难看懂。

到此这篇关于一文带你搞懂Go如何读写Excel文件的文章就介绍到这了,更多相关Go读写Excel文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Go语言简单实现事件管理器

    基于Go语言简单实现事件管理器

    在编程中,事件管理器是一种常见的工具,用于通过通知来触发操作,本文将介绍一个简单的Go事件管理器的实现,并通过异步改进提高其性能,感兴趣的可以了解下
    2023-11-11
  • 详解如何利用GORM实现MySQL事务

    详解如何利用GORM实现MySQL事务

    为了确保数据一致性,在项目中会经常用到事务处理,对于MySQL事务相信大家应该都不陌生。这篇文章主要总结一下在Go语言中Gorm是如何实现事务的;感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助
    2022-09-09
  • Go1.21新增slices包的用法详解

    Go1.21新增slices包的用法详解

    Go 1.21新增的 slices 包提供了很多和切片相关的函数,可以用于任何类型的切片,这篇文章主要来和大家介绍一下slices包中相关函数的用法,需要的可以参考一下
    2023-08-08
  • Go语言排序算法之插入排序与生成随机数详解

    Go语言排序算法之插入排序与生成随机数详解

    从这篇文章开始将带领大家学习Go语言的经典排序算法,比如插入排序、选择排序、冒泡排序、希尔排序、归并排序、堆排序和快排,二分搜索,外部排序和MapReduce等,本文将先详细介绍插入排序,并给大家分享了go语言生成随机数的方法,下面来一起看看吧。
    2017-11-11
  • Golang中多个if代码优化小技巧

    Golang中多个if代码优化小技巧

    这篇文章主要为大家详细介绍了Golang中一些常用的if代码优化小技巧,w文中的示例代码简洁易懂,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-10-10
  • 一文搞懂Golang文件操作增删改查功能(基础篇)

    一文搞懂Golang文件操作增删改查功能(基础篇)

    这篇文章主要介绍了一文搞懂Golang文件操作增删改查功能(基础篇),Golang 可以认为是服务器开发语言发展的趋势之一,特别是在流媒体服务器开发中,已经占有一席之地,今天我们不聊特别深奥的机制和内容,就来聊一聊 Golang 对于文件的基本操作
    2021-04-04
  • Golang 操作 Kafka 如何设置消息的失效时间

    Golang 操作 Kafka 如何设置消息的失效时间

    在使用 Golang 操作 Kafka 时,你可以使用 Sarama 库来设置消息的失效时间,这篇文章主要介绍了Golang操作Kafka设置消息的失效时间,需要的朋友可以参考下
    2023-06-06
  • Go切片扩容机制详细说明和举例

    Go切片扩容机制详细说明和举例

    Go 语言中的切片是一种动态数组,它可以自动扩容和缩容以适应不同的数据量,这篇文章主要给大家介绍了关于Go切片扩容机制详细说明和举例的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • Go语言LeetCode题解937重新排列日志文件

    Go语言LeetCode题解937重新排列日志文件

    这篇文章主要为大家介绍了Go语言LeetCode题解937重新排列日志文件,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Go语言时间相关操作合集(超详细)

    Go语言时间相关操作合集(超详细)

    在开发应用程序的过程中,经常需要记录某些操作的时间或者格式化时间戳,因此大部分编程语言都会有操作时间的库,Go语言当然也不例外,本文我们就一起来学习一下time包的使用
    2023-08-08

最新评论