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教程。
