一文搞懂Go读写Excel文件

简介: 一文搞懂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

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

今天的分享就到这里~

相关文章
|
1月前
|
监控 数据处理 索引
使用Python批量实现文件夹下所有Excel文件的第二张表合并
使用Python和pandas批量合并文件夹中所有Excel文件的第二张表,通过os库遍历文件,pandas的read_excel读取表,concat函数合并数据。主要步骤包括:1) 遍历获取Excel文件,2) 读取第二张表,3) 合并所有表格,最后将结果保存为新的Excel文件。注意文件路径、表格结构一致性及异常处理。可扩展为动态指定合并表、优化性能、日志记录等功能。适合数据处理初学者提升自动化处理技能。
23 1
|
1月前
|
安全 Java 数据库连接
jdbc解析excel文件,批量插入数据至库中
jdbc解析excel文件,批量插入数据至库中
21 0
|
1月前
|
存储 数据可视化 数据处理
Python中读取Excel文件的方法
【2月更文挑战第18天】
68 4
Python中读取Excel文件的方法
|
1月前
|
前端开发 UED
前端解析Excel文件
前端解析Excel文件
34 0
|
1月前
|
SQL 数据可视化 数据处理
使用SQL和Python处理Excel文件数据
使用SQL和Python处理Excel文件数据
54 0
|
2天前
|
Python
python_读写excel、csv记录
python_读写excel、csv记录
8 0
|
8天前
|
数据库
开发指南009-从list导出excel文件
从数据库返回一般是对象的列表,平台底层提供了从list转为excel文件的方法
|
9天前
|
数据挖掘 索引 Python
Python 读写 Excel 文件
Python 读写 Excel 文件
12 0
|
23天前
|
存储 测试技术 Go
掌握Go语言:深入探究Go语言中的命令源码文件与参数处理技巧(3)
掌握Go语言:深入探究Go语言中的命令源码文件与参数处理技巧(3)
|
1月前
|
存储 数据处理 Python
使用Python批量合并Excel文件的所有Sheet数据
使用Python批量合并Excel文件的所有Sheet数据
33 0