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