关键术语介绍
为了方便开源库的快速上手,我们先来了解 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 = "http://www.cppcns.com/jiaoben/golang/姓名"
如何创建第二个单元格呢?原理相同,此处 cell 变量已定义,再创建新单元格只需赋值即可。
cell = row.AddCell() cell.Value = "http://www.cppcns.com/jiaoben/golang/性别"
表头已经设置好了,可以开始创建第二行来填充内容了,方式与上述无差别。
row = sheet.AddRow() cell = row.AddCell() cell.Value = "http://www.cppcns.com/jiaoben/golang/张三" cell = row.AddCell() cell.Value = "http://www.cppcns.com/jiaoben/golang/男"
表格设置完成后,将该文件保存,文件名可自定义。
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 = "http://www.cppcns.com/jiaoben/golang/姓名" cell = row.AddCell() cell.Value = "http://www.cppcns.com/jiaoben/golang/性别" row = sheet.AddRow() cell = row.AddCell() cell.Value = "http://www.cppcns.com/jiaoben/golang/张三" cell = row.AddCell() cell.Value = "http://www.cppcns.com/jiaoben/golang/男" 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)) } } }Golang操作excel的方法
扫一扫手机访问
