關鍵術語介紹
為了方便開源庫的快速上手,我們先來了解 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 = "https://www.cnblogs.com/pingyeaa/p/姓名"
如何創建第二個單元格呢?原理相同,此處 cell 變數已定義,再創建新單元格只需賦值即可,
cell = row.AddCell()
cell.Value = "https://www.cnblogs.com/pingyeaa/p/性別"
表頭已經設定好了,可以開始創建第二行來填充內容了,方式與上述無差別,
row = sheet.AddRow()
cell = row.AddCell()
cell.Value = "https://www.cnblogs.com/pingyeaa/p/張三"
cell = row.AddCell()
cell.Value = "https://www.cnblogs.com/pingyeaa/p/男"
表格設定完成后,將該檔案保存,檔案名可自定義,
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 = "https://www.cnblogs.com/pingyeaa/p/姓名"
cell = row.AddCell()
cell.Value = "https://www.cnblogs.com/pingyeaa/p/性別"
row = sheet.AddRow()
cell = row.AddCell()
cell.Value = "https://www.cnblogs.com/pingyeaa/p/張三"
cell = row.AddCell()
cell.Value = "https://www.cnblogs.com/pingyeaa/p/男"
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 = "https://www.cnblogs.com/pingyeaa/p/李四"
上述代碼將第二行的張三改為了李四,但這還沒有結束,接下來需要將檔案重新保存,
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 = "https://www.cnblogs.com/pingyeaa/p/李四"
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())
}
}
我是平也,這有一個專注Gopher技術成長的開源專案「go home」
感謝大家的觀看,如果覺得文章對你有所幫助,歡迎關注公眾號「平也」,聚焦Go語言與技術原理,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/168038.html
標籤:Go
下一篇:網路協議入門
