一文帶你搞懂Go如何讀寫Excel文件
Excelize是一個用純Go語言編寫的庫,提供了一組函數(shù),可以對XLAM / XLSM / XLSX / XLTM / XLTX文件進行讀寫。支持讀寫由Microsoft Excel™2007及以后版本生成的電子表格文檔。通過高兼容性支持復雜組件,并提供流API從具有大量數(shù)據(jù)的工作表中生成或讀取數(shù)據(jù)。該庫需要Go 1.16或更高版本。
那么本篇文章將會介紹我們操作Excel的常用功能,如下:
- 生成一個新的Excel文件
- 向Excel文件中追加內容
- 解析Excel文件內容
- 使用Http協(xié)議上傳并解析Excel文件
- 使用Http協(xié)議將數(shù)據(jù)轉換為Excel文件并下載
1.下載依賴庫
go get github.com/xuri/excelize # Go Modules使用這個命令 go get github.com/xuri/excelize/v2
2.具體操作
2.1 生成一個新的Excel文件
func WriteNewExcel() {
f := excelize.NewFile()
// 創(chuàng)建一個sheet
index := f.NewSheet("Sheet2")
// 根據(jù)sheet和坐標 確定一個值
// 例如f.SetCellValue("Sheet2", "A2", "Hello world.")就是在Sheet表中A列第2行的格子里填入Hello world.
f.SetCellValue("Sheet2", "A2", "Hello world.")
f.SetCellValue("Sheet1", "B1", 100)
f.SetCellValue("Sheet1", "B2", 100)
// 將新的sheet添加到Excel中
f.SetActiveSheet(index)
// 保存Excel
if err := f.SaveAs("Book1.xlsx"); err != nil {
fmt.Println(err)
}
}
2.2 向Excel文件中追加內容
func WriteExcel() {
f, _ := excelize.OpenFile("Book1.xlsx")
index := f.NewSheet("Sheet2")
f.SetCellValue("Sheet2", "A2", "Hello world.")
f.SetCellValue("Sheet1", "B1", 100)
f.SetCellValue("Sheet1", "B2", 100)
f.SetActiveSheet(index)
if err := f.SaveAs("Book1.xlsx"); err != nil {
fmt.Println(err)
}
}
2.3 解析Excel文件內容
func ReadExcel() {
f, err := excelize.OpenFile("Book1.xlsx")
if err != nil {
fmt.Println(err)
return
}
defer func() {
if err := f.Close(); err != nil {
fmt.Println(err)
}
}()
// 根據(jù)sheet和坐標讀取某一個格子的值
cell, err := f.GetCellValue("Sheet1", "B2")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(cell)
// 按行讀取全部
rows, err := f.GetRows("Sheet1")
if err != nil {
fmt.Println(err)
return
}
for _, row := range rows {
for _, colCell := range row {
fmt.Print(colCell, "\t")
}
fmt.Println()
}
}
2.4 使用Http協(xié)議上傳并解析Excel文件
func HttpReadExcel() {
f := func(read io.Reader) {
file, err := excelize.OpenReader(read)
if err != nil {
fmt.Println(err)
return
}
for _, item := range file.GetSheetList() {
rows, _ := file.GetRows(item)
// rows是一個二維數(shù)組
for i := range rows {
strs := rows[i]
for j := range strs {
str := rows[i][j]
fmt.Println(str)
}
}
}
}
http.HandleFunc("/excel", func(w http.ResponseWriter, r *http.Request) {
file, _, err := r.FormFile("file")
if err != nil {
fmt.Println(err)
return
}
fileBytes, err := ioutil.ReadAll(file)
if err != nil {
fmt.Println(err)
return
}
reader := bytes.NewReader(fileBytes)
f(reader)
w.Write([]byte("Hello Http Get!"))
})
http.ListenAndServe(":8080", nil)
}
2.5 使用Http協(xié)議將數(shù)據(jù)轉換為Excel文件并下載
func HttpDownloadExcel() {
fun := func(fileName string) *bytes.Reader {
f := excelize.NewFile()
f.SetCellValue("Sheet1", "B1", 100)
err := f.SaveAs(fileName)
if err != nil {
fmt.Println(err)
}
var buffer bytes.Buffer
_ = f.Write(&buffer)
return bytes.NewReader(buffer.Bytes())
}
http.HandleFunc("/downloadExcel", func(w http.ResponseWriter, r *http.Request) {
reader := fun("Book2.xlsx")
// 重新設置文件名稱
w.Header().Set("Content-Disposition", "attachment; filename="+"Book2.xlsx")
io.Copy(w, reader)
})
http.ListenAndServe(":8080", nil)
}
3.小總結
以上功能只需靈活擴展后基本上就可以覆蓋大部分業(yè)務了,但是有一點需要注意,在2.5使用Http協(xié)議將數(shù)據(jù)轉換為Excel文件并下載這個操作中,需要將文件進行重命名,這個名稱可以自定義,也可以由服務端指定,但是需要以相關文件類型的名稱做后綴,否則會輸出zip壓縮文件,很難看懂。
到此這篇關于一文帶你搞懂Go如何讀寫Excel文件的文章就介紹到這了,更多相關Go讀寫Excel文件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
GoLang并發(fā)機制探究goroutine原理詳細講解
goroutine是Go語言提供的語言級別的輕量級線程,在我們需要使用并發(fā)時,我們只需要通過 go 關鍵字來開啟 goroutine 即可。這篇文章主要介紹了GoLang并發(fā)機制goroutine原理,感興趣的可以了解一下2022-12-12
Go語言常見錯誤之濫用getters/setters誤區(qū)實例探究
在Go語言編程中,恰如其分地使用getters和setters是至關重要的,過度和不適當?shù)厥褂盟鼈兛赡軐е麓a冗余、可讀性差和封裝不當,在本文中,我們將深入探討如何識別濫用getter和setter的情況,以及如何采取最佳實踐來避免這些常見的Go錯誤2024-01-01

