Go Excel
最后修改时间 2024 年 4 月 11 日
在本文中,我们将展示如何使用 excelize 在 Golang 中读写 Excel 文件。
Excel xlsx
在本文中,我们将处理 xlsx 文件。xlsx 是 Microsoft Excel 使用的开放 XML 电子表格文件格式的文件扩展名。xlsm 文件支持宏。xltm 是启用宏的模板文件。xls 格式是专有的二进制格式,而 xlsx 基于 Office Open XML 格式。
Go Excelize
Excelize 是一个用于读写 Excel 文件的 Go 库。它支持 xlsx、xlsm 和 xltm 文件。Excelize 允许处理由 Microsoft Excel™ 2007 及更高版本生成的电子表格文档。它提供了流式 API,用于从包含大量数据的电子表格生成或读取数据。
$ go get github.com/360EntSecGroup-Skylar/excelize/v2
要安装支持模块的 Excelize,我们使用上述命令。
Go Excel 简单示例
在第一个示例中,我们使用 excelize 创建一个新的 xlsx 文件。
$ mkdir simple $ cd simple
我们创建一个项目目录。
$ go mod init com.zetcode/Simple
我们创建一个新的 Go 模块。
$ go get github.com/360EntSecGroup-Skylar/excelize/v2
我们将 excelize 库添加到项目中。
package main
import (
"log"
"time"
"github.com/360EntSecGroup-Skylar/excelize/v2"
)
func main() {
f := excelize.NewFile()
f.SetCellValue("Sheet1", "B2", 100)
f.SetCellValue("Sheet1", "A1", 50)
now := time.Now()
f.SetCellValue("Sheet1", "A4", now.Format(time.ANSIC))
if err := f.SaveAs("simple.xlsx"); err != nil {
log.Fatal(err)
}
}
我们创建一个新文件并写入三个单元格。
import (
"fmt"
"time"
"github.com/360EntSecGroup-Skylar/excelize/v2"
)
我们包含 excelize 包。
f := excelize.NewFile()
使用 NewFile 创建一个新文件。
f.SetCellValue("Sheet1", "B2", 100)
我们使用 SetCellValue 将整数值设置到 B2 单元格。
now := time.Now()
f.SetCellValue("Sheet1", "A4", now.Format(time.ANSIC))
在这里,我们将当前日期时间写入 A4 单元格。
if err := f.SaveAs("simple.xlsx"); err != nil {
log.Fatal(err)
}
我们使用 SaveAs 写入数据。
$ go run simple.go
我们运行示例,然后打开 simple.xlsx 文件。
Go 读取 Excel 文件
在下一个示例中,我们将从之前创建的 Excel 文件中读取数据。
package main
import (
"fmt"
"log"
"github.com/360EntSecGroup-Skylar/excelize/v2"
)
func main() {
f, err := excelize.OpenFile("simple.xlsx")
if err != nil {
log.Fatal(err)
}
c1, err := f.GetCellValue("Sheet1", "A1")
if err != nil {
log.Fatal(err)
}
fmt.Println(c1)
c2, err := f.GetCellValue("Sheet1", "A4")
if err != nil {
log.Fatal(err)
}
fmt.Println(c2)
c3, err := f.GetCellValue("Sheet1", "B2")
if err != nil {
log.Fatal(err)
}
fmt.Println(c3)
}
该示例从三个单元格读取数据。
f, err := excelize.OpenFile("simple.xlsx")
使用 OpenFile 打开 simple.xlsx 文件。
c1, err := f.GetCellValue("Sheet1", "A1")
使用 GetCellValue 读取一个单元格;我们将工作表名称和单元格坐标作为参数提供。
$ go run read_cell.go 50 Thu Apr 29 10:29:06 2021 100
Go Excel 新建工作表
使用 NewSheet 创建一个新的 Excel 工作表。
package main
import (
"fmt"
"log"
"github.com/360EntSecGroup-Skylar/excelize/v2"
)
func main() {
f := excelize.NewFile()
f.SetCellValue("Sheet1", "A1", 50)
idx := f.NewSheet("Sheet2")
fmt.Println(idx)
f.SetCellValue("Sheet2", "A1", 50)
f.SetActiveSheet(idx)
if err := f.SaveAs("new_sheet.xlsx"); err != nil {
log.Fatal(err)
}
}
该示例创建一个新工作表并向单元格写入数据。
idx := f.NewSheet("Sheet2")
使用 NewSheet 创建一个名为 Sheet2 的新工作表;该函数返回生成工作表的索引。
f.SetCellValue("Sheet2", "A1", 50)
我们向 Sheet2 的 A1 单元格写入数据。
f.SetActiveSheet(idx)
使用 SetActiveSheet 设置活动工作表;它将工作表的索引作为参数。
Go Excel 应用样式
使用 NewStyle 创建样式,并使用 SetCellStyle 应用样式。
package main
import (
"log"
"github.com/360EntSecGroup-Skylar/excelize/v2"
)
func main() {
f := excelize.NewFile()
f.SetCellValue("Sheet1", "A1", "an old falcon")
f.SetColWidth("Sheet1", "A", "A", 20)
style, _ := f.NewStyle(`{"alignment":{"horizontal":"center"},
"font":{"bold":true,"italic":true}}`)
f.SetCellStyle("Sheet1", "A1", "A1", style)
if err := f.SaveAs("styled.xlsx"); err != nil {
log.Fatal(err)
}
}
在代码示例中,A1 单元格包含文本。我们将文本水平居中,并将字体设置为粗体和斜体。
Go Excel 合并单元格
要合并单元格,我们使用 MergeCell 函数。
package main
import (
"log"
"github.com/360EntSecGroup-Skylar/excelize/v2"
)
func main() {
f := excelize.NewFile()
f.SetCellValue("Sheet1", "A1", "Sunny Day")
f.MergeCell("Sheet1", "A1", "B2")
style, _ := f.NewStyle(`{"alignment":{"horizontal":"center","vertical":"center"},
"font":{"bold":true,"italic":true}}`)
f.SetCellStyle("Sheet1", "A1", "B2", style)
if err := f.SaveAs("merging.xlsx"); err != nil {
log.Fatal(err)
}
}
我们使用 MergeCell 将四个单元格合并为一个。
f.MergeCell("Sheet1", "A1", "B2")
MergeCell 函数以工作表名称以及左上角和右下角单元格作为参数。
style, _ := f.NewStyle(`{"alignment":{"horizontal":"center","vertical":"center"},
"font":{"bold":true,"italic":true}}`)
f.SetCellStyle("Sheet1", "A1", "B2", style)
此外,我们还为合并的单元格应用了样式。
Go Excel 图表
使用 AddChart 函数创建一个新图表。可以创建各种图表,包括柱状图、饼图、面积图或折线图。
package main
import (
"log"
"github.com/360EntSecGroup-Skylar/excelize/v2"
)
func main() {
categories := map[string]string{"A1": "USA", "A2": "China", "A3": "UK",
"A4": "Russia", "A5": "South Korea", "A6": "Germany"}
values := map[string]int{"B1": 46, "B2": 38, "B3": 29, "B4": 22, "B5": 13, "B6": 11}
f := excelize.NewFile()
for k, v := range categories {
f.SetCellValue("Sheet1", k, v)
}
for k, v := range values {
f.SetCellValue("Sheet1", k, v)
}
if err := f.AddChart("Sheet1", "E1", `{
"type":"col",
"series":[
{"name":"Sheet1!$A$2","categories":"Sheet1!$A$1:$A$6",
"values":"Sheet1!$B$1:$B$6"}
],
"title":{"name":"Olympic Gold medals in London 2012"}}`); err != nil {
log.Fatal(err)
}
if err := f.SaveAs("gold_medals.xlsx"); err != nil {
log.Fatal(err)
}
}
在代码示例中,我们创建了一个柱状图来显示 2012 年伦敦奥运会各国获得的金牌数量。
categories := map[string]string{"A1": "USA", "A2": "China", "A3": "UK",
"A4": "Russia", "A5": "South Korea", "A6": "Germany"}
values := map[string]int{"B1": 46, "B2": 38, "B3": 29, "B4": 22, "B5": 13, "B6": 11}
类别和值存储在 Go 的 map 中。
for k, v := range categories {
f.SetCellValue("Sheet1", k, v)
}
for k, v := range values {
f.SetCellValue("Sheet1", k, v)
}
使用两个 for 循环,我们将数据插入工作表。
if err := f.AddChart("Sheet1", "E1", `{
"type":"col",
"series":[
{"name":"Sheet1!$A$2","categories":"Sheet1!$A$1:$A$6",
"values":"Sheet1!$B$1:$B$6"}
],
"title":{"name":"Olympic Gold medals in London 2012"}}`); err != nil {
log.Fatal(err)
}
使用 AddChart 创建图表。我们提供图表类型和系列数据。
来源
在本文中,我们演示了如何使用 excelize 库在 Go 中读写 Excel 文件。