Go语言Excel处理库 github.com/xuri/excelize/v2 使用详解

github.com/xuri/excelize/v2 是一个功能强大的 Go 语言库,用于创建、读取、修改和写入 Microsoft Excel (.xlsx) 文件。无论你需要处理简单的表格数据还是复杂的表单、图表和样式,这个库都能为你提供全面的支持。本文将详细介绍如何使用 excelize 库,并通过代码示例演示其常用功能。

1. 安装 excelize

在使用 excelize 之前,你需要安装这个库。打开终端,在你的 Go 项目中执行以下命令:

go get github.com/xuri/excelize/v2

安装完成后,在代码中导入这个库:

import "github.com/xuri/excelize/v2"

2. 创建新的 Excel 文件

excelize 支持创建新的 Excel 文件,并可以向其中写入数据。以下是创建新文件并保存的一个简单示例:

package main

import (
    "fmt"
    "github.com/xuri/excelize/v2"
)

func main() {
    // 创建一个新的 Excel 文件
    f := excelize.NewFile()

    // 设置单元格的值
    f.SetCellValue("Sheet1", "A1", "Hello, Excelize!")
    f.SetCellValue("Sheet1", "B1", 100)

    // 保存文件
    if err := f.SaveAs("Book1.xlsx"); err != nil {
        fmt.Println(err)
    }
}

在这个示例中,创建了一个名为 Sheet1 的默认工作表,并在单元格 A1B1 中写入了数据。随后将 Excel 文件保存为 Book1.xlsx

3. 打开并读取现有的 Excel 文件

你可以使用 excelize.OpenFile() 方法打开现有的 Excel 文件,并读取单元格中的内容:

package main

import (
    "fmt"
    "github.com/xuri/excelize/v2"
)

func main() {
    // 打开现有的 Excel 文件
    f, err := excelize.OpenFile("Book1.xlsx")
    if err != nil {
        fmt.Println(err)
        return
    }

    // 获取单元格的值
    cellValue, err := f.GetCellValue("Sheet1", "A1")
    if err != nil {
        fmt.Println(err)
        return
    }

    fmt.Println("A1 Cell Value:", cellValue)

    // 关闭文件
    if err := f.Close(); err != nil {
        fmt.Println(err)
    }
}

上面的代码打开了一个名为 Book1.xlsx 的文件,读取 Sheet1 中单元格 A1 的值并输出到控制台。

4. 工作表操作

excelize 支持创建、删除和操作多个工作表。你可以为每个 Excel 文件创建多个工作表,并在不同工作表之间切换。

创建新工作表

可以使用 NewSheet() 方法创建新的工作表:

f := excelize.NewFile()
index, err := f.NewSheet("Sheet2")
if err!= nil {
	panic(err)
}
f.SetCellValue("Sheet2", "A1", "Hello from Sheet2")
f.SetActiveSheet(index)
f.SaveAs("Book2.xlsx")

删除工作表

你可以使用 DeleteSheet() 方法删除工作表:

f.DeleteSheet("Sheet2")

重命名工作表

可以通过 SetSheetName() 方法重命名工作表:

f.SetSheetName("Sheet1", "NewSheetName")

5. 单元格操作

在 Excel 文件中,你可以轻松地操作单元格内容。excelize 提供了丰富的 API 用于写入、读取和修改单元格数据。

写入单元格

使用 SetCellValue() 可以向指定单元格写入数据。可以写入多种类型的数据,包括字符串、数字、布尔值等:

f.SetCellValue("Sheet1", "A1", "Go语言")
f.SetCellValue("Sheet1", "B1", 12345)
f.SetCellValue("Sheet1", "C1", true)

读取单元格

你可以使用 GetCellValue() 方法读取单元格的数据,返回的数据总是字符串类型:

value, err := f.GetCellValue("Sheet1", "A1")
if err != nil {
    fmt.Println(err)
}
fmt.Println("A1 Cell Value:", value)

6. 单元格类型判断

在读取单元格数据时,有时需要判断单元格的数据类型。excelize 提供了 GetCellType() 方法,可以用来判断单元格的数据类型。

cellType, err := f.GetCellType("Sheet1", "A1")
if err != nil {
    fmt.Println(err)
    return
}

switch cellType {
case excelize.CellTypeNumber:
    fmt.Println("A1 contains a number.")
case excelize.CellTypeInlineString:
    fmt.Println("A1 contains a string.")
case excelize.CellTypeBool:
    fmt.Println("A1 contains a boolean.")
}

7. 单元格样式

excelize 支持丰富的样式设置,包括字体、对齐、边框和填充色等。

设置单元格字体和对齐

你可以通过 NewStyle() 方法为单元格设置字体样式和对齐方式:

style, err := f.NewStyle(&excelize.Style{
	Font: &excelize.Font{
		Bold:   true,
		Italic: true,
		Family: "Arial",
		Size:   12,
		Color:  "#FF0000",
	},
	Alignment: &excelize.Alignment{
		Horizontal: "center",
		Vertical:   "center",
	},
})
if err != nil {
	fmt.Println(err)
	return
}
f.SetCellStyle("Sheet1", "A1", "A1", style)

设置单元格边框

可以通过以下方式为单元格设置边框:

borderStyle, err := f.NewStyle(&excelize.Style{
	Border: []excelize.Border{
		{
			Type:  "left",
			Color: "#000000",
			Style: 1,
		},
		{
			Type:  "right",
			Color: "#000000",
			Style: 1,
		},
	},
})
if err!= nil {
	panic(err)
}
f.SetCellStyle("Sheet1", "A1", "A1", borderStyle)

8. 插入图片

通过 AddPicture() 方法,可以将图片插入到 Excel 工作表中:

if err := f.AddPicture("Sheet1", "B2", "image.png", nil); err != nil {
    fmt.Println(err)
}

9. 合并单元格

可以使用 MergeCell() 方法合并单元格:

f.MergeCell("Sheet1", "A1", "B1")

10. 流式读写大数据

对于大规模的数据处理,excelize 提供了流式读写 API,避免内存占用过高。

使用 StreamWriter 实现大规模数据的流式写入:

streamWriter, err := f.NewStreamWriter("Sheet1")
if err != nil {
    fmt.Println(err)
    return
}
for row := 1; row <= 1000000; row++ {
    cell := fmt.Sprintf("A%d", row)
    streamWriter.SetRow(cell, []interface{}{"Large Data"})
}
streamWriter.Flush()

11. 错误处理

操作 Excel 文件时,常见的错误包括文件不存在、工作表或单元格不存在等。处理这些错误时,需使用 Go 的 error 类型:

if err := f.SaveAs("Book1.xlsx"); err != nil {
    fmt.Println("Error:", err)
}

孟斯特

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意
腾讯云开发者社区:孟斯特