ZetCode

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 库添加到项目中。

simple.go
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 文件。

Simple file
图:简单文件

Go 读取 Excel 文件

在下一个示例中,我们将从之前创建的 Excel 文件中读取数据。

read_cell.go
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 工作表。

new_sheet.go
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 应用样式。

styled.go
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 单元格包含文本。我们将文本水平居中,并将字体设置为粗体和斜体。

Apply style
图:应用样式

Go Excel 合并单元格

要合并单元格,我们使用 MergeCell 函数。

merge_cells.go
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)

此外,我们还为合并的单元格应用了样式。

Merge cells
图:合并单元格

Go Excel 图表

使用 AddChart 函数创建一个新图表。可以创建各种图表,包括柱状图、饼图、面积图或折线图。

gold_medals.go
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 创建图表。我们提供图表类型和系列数据。

Column chart
图:柱状图

来源

Go excelize - Github 页面

在本文中,我们演示了如何使用 excelize 库在 Go 中读写 Excel 文件。

作者

我的名字是 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。到目前为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教学编程方面拥有十多年的经验。

列出所有 Go 教程