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

    我是平也,这有一个专注Gopher技术成长的开源项目「go home」


    感谢大家的观看,如果觉得文章对你有所帮助,欢迎关注公众号「平也」,聚焦Go语言与技术原理。
    关注我

  • 相关阅读:
    解决Bootstrap 试用手机端 布满全屏
    微信服务号认证流程
    微信回复文本超链接
    (4.28)for xml path 在合并拆分上的作用演示
    (4.27)查看存储过程中的依赖关系
    链接服务器XXX的OLE DB提供程序“SQLNCLI”无法启动分布式事务“
    (4.26)sql server存储过程优化
    (4.25)格式化T-SQL工具
    (4.24)sql server变量中set与select的区别
    (4.23)sql server区分大小写的检索
  • 原文地址:https://www.cnblogs.com/pingyeaa/p/13799207.html
Copyright © 2020-2023  润新知