在笔者开发的项目中,有操作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 mainimport ("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 mainimport ("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 mainimport ("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 mainimport ("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 mainimport ("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 mainimport ("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 文件将变得更加轻松高效。无论是简单的数据读写,还是复杂的样式设置与公式应用,都能满足实际开发需求。在实际应用中,你还可以根据具体场景进一步探索和使用该库的更多功能。