Golang是如何操做excel的?

關鍵術語介紹

爲了方便開源庫的快速上手,咱們先來了解 excel 中的幾個關鍵術語,以下圖所示,①爲sheet,也就是表格中的頁籤;②爲row,表明 excel 中的一行;③爲cell,表明 excel 中的一個單元格。git

正常狀況下,建立一個表格的基本流程是打開 wps 點擊新建,這時會默認建立一個 sheet,而後在該 sheet 中的第一行填寫表頭,接下來根據表頭逐行填充內容,最後將文件另存爲到硬盤的某個位置。這與 Golang 開源庫建立 excel 的流程基本相同,下面演示一個極簡表格的建立。github

建立表格

建立表格前須要先引入 excel 庫,咱們以比較熱門的 tealeg/xlsx 庫爲例。shell

go get github.com/tealeg/xlsx

首先建立一個空文件,拿到文件句柄。測試

file := xlsx.NewFile()

建立一個名爲人員信息收集的 sheet。字體

sheet, err := file.AddSheet("人員信息收集")
if err != nil {
  panic(err.Error())
}

而後爲該 sheet 建立一行,這行做爲咱們的表頭。3d

row := sheet.AddRow()

在該行中建立一個單元格。excel

cell := row.AddCell()

如今給單元格填充內容,由於是表頭,暫且叫姓名code

cell.Value = "姓名"

如何建立第二個單元格呢?原理相同,此處 cell 變量已定義,再建立新單元格只需賦值便可。對象

cell = row.AddCell()
cell.Value = "性別"

表頭已經設置好了,能夠開始建立第二行來填充內容了,方式與上述無差異。blog

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())
	}
}

我是平也,這有一個專一Gopher技術成長的開源項目「go home」


感謝你們的觀看,若是以爲文章對你有所幫助,歡迎關注公衆號「平也」,聚焦Go語言與技術原理。
關注我

相關文章
相關標籤/搜索