Golang操作excel的技巧与方法

 更新时间:2024年05月22日 09:28:37   作者:马里嗷  
在Golang中操作Excel可以包括读取、写入和编辑Excel文件,你可以定义函数或方法来执行这些操作,本文给大家介绍了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())
	}
}

以上就是Golang操作excel的技巧与方法的详细内容,更多关于Golang操作excel的资料请关注脚本之家其它相关文章!

相关文章

  • GO语言基本数据类型总结

    GO语言基本数据类型总结

    这篇文章主要介绍了GO语言基本数据类型,较为详细的总结了GO语言的基本数据类型,对于GO语言的学习有一定的借鉴参考价值,需要的朋友可以参考下
    2014-12-12
  • GoFrame gredis配置文件及配置方法对比

    GoFrame gredis配置文件及配置方法对比

    这篇文章主要为大家介绍了GoFrame gredis配置管理中,配置文件及配置方法对比,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • go将request body绑定到不同的结构体中教程

    go将request body绑定到不同的结构体中教程

    这篇文章主要为大家介绍了go将request body绑定到不同的结构体中教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 浅谈Go切片的值修改是否会覆盖数组的值 

    浅谈Go切片的值修改是否会覆盖数组的值 

    本文主要介绍了浅谈Go切片的值修改是否会覆盖数组的值,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 
    2022-02-02
  • golang两种调用rpc的方法

    golang两种调用rpc的方法

    这篇文章主要介绍了golang两种调用rpc的方法,结合实例形式分析了Go语言调用rpc的原理与实现方法,需要的朋友可以参考下
    2016-07-07
  • 详解如何使用unsafe标准库突破Golang中的类型限制

    详解如何使用unsafe标准库突破Golang中的类型限制

    在使用c语言编程时,常常因为类型的问题大伤脑筋,而,golang提供了一些方式用于喜欢hack的用户,下面我们就来讲讲如何使用unsafe标准库突破Golang中的类型限制吧
    2024-03-03
  • Go语言流程控制语句

    Go语言流程控制语句

    这篇文章介绍了Go语言流程控制语句的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Go标准库http与fasthttp服务端性能对比场景分析

    Go标准库http与fasthttp服务端性能对比场景分析

    这篇文章主要介绍了Go标准库http与fasthttp服务端性能比较,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • GO 语言运行环境的基础知识

    GO 语言运行环境的基础知识

    这篇文章主要介绍了GO 语言运行环境的基础知识的相关资料,需要的朋友可以参考下
    2022-09-09
  • Go泛型的理解和使用小结

    Go泛型的理解和使用小结

    泛型是一种非常强大的编程技术,可以提高代码的复用性和可读性,通过泛型容器和类型参数化,Go语言中的泛型可以实现更加灵活和通用的编程,提高代码的复用性和可维护性,本文给大家介绍Go泛型的理解和使用,感兴趣的朋友一起看看吧
    2023-12-12

最新评论