Go语言excelize包读写Excel文件(附带实例)
Microsoft Office 是十分常用的办公软件,很多用户与系统之间的数据交互载体都会选择 Office 办公软件,因为用户不会使用 JSON 文件、CSV 文件或 Yaml 文件等这类开发配置文件。
Office 办公软件使用频率最高的是 Excel,它的功能比 Word 和 PPT 都要强大和实用,虽然 CSV 能用 Excel 软件打开和编辑,但 CSV 无法保存 Excel 的功能,比如数据透视表、函数公式等,因为 CSV 无法保存这些特殊数据。
Go 语言读写 Excel 文件必须依赖第三方包实现,在 GitHub 搜索关键词“go excel”,编程语言选择 Go 就能找到相关的第三方包,如下图所示。
在选择第三方包的时候,我们通常从 3 个维度判断是否适合开发需求:
根据 3 个维度的判断标准,我们选择第三方包 excelize 实现 Excel 的读写操作。首先在 CMD 窗口或 GoLand 的 Terminal 窗口输入“go get xxx”指令下载第三方包,如下图所示。

图 2 下载第三方包
这里推荐使用 go mod 管理第三方包,根据 excelize 文档说明,我们应该输入安装指令:
下一步在 E 盘下创建文件夹 mygo,分别创建文件 chapter14.8.go 和使用 go mod init mygo 指令创建文件 go.mod,目录结构如下图所示。

图 3 目录结构
使用 GoLand 以项目形式打开文件夹 mygo,在 go.mod 中设置第三方包的信息,代码如下:
上述示例一共执行了 6 个操作,说明如下:

图 4 工作表Sheet
综上所述,使用第三方包 excelize 实现 Excel 的读写过程如下:
第三方包 excelize 提供了完善的官方文档,并提供了中文文档,更多的 Excel 文档操作教程可以参考 https://xuri.me/excelize/zh-hans/。
Office 办公软件使用频率最高的是 Excel,它的功能比 Word 和 PPT 都要强大和实用,虽然 CSV 能用 Excel 软件打开和编辑,但 CSV 无法保存 Excel 的功能,比如数据透视表、函数公式等,因为 CSV 无法保存这些特殊数据。
Go 语言读写 Excel 文件必须依赖第三方包实现,在 GitHub 搜索关键词“go excel”,编程语言选择 Go 就能找到相关的第三方包,如下图所示。

图 1 搜索第三方包
在选择第三方包的时候,我们通常从 3 个维度判断是否适合开发需求:
- 官方文档能使开发者快速上手,提高开发效率,这是 3 个维度中最重要的,如果没有完善的文档教程,只能从源码中分析总结,这个过程很漫长和痛苦。使用第三方包的目的是不用自己造轮子,开箱即用,提高开发效率。如果没有官方文档指导,只靠自己分析总结源码,还不如自己造轮子。总的来说,没有官方文档的第三方包,即使是神器,无法快速上手也是废器。
- 星星数量反映了当前第三方包的使用热度,数量越多说明使用人群越广泛并且得到认同,而且有利于发现包的 bug、性能和兼容性等问题。
- 社区活跃情况反映第三方包的 bug、性能和兼容性等问题能否及时修复,GitHub 提供了 Issues 功能,为使用者和开发者提供交流平台。从 Issues 可以看到包的异常和修复情况,使用者提出异常,如果开发者从不修复或修复时间长,那么说明不再维护或维护效率低。
根据 3 个维度的判断标准,我们选择第三方包 excelize 实现 Excel 的读写操作。首先在 CMD 窗口或 GoLand 的 Terminal 窗口输入“go get xxx”指令下载第三方包,如下图所示。

图 2 下载第三方包
这里推荐使用 go mod 管理第三方包,根据 excelize 文档说明,我们应该输入安装指令:
go get github.com/xuri/excelize/v2
下一步在 E 盘下创建文件夹 mygo,分别创建文件 chapter14.8.go 和使用 go mod init mygo 指令创建文件 go.mod,目录结构如下图所示。

图 3 目录结构
使用 GoLand 以项目形式打开文件夹 mygo,在 go.mod 中设置第三方包的信息,代码如下:
module mygo go 1.18 require ( github.com/xuri/excelize/v2 v2.4.1 // indirect )最后在 chapter14.8.go 中调用第三方包 excelize 实现 Excel 的读写过程,实现代码如下:
package main import ( "fmt" "github.com/xuri/excelize/v2" ) func main() { // NewFile()创建新的Excel文件 f := excelize.NewFile() // NewSheet()在Excel里面创建Sheet2 index := f.NewSheet("Sheet2") // 在Sheet2的单元格写入数据 f.SetCellValue("Sheet2", "A2", "Hello world") f.SetCellValue("Sheet1", "B2", 100) // 设置工作簿的默认工作表 f.SetActiveSheet(index) // 从Sheet2获取单元格A2的值 cell, _ := f.GetCellValue("Sheet2", "A2") fmt.Printf("Sheet2的单元格A2的值:%v\n", cell) // 保存Excel文件 err := f.SaveAs("./Book1.xlsx") if err != nil { fmt.Println(err) } }运行上述代码之后,程序在当前目录(即文件夹 mygo)创建 Excel 文件 Book1.xlsx,打开 Book1.xlsx 就能看到 Sheet1 的 B2 和 Sheet2 的 A2 分别写入 100 和 Hello world。
上述示例一共执行了 6 个操作,说明如下:
- 由第三方包 excelize 调用 NewFile() 创建新的 Excel 文件,并生成文件对象 f。如果要读取现有的 Excel 文件,可以由 excelize 调用 OpenFile() 读取;
- 文件对象 f 调用 NewSheet(),在 Excel 中创建工作表 Sheet2。NewSheet() 的参数 name 是工作表 Sheet 的名字,返回值是工作表 Sheet 的索引位置;
- 文件对象 f 调用 SetCellValue() 在某个工作表 Sheet 的某个单元格设置数值,参数 sheet 代表工作表 Sheet 的名称,参数 axis 代表单元格,参数 value 代表写入单元格的数值;
- 文件对象 f 调用 SetActiveSheet() 能设置默认工作表 Sheet,参数 index 为整型类型,代表工作表 Sheet 的索引位置,索引位置是从左往右计算的,从 0 开始,如下图所示;
- 文件对象 f 调用 GetCellValue() 获取某个工作表 Sheet 某个单元格的数值,参数 sheet 是工作表 Sheet 的名称,参数 axis 代表单元格,第一个返回值是单元格的数据,第二个返回值是异常信息;
- 文件对象 f 调用 SaveAs() 保存 Excel 文件,参数 name 是保存路径。

图 4 工作表Sheet
综上所述,使用第三方包 excelize 实现 Excel 的读写过程如下:
- 由第三方包 excelize 调用 NewFile() 或 OpenFile() 创建或读取 Excel 文件,生成文件对象。
- 由文件对象调用相应的方法实现文件的读写操作。
- 调用 SaveAs() 或 Save() 方法实现文件保存,从而完成整个读写过程。
第三方包 excelize 提供了完善的官方文档,并提供了中文文档,更多的 Excel 文档操作教程可以参考 https://xuri.me/excelize/zh-hans/。