共计 3624 个字符,预计需要花费 10 分钟才能阅读完成。
要害术语介绍
为了不便开源库的疾速上手,咱们先来理解 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())
}
}
我是平也,这有一个专一 Gopher 技术成长的开源我的项目「go home」
感激大家的观看,如果感觉文章对你有所帮忙,欢送关注公众号「平也」,聚焦 Go 语言与技术原理。