您好,登錄后才能下訂單哦!
Golang如何實現操作excel?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
關鍵術語介紹
為了方便開源庫的快速上手,我們先來了解 excel 中的幾個關鍵術語,如下圖所示,①為sheet,也就是表格中的頁簽;②為row,代表 excel 中的一行;③為cell,代表 excel 中的一個單元格。
正常情況下,創建一個表格的基本流程是打開 wps 點擊新建,這時會默認創建一個 sheet,然后在該 sheet 中的第一行填寫表頭,接下來根據表頭逐行填充內容,最后將文件另存為到硬盤的某個位置。這與 Golang 開源庫創建 excel 的流程基本相同,下面演示一個極簡表格的創建。
創建表格
創建表格前需要先引入 excel 庫,我們以比較熱門的 tealeg/xlsx 庫為例。
go get github.com/tealeg/xlsx
首先創建一個空文件,拿到文件句柄。
file := xlsx.NewFile()
創建一個名為人員信息收集
的 sheet。
sheet, err := file.AddSheet("人員信息收集") if err != nil { panic(err.Error()) }
然后為該 sheet 創建一行,這行作為我們的表頭。
row := sheet.AddRow()
在該行中創建一個單元格。
cell := row.AddCell()
現在給單元格填充內容,因為是表頭,暫且叫姓名
。
cell.Value = "姓名"
如何創建第二個單元格呢?原理相同,此處 cell 變量已定義,再創建新單元格只需賦值即可。
cell = row.AddCell() cell.Value = "性別"
表頭已經設置好了,可以開始創建第二行來填充內容了,方式與上述無差別。
row = sheet.AddRow() cell = row.AddCell() cell.Value = "張三" cell = row.AddCell() cell.Value = "男"
表格設置完成后,將該文件保存,文件名可自定義。
err = file.Save("demo.xlsx") if err != nil { panic(err.Error()) }
跑起來后,可以發現目錄中多了一個 demo.xlsx 文件,打開預覽內容如下,達到了預期效果。
文件源碼
package main import "github.com/tealeg/xlsx" func main() { file := xlsx.NewFile() sheet, err := file.AddSheet("人員信息收集") if err != nil { panic(err.Error()) } row := sheet.AddRow() cell := row.AddCell() cell.Value = "姓名" cell = row.AddCell() cell.Value = "性別" row = sheet.AddRow() cell = row.AddCell() cell.Value = "張三" cell = row.AddCell() cell.Value = "男" err = file.Save("demo.xlsx") if err != nil { panic(err.Error()) } }
讀取表格
表格的讀取比創建簡單很多,依然以上文創建的文件為例。
output, err := xlsx.FileToSlice("demo.xlsx") if err != nil { panic(err.Error()) }
只需將文件路徑傳入上述方法,即可自動讀取并返回一個三維切片,我們來讀取第一個 sheet 的第二行中的第一個單元格。
log.Println(output[0][1][1]) //Output: 男
由此一來就非常容易遍歷了。
for rowIndex, row := range output[0] { for cellIndex, cell := range row { log.Println(fmt.Sprintf("第%d行,第%d個單元格:%s", rowIndex+1, cellIndex+1, cell)) } }
2020/10/11 16:15:29 第1行,第1個單元格:姓名
2020/10/11 16:15:29 第1行,第2個單元格:性別
2020/10/11 16:15:29 第2行,第1個單元格:張三
2020/10/11 16:15:29 第2行,第2個單元格:男
文件源碼
package main import ( "fmt" "github.com/tealeg/xlsx" "log" ) func main() { output, err := xlsx.FileToSlice("demo.xlsx") if err != nil { panic(err.Error()) } log.Println(output[0][1][1]) for rowIndex, row := range output[0] { for cellIndex, cell := range row { log.Println(fmt.Sprintf("第%d行,第%d個單元格:%s", rowIndex+1, cellIndex+1, cell)) } } }
修改表格
只是讀取表格內容可能在特定場景下無法滿足需求,有時候需要對表格內容進行更改。
file, err := xlsx.OpenFile("demo.xlsx") if err != nil { panic(err.Error()) }
修改表格之前依然需要先讀取文件,只是這次并沒有直接將其轉化為三維切片。拿到文件句柄后,可以直接修改某一行的內容。
file.Sheets[0].Rows[1].Cells[0].Value = "李四"
上述代碼將第二行的張三改為了李四,但這還沒有結束,接下來需要將文件重新保存。
err = file.Save("demo.xlsx") if err != nil { panic(err.Error()) }
打開文件預覽,可以看到已經成功將張三改為了李四。
文件源碼
package main import "github.com/tealeg/xlsx" func main() { file, err := xlsx.OpenFile("demo.xlsx") if err != nil { panic(err.Error()) } file.Sheets[0].Rows[1].Cells[0].Value = "李四" err = file.Save("demo.xlsx") if err != nil { panic(err.Error()) } }
樣式設置
該開源庫不僅支持內容的編輯,還支持表格的樣式設置,樣式統一由結構體 Style 來負責。
type Style struct { Border Border Fill Fill Font Font ApplyBorder bool ApplyFill bool ApplyFont bool ApplyAlignment bool Alignment Alignment NamedStyleIndex *int }
拿上述生成的文件為例,假如我要將姓名所在單元格居中,首先要實例化樣式對象。
style := xlsx.NewStyle()
賦值居中屬性。
style.Alignment = xlsx.Alignment{ Horizontal: "center", Vertical: "center", }
給第一行第一個單元格設置樣式。
file.Sheets[0].Rows[0].Cells[0].SetStyle(style)
與修改表格處理邏輯相同,最后保存文件。
err = file.Save("demo.xlsx") if err != nil { panic(err.Error()) }
打開預覽,可以看到文字已經上下左右居中。
同理,可以修改文字顏色和背景,同樣通過 style 的屬性來設置。
style.Font.Color = xlsx.RGB_Dark_Red style.Fill.BgColor = xlsx.RGB_Dark_Green
其他還有很多屬性可以設置,比如合并單元格、字體、大小等等,大家可以自行測試。
文件源碼
package main import "github.com/tealeg/xlsx" func main() { file, err := xlsx.OpenFile("demo.xlsx") if err != nil { panic(err.Error()) } style := xlsx.NewStyle() style.Font.Color = xlsx.RGB_Dark_Red style.Fill.BgColor = xlsx.RGB_Dark_Green style.Alignment = xlsx.Alignment{ Horizontal: "center", Vertical: "center", } file.Sheets[0].Rows[0].Cells[0].SetStyle(style) err = file.Save("demo.xlsx") if err != nil { panic(err.Error()) } }
關于Golang如何實現操作excel問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。