介紹
Excelize是一個純Go編寫的庫,提供了一組功能,允許你向XLAM / XLSM / XLSX / XLTM / XLTX文件寫入和讀取。支持讀取和寫入由Microsoft Excel? 2007及更高版本生成的電子表格文檔。通過高度兼容性支持復雜組件,并提供了流式API,用于生成或從包含大量數(shù)據(jù)的工作表中讀取數(shù)據(jù)。此庫需要Go版本1.16或更高版本??梢允褂肎o的內(nèi)置文檔工具查看完整文檔,也可以在go.dev和文檔引用中在線查閱。
另外還有另外一個庫:github.com/360EntSecGroup-Skylar/excelize/v2,不過它已經(jīng)沒了,或者說它和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
快速開始
創(chuàng)建 Excel 文檔
package main
import (
"fmt"
"github.com/xuri/excelize/v2"
)
func main() {
f := excelize.NewFile()
defer func() {
if err := f.Close(); err != nil {
fmt.Println(err)
}
}()
// 創(chuàng)建一個工作表
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)
// 根據(jù)指定路徑保存文件
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()
}
}
打開數(shù)據(jù)流
OpenReader 從 io.Reader 讀取數(shù)據(jù)流。、
創(chuàng)建一個簡單的 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 通過給定的工作表名稱返回流式寫入器,用于向已存在的空白工作表寫入大規(guī)模數(shù)據(jù)。請注意通過此方法按行向工作表寫入數(shù)據(jù)后,必須調(diào)用 Flush 函數(shù)來結束流式寫入過程,并需要確保所寫入的行號是遞增的,普通函數(shù)不能與流式函數(shù)混合使用在工作表中寫入數(shù)據(jù)。寫入過程中內(nèi)存數(shù)據(jù)超過 16MB 時,流寫入器將嘗試使用磁盤上的臨時文件來減少內(nèi)存使用,此時您無法獲取單元格值。例如,向工作表流式按行寫入 102400 行 x 50 列帶有樣式的數(shù)據(jù):
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 通過給定的起始坐標和指向數(shù)組類型“切片”的指針將數(shù)據(jù)按行流式寫入工作表中。請注意,在設置行之后,必須調(diào)用 Flush 函數(shù)來結束流式寫入過程,并需要確所保寫入的行號是遞增的。文章來源:http://www.zghlxwxcb.cn/news/detail-652624.html
相關 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 行純文本單元格的性能表現(xiàn)。文章來源地址http://www.zghlxwxcb.cn/news/detail-652624.html
到了這里,關于golang操作excel的高性能庫——excelize/v2的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!