原文链接:GO轻松搞定Excel
库简介
Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Microsoft Excel™ 2007 及以上版本创建的电子表格文档。支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多种文档格式,高度兼容带有样式、图片(表)、透视表、切片器等复杂组件的文档,并提供流式读写 API,用于处理包含大规模数据的工作簿。可应用于各类报表平台、云计算、边缘计算等系统。使用本类库要求使用的 Go 语言为 1.18 或更高版本。
开源仓库:github.com/xuri/excelize
使用
安装库
go get github.com/xuri/excelize/v2
创建Excel
在自己的项目中完成了库的安装后,即可使用Excelize创建一个新的Excel文件。
func main() {
// 新建文件
file := excelize.NewFile()
defer func() {
err := file.Close()
if err != nil {
log.Fatalln("关闭文件异常: ", err)
}
}()
// 新建工作簿
_, err := file.NewSheet("sheet1")
if err != nil {
log.Fatalln("创建工作表失败: ", err)
}
// 保存文件
err = file.SaveAs("test.xlsx")
if err != nil {
log.Fatalln("保存文件异常: ", err)
}
}
上面代码中使用NewFile方法新建Excel文件,并使用NewSheet新建工作表最后使用SaveAs方法保存,代码运行后就会在当前目录生成一个test.xlsx的文件,打开文件可看到文件中包含一个sheet1的工作表。
打开Excel
除了使用代码创建出一个Excel文件,还可以打开一个已经存在的Excel文件。
func main() {
file, err := excelize.OpenFile("test.xlsx")
if err != nil {
log.Fatalln("打开文件异常: ", err)
}
defer func() {
err := file.Close()
if err != nil {
log.Fatalln("关闭文件异常: ", err)
}
}()
// 新建工作簿
_, err = file.NewSheet("sheet2")
if err != nil {
log.Fatalln("创建工作表失败: ", err)
}
// 保存文件
err = file.SaveAs("test.xlsx")
if err != nil {
log.Fatalln("保存文件异常: ", err)
}
}
使用上面代码打开第一步的时候创建的test.xlsx文件,然后在文件中新建一个名为sheet2的工作表并保存,运行代码后再次打开test.xlsx文件即可看到在sheet1后新增了sheet2的工作表。
写入
func main() {
file, err := excelize.OpenFile("test.xlsx")
if err != nil {
log.Fatalln("打开文件异常: ", err)
}
defer func() {
err := file.Close()
if err != nil {
log.Fatalln("关闭文件异常: ", err)
}
}()
// 设置单元格值,参数1为工作表名,参数2为单元格,参数3为值
file.SetCellStr("sheet1", "A1", "姓名")
file.SetCellStr("sheet1", "A2", "年龄")
// 保存文件
err = file.Save()
if err != nil {
log.Fatalln("保存文件异常: ", err)
}
}
在代码中使用SetCell方法可以写入相应的值到表格中,常见SetCell方法如下:
SetCellStr
:写入字符类型值
SetCellInt
:写入整形值
SetCellBool
:写入布尔类型值
SetCellFloat
:写入浮点类型值
……
代码运行之后打开test.xlsx文件即可看到对应的单元格已经写入了我们设置好的值
读取
在读取单元格的时候使用GetCellValue方法,读取的时候没有类型区分,大部分使用这个方法即可。
func readValue() {
file, err := excelize.OpenFile("test.xlsx")
if err != nil {
log.Fatalln("打开文件异常: ", err)
}
defer func() {
err := file.Close()
if err != nil {
log.Fatalln("关闭文件异常: ", err)
}
}()
// 设置单元格值,参数1为工作表名,参数2为单元格
value, err := file.GetCellValue("sheet1", "A1")
if err != nil {
log.Fatalln("读取单元格异常: ", err)
}
fmt.Println("A1单元格的值为: ", value)
}
在运行代码之后即可在控制台打印出我们读取到的单元格中的值。
插入图表
先准备一些数据,然后使用Excelize在表格中直接插入图表。
func main() {
file, err := excelize.OpenFile("test.xlsx")
if err != nil {
log.Fatalln("打开文件异常: ", err)
}
defer func() {
err := file.Close()
if err != nil {
log.Fatalln("关闭文件异常: ", err)
}
}()
if err := file.AddChart("Sheet1", "E1", &excelize.Chart{
Type: excelize.Col3DClustered,
Series: []excelize.ChartSeries{
{
Name: "Sheet1!$A$2",
Categories: "Sheet1!$B$1:$D$1",
Values: "Sheet1!$B$2:$D$2",
},
{
Name: "Sheet1!$A$3",
Categories: "Sheet1!$B$1:$D$1",
Values: "Sheet1!$B$3:$D$3",
},
{
Name: "Sheet1!$A$4",
Categories: "Sheet1!$B$1:$D$1",
Values: "Sheet1!$B$4:$D$4",
}},
Title: []excelize.RichTextRun{
{
Text: "Fruit 3D Clustered Column Chart",
},
},
}); err != nil {
log.Fatalln("插入图表异常: ", err)
}
// 保存文件
err = file.Save()
if err != nil {
log.Fatalln("保存文件异常: ", err)
}
}
上面代码中的AddChart就是像工作表中插入图表,第一个参数为工作表名,第二个参数为插入图表的开始单元格,第三个参数则为图表的样式属性,其中Type属性的Col3DClustered表示三维簇状柱形图(其他的图表类型可查看官方文档),Series
指定了绘制哪些数据的信息集合、图例项(系列)和水平(分类)轴标签。
Series
中的详细参数如下表:
作用 | |
---|---|
Name | 图例项(系列),在图表图例和公式栏中显示。Name 参数是可选的,如果不指定该值默认将会使用 Series 1 … n 表示。Name 支持使用公式表示,例如:Sheet1!$A$1。 |
Categories | 水平(分类)轴标签。在大多数图表类型中,Categories 属性是可选的,默认为形如 1…n 的连续序列。 |
Values | 图表数据区域,是 Series 中最重要的参数,也是创建图表时唯一的必选参数。该选项将图表与其显示的工作表数据链接起来。 |
运行代码后即可在工作表中插入一张图表。