目錄
- 介紹
- 文檔與源碼
- 安裝
- 快速開始
- 創建 Excel 文檔
- 讀取 Excel 文檔
- 打開數據流
- 流式寫入
- [相關 Excel 開源類庫性能對比](https://xuri.me/excelize/zh-hans/performance.html)
介紹
Excelize是一個純Go編寫的庫,提供了一組功能,允許你向XLAM / XLSM / XLSX / XLTM / XLTX文件寫入和讀取。支持讀取和寫入由Microsoft Excel? 2007及更高版本生成的電子表格文檔。通過高度兼容性支持復雜組件,并提供了流式API,用于生成或從包含大量數據的工作表中讀取數據。此庫需要Go版本1.16或更高版本。可以使用Go的內置文檔工具查看完整文檔,也可以在go.dev和文檔引用中在線查閱。
另外還有另外一個庫:github.com/360EntSecGroup-Skylar/excelize/v2,不過它已經沒了,或者說它和github.com/xuri/excelize/v2是一個東西,用法功能都完全一樣。。。。
文檔與源碼
Github源碼:https://github.com/qax-os/excelize
中文文檔:https://xuri.me/excelize/zh-hans/
安裝
go get github.com/xuri/excelize/v2
快速開始
創建 Excel 文檔
package mainimport ("fmt""github.com/xuri/excelize/v2"
)func main() {f := excelize.NewFile()defer func() {if err := f.Close(); err != nil {fmt.Println(err)}}()// 創建一個工作表index, err := f.NewSheet("Sheet2")if err != nil {fmt.Println(err)return}// 設置單元格的值f.SetCellValue("Sheet2", "A2", "Hello world.")f.SetCellValue("Sheet1", "B2", 100)// 設置工作簿的默認工作表f.SetActiveSheet(index)// 根據指定路徑保存文件if err := f.SaveAs("Book1.xlsx"); err != nil {fmt.Println(err)}
}
讀取 Excel 文檔
package main
import ("fmt""github.com/xuri/excelize/v2""
)
func main() {f, err := excelize.OpenFile("Book1.xlsx")if err != nil {fmt.Println(err)return}// 獲取工作表中指定單元格的值cell, err := f.GetCellValue("Sheet1", "B2")if err != nil {fmt.Println(err)return}// 獲取 Sheet1 上所有單元格rows, err := f.GetRows("Sheet1")for _, row := range rows {for _, colCell := range row {fmt.Print(colCell, "\t")}fmt.Println()}
}
打開數據流
OpenReader 從 io.Reader 讀取數據流。、
創建一個簡單的 HTTP 服務器接收上傳的電子表格文檔,向接收到的電子表格文檔添加新工作表,并返回下載響應:
package main
import ("fmt""net/http""github.com/xuri/excelize/v2""
)
func process(w http.ResponseWriter, req *http.Request) {file, _, err := req.FormFile("file")if err != nil {fmt.Fprintf(w, err.Error())return}defer file.Close()f, err := excelize.OpenReader(file)if err != nil {fmt.Fprintf(w, err.Error())return}f.NewSheet("NewSheet")w.Header().Set("Content-Disposition", "attachment; filename=Book1.xlsx")w.Header().Set("Content-Type", req.Header.Get("Content-Type"))if _, err := f.WriteTo(w); err != nil {fmt.Fprintf(w, err.Error())}return
}
func main() {http.HandleFunc("/process", process)http.ListenAndServe(":8090", nil)
}
流式寫入
func (f *File) NewStreamWriter(sheet string) (*StreamWriter, error)
NewStreamWriter 通過給定的工作表名稱返回流式寫入器,用于向已存在的空白工作表寫入大規模數據。請注意通過此方法按行向工作表寫入數據后,必須調用 Flush 函數來結束流式寫入過程,并需要確保所寫入的行號是遞增的,普通函數不能與流式函數混合使用在工作表中寫入數據。寫入過程中內存數據超過 16MB 時,流寫入器將嘗試使用磁盤上的臨時文件來減少內存使用,此時您無法獲取單元格值。例如,向工作表流式按行寫入 102400 行 x 50 列帶有樣式的數據:
f := excelize.NewFile()
defer func() {if err := f.Close(); err != nil {fmt.Println(err)}
}()
sw, err := f.NewStreamWriter("Sheet1")
if err != nil {fmt.Println(err)return
}
styleID, err := f.NewStyle(&excelize.Style{Font: &excelize.Font{Color: "777777"}})
if err != nil {fmt.Println(err)return
}
// 流式設置單元格的公式和值:
if err := sw.SetRow("A1",[]interface{}{excelize.Cell{StyleID: styleID, Value: "Data"},[]excelize.RichTextRun{{Text: "Rich ", Font: &excelize.Font{Color: "2354e8"}},{Text: "Text", Font: &excelize.Font{Color: "e83723"}},},},// 流式設置單元格的值和行樣式:excelize.RowOpts{Height: 45, Hidden: false}); err != nil {fmt.Println(err)return
}
for rowID := 2; rowID <= 102400; rowID++ {row := make([]interface{}, 50)for colID := 0; colID < 50; colID++ {row[colID] = rand.Intn(640000)}cell, err := excelize.CoordinatesToCellName(1, rowID)if err != nil {fmt.Println(err)break}if err := sw.SetRow(cell, row); err != nil {fmt.Println(err)break}
}
if err := sw.Flush(); err != nil {fmt.Println(err)return
}
if err := f.SaveAs("Book1.xlsx"); err != nil {fmt.Println(err)
}
SetRow 通過給定的起始坐標和指向數組類型“切片”的指針將數據按行流式寫入工作表中。請注意,在設置行之后,必須調用 Flush 函數來結束流式寫入過程,并需要確所保寫入的行號是遞增的。
相關 Excel 開源類庫性能對比
下圖展示了 Go, Python, Java, PHP 和 NodeJS 語言中典型 Excel 開源基礎庫,基于普通個人計算機 (2.6 GHz 6-Core Intel Core i7, 16 GB 2667 MHz DDR4, 500GB SSD, macOS Monterey 12.3.1) 生成 50 列 102400 行純文本單元格的性能表現。