如何使用excelize在Golang中读取/写入Excel文件

GoExcel教程展示了如何使用excelize在Golang中读取/写入Excel文件。

Excelxlsx

在本教程中,我们使用xlsx文件。xlsx是MicrosoftExcel使用的开放式XML电子表格文件格式的文件扩展名。xlsm文件支持宏。xltm是启用宏的模板文件。xls格式是专有的二进制格式,而xlsx是基于OfficeOpenXML格式。

精益求精

Excelize是一个用于读取和写入Excel文件的Go库。它支持xlsx、xlsm和xltm文件。Excelize允许使用MicrosoftExcel™2007及更高版本生成的电子表格文档。它提供了streamingAPI,用于从具有大量数据的工作表中生成或读取数据。

$ go get github.com/360EntSecGroup-Skylar/excelize/v2

要安装支持模块的Excelize,我们使用上面的命令。

$ go version
go version go1.18.1 linux/amd64

我们使用Go版本1.18。

GoExcel简单例子

在第一个示例中,我们使用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文件。

图:简单文件

去读取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")

simple.xlsx文件用OpenFile打开。

c1, err := f.GetCellValue("Sheet1", "A1")

使用GetCellValue读取单元格;我们提供工作表名称和单元格坐标作为参数。

$ go run read_cell.go 
50
Thu Apr 29 10:29:06 2021
100

去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设置;它以工作表的索引作为参数。

去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单元格中有文本。我们将文本水平居中并将字体设置为粗体和斜体。

图:应用样式

GoExcel合并单元格

要合并单元格,我们使用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)

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

图:合并单元格

去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映射中。

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文件。

列出所有Go教程。

赞(0) 打赏

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏