在筆者開發的項目中,有操作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 文件將變得更加輕松高效。無論是簡單的數據讀寫,還是復雜的樣式設置與公式應用,都能滿足實際開發需求。在實際應用中,你還可以根據具體場景進一步探索和使用該庫的更多功能。?