Golang操作excel的方法

作者:平也的技术博 时间:2024-04-25 15:29:50 

关键术语介绍

为了方便开源库的快速上手,我们先来了解 excel 中的几个关键术语,如下图所示,①为sheet,也就是表格中的页签;②为row,代表 excel 中的一行;③为cell,代表 excel 中的一个单元格。

Golang操作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 文件,打开预览内容如下,达到了预期效果。

Golang操作excel的方法

文件源码


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

打开文件预览,可以看到已经成功将张三改为了李四。

Golang操作excel的方法

文件源码


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

打开预览,可以看到文字已经上下左右居中。

Golang操作excel的方法

同理,可以修改文字颜色和背景,同样通过 style 的属性来设置。


style.Font.Color = xlsx.RGB_Dark_Red
style.Fill.BgColor = xlsx.RGB_Dark_Green

Golang操作excel的方法

其他还有很多属性可以设置,比如合并单元格、字体、大小等等,大家可以自行测试。

文件源码


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」

来源:https://www.cnblogs.com/pingyeaa/p/13799207.html

标签:Golang,操作,excel
0
投稿

猜你喜欢

  • SQL Server 触发器 表的特定字段更新时,触发Update触发器

    2024-01-25 09:32:20
  • Python里disconnect UDP套接字的方法

    2023-03-26 02:48:00
  • oracle 优化的一点体会

    2009-10-02 17:59:00
  • Python Django切换MySQL数据库实例详解

    2024-01-21 02:02:47
  • 关于Python 3中print函数的换行详解

    2021-04-09 09:57:48
  • DWCS3-CSS布局之一CSS规则大纲

    2008-06-11 18:48:00
  • JSON文件及Python对JSON文件的读写操作

    2022-06-18 17:33:51
  • MSSQL ISQL命令详解

    2024-01-26 23:50:49
  • Go并发编程中sync/errGroup的使用

    2024-02-05 04:40:56
  • Python实现的凯撒密码算法示例

    2022-10-14 08:47:28
  • 如何用Axure制作Tab页签

    2009-02-08 17:53:00
  • Python列表去重的几种方法整理

    2022-06-18 18:05:17
  • PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明

    2023-11-24 06:26:11
  • Python实现从多表格中随机抽取数据

    2022-07-01 01:58:18
  • IE9四大渲染引擎模式

    2010-04-20 16:57:00
  • Python学习之列表常用方法总结

    2021-11-24 18:43:19
  • PHP中的traits实现代码复用使用实例

    2023-11-22 04:27:55
  • JavaScript实现年历效果

    2023-09-10 10:53:26
  • python安装库的最详细方法(以安装pygame库为例)

    2021-03-08 04:29:40
  • 解析scratch3.0二次开发之scratch-blocks免编译修改问题

    2022-10-18 22:36:57
  • asp之家 网络编程 m.aspxhome.com