在笔者开发的项目中,有操作excel的需要,由于go操作excel比较方便且功能强大,于是选择使用go来操作excel。github.com/360EntSecGroup-Skylar/excelize库是一个功能强大且易于使用的库,它支持创建、读取和修改 Excel 文件,兼容多种 Excel 版本格式。接下来,将详细介绍如何使用该库进行 Excel 文件的读写操作。
一、安装 excelize 库
使用go get命令安装excelize库,在终端中执行以下命令:
go get github.com/360EntSecGroup-Skylar/excelize
安装完成后,在 Go 代码中导入该库:
import (
"github.com/360EntSecGroup-Skylar/excelize"
)
二、创建并写入 Excel 文件
1. 基本写入操作
下面的示例代码展示了如何使用excelize库创建一个新的 Excel 文件,并向其中写入数据:
package main
import (
"github.com/360EntSecGroup-Skylar/excelize"
)
func main() {
// 创建一个新的Excel文件
f := excelize.NewFile()
// 创建一个新的工作表
index := f.NewSheet("Sheet1")
// 设置单元格的值
f.SetCellValue("Sheet1", "A1", "姓名")
f.SetCellValue("Sheet1", "B1", "年龄")
f.SetCellValue("Sheet1", "A2", "小明")
f.SetCellValue("Sheet1", "B2", 20)
// 设置默认工作表
f.SetActiveSheet(index)
// 保存文件
if err := f.SaveAs("example.xlsx"); err != nil {
println(err.Error())
}
}
在上述代码中:
- 首先通过excelize.NewFile()创建一个新的 Excel 文件对象。
- 接着使用NewSheet方法创建名为 “Sheet1” 的工作表,并获取其索引。
- 然后通过SetCellValue方法设置指定单元格的值,参数依次为工作表名称、单元格坐标和要设置的值。
- 再使用SetActiveSheet方法将创建的工作表设置为默认工作表。
- 最后调用SaveAs方法将文件保存到指定路径。
2. 批量写入数据
如果需要批量写入数据,可以使用循环结合SetCellValue方法实现。例如,将一个切片中的数据写入 Excel:
package main
import (
"github.com/360EntSecGroup-Skylar/excelize"
)
func main() {
f := excelize.NewFile()
index := f.NewSheet("Sheet1")
data := [][]interface{}{
{"姓名", "年龄"},
{"小红", 22},
{"小刚", 23},
}
for rowIndex, rowData := range data {
for colIndex, cellData := range rowData {
cell, err := excelize.CoordinatesToCellName(colIndex+1, rowIndex+1)
if err != nil {
println(err.Error())
return
}
f.SetCellValue("Sheet1", cell, cellData)
}
}
f.SetActiveSheet(index)
if err := f.SaveAs("batch_example.xlsx"); err != nil {
println(err.Error())
}
}
这里先定义了一个二维切片存储数据,通过两层循环遍历切片,使用CoordinatesToCellName方法将行列索引转换为单元格坐标,再设置单元格值。
三、读取 Excel 文件
1. 读取指定单元格数据
以下示例展示了如何读取 Excel 文件中指定单元格的数据:
package main
import (
"fmt"
"github.com/360EntSecGroup-Skylar/excelize"
)
func main() {
f, err := excelize.OpenFile("example.xlsx")
if err != nil {
fmt.Println(err.Error())
return
}
defer f.Close()
// 获取Sheet1工作表中A1单元格的值
cell, err := f.GetCellValue("Sheet1", "A1")
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println(cell)
}
代码中,先使用OpenFile方法打开 Excel 文件,成功打开后,通过GetCellValue方法获取指定工作表和单元格的内容,最后记得关闭文件。
2. 遍历读取工作表数据
若要遍历读取整个工作表的数据,可以通过循环实现:
package main
import (
"fmt"
"github.com/360EntSecGroup-Skylar/excelize"
)
func main() {
f, err := excelize.OpenFile("example.xlsx")
if err != nil {
fmt.Println(err.Error())
return
}
defer f.Close()
// 获取Sheet1工作表
sheet := "Sheet1"
rows, err := f.GetRows(sheet)
if err != nil {
fmt.Println(err.Error())
return
}
for _, row := range rows {
for _, cell := range row {
fmt.Printf("%s\t", cell)
}
fmt.Println()
}
}
上述代码使用GetRows方法获取指定工作表的所有行数据,返回一个二维字符串切片,通过两层循环遍历切片,打印出每个单元格的值。
四、设置单元格样式
excelize库还支持设置单元格样式,如字体、颜色、对齐方式等。以下是一个设置单元格字体加粗、背景色为黄色的示例:
package main
import (
"github.com/360EntSecGroup-Skylar/excelize"
)
func main() {
f := excelize.NewFile()
index := f.NewSheet("Sheet1")
f.SetCellValue("Sheet1", "A1", "标题")
// 创建样式
style, err := f.NewStyle(`{"font":{"bold":true},"fill":{"type":"pattern","color":["#FFFF00"],"pattern":1}}`)
if err != nil {
println(err.Error())
return
}
// 应用样式到单元格
if err := f.SetCellStyle("Sheet1", "A1", "A1", style); err != nil {
println(err.Error())
return
}
f.SetActiveSheet(index)
if err := f.SaveAs("style_example.xlsx"); err != nil {
println(err.Error())
}
}
在这个例子中,先通过NewStyle方法创建一个样式对象,传入 JSON 格式的样式配置,定义字体加粗和背景色。然后使用SetCellStyle方法将样式应用到指定的单元格区域。
五、使用公式
excelize库支持在 Excel 文件中使用公式。例如,在单元格中设置求和公式:
package main
import (
"github.com/360EntSecGroup-Skylar/excelize"
)
func main() {
f := excelize.NewFile()
index := f.NewSheet("Sheet1")
f.SetCellValue("Sheet1", "A1", 10)
f.SetCellValue("Sheet1", "A2", 20)
// 设置公式
f.SetCellFormula("Sheet1", "A3", "SUM(A1:A2)")
f.SetActiveSheet(index)
if err := f.SaveAs("formula_example.xlsx"); err != nil {
println(err.Error())
}
}
通过SetCellFormula方法,指定工作表、单元格和公式内容,即可在 Excel 文件中使用公式进行计算。
掌握excelize库的这些用法,在 Go 语言中处理 Excel 文件将变得更加轻松高效。无论是简单的数据读写,还是复杂的样式设置与公式应用,都能满足实际开发需求。在实际应用中,你还可以根据具体场景进一步探索和使用该库的更多功能。