设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间18 现在时间18 缓存数据 你我最后竟然也平凡到自命不凡。

你我最后竟然也平凡到自命不凡。 -- 像我这样的人

查看: 796|回复: 2

Golang操作excel的技巧与方法

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:205
  • 打卡月天数:0
  • 打卡总奖励:3145
  • 最近打卡:2023-08-27 06:20:46
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
421
主题
386
精华
0
金钱
4389
积分
829
注册时间
2022-12-21
最后登录
2025-3-13

发表于 2024-5-23 05:47:03 | 显示全部楼层 |阅读模式
目录


  • 关键术语介绍
  • 创建表格
  • 读取表格
  • 修改表格
  • 样式设置

关键术语介绍

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

正常情况下,创建一个表格的基本流程是打开 wps 点击新建,这时会默认创建一个 sheet,然后在该 sheet 中的第一行填写表头,接下来根据表头逐行填充内容,最后将文件另存为到硬盘的某个位置。这与 Golang 开源库创建 excel 的流程基本相同,下面演示一个极简表格的创建。

创建表格

创建表格前需要先引入 excel 库,我们以比较热门的 tealeg/xlsx 库为例。
  1. go get github.com/tealeg/xlsx
复制代码
首先创建一个空文件,拿到文件句柄。
  1. file := xlsx.NewFile()
复制代码
创建一个名为
  1. 人员信息收集
复制代码
的 sheet。
  1. sheet, err := file.AddSheet("人员信息收集")
  2. if err != nil {
  3.   panic(err.Error())
  4. }
复制代码
然后为该 sheet 创建一行,这行作为我们的表头。
  1. row := sheet.AddRow()
复制代码
在该行中创建一个单元格。
  1. cell := row.AddCell()
复制代码
现在给单元格填充内容,因为是表头,暂且叫
  1. 姓名
复制代码
  1. cell.Value = "姓名"
复制代码
如何创建第二个单元格呢?原理相同,此处 cell 变量已定义,再创建新单元格只需赋值即可。
  1. cell = row.AddCell()
  2. cell.Value = "性别"
复制代码
表头已经设置好了,可以开始创建第二行来填充内容了,方式与上述无差别。
  1. row = sheet.AddRow()
  2. cell = row.AddCell()
  3. cell.Value = "张三"
  4. cell = row.AddCell()
  5. cell.Value = "男"
复制代码
表格设置完成后,将该文件保存,文件名可自定义。
  1. err = file.Save("demo.xlsx")
  2. if err != nil {
  3.   panic(err.Error())
  4. }
复制代码
跑起来后,可以发现目录中多了一个 demo.xlsx 文件,打开预览内容如下,达到了预期效果。
2.png

文件源码
  1. package main

  2. import "github.com/tealeg/xlsx"

  3. func main() {
  4.         file := xlsx.NewFile()
  5.         sheet, err := file.AddSheet("人员信息收集")
  6.         if err != nil {
  7.                 panic(err.Error())
  8.         }
  9.         row := sheet.AddRow()
  10.         cell := row.AddCell()
  11.         cell.Value = "姓名"
  12.         cell = row.AddCell()
  13.         cell.Value = "性别"

  14.         row = sheet.AddRow()
  15.         cell = row.AddCell()
  16.         cell.Value = "张三"
  17.         cell = row.AddCell()
  18.         cell.Value = "男"

  19.         err = file.Save("demo.xlsx")
  20.         if err != nil {
  21.                 panic(err.Error())
  22.         }
  23. }
复制代码
读取表格

表格的读取比创建简单很多,依然以上文创建的文件为例。
  1. output, err := xlsx.FileToSlice("demo.xlsx")
  2. if err != nil {
  3.   panic(err.Error())
  4. }
复制代码
只需将文件路径传入上述方法,即可自动读取并返回一个三维切片,我们来读取第一个 sheet 的第二行中的第一个单元格。
  1. log.Println(output[0][1][1]) //Output: 男
复制代码
由此一来就非常容易遍历了。
  1. for rowIndex, row := range output[0] {
  2.   for cellIndex, cell := range row {
  3.     log.Println(fmt.Sprintf("第%d行,第%d个单元格:%s", rowIndex+1, cellIndex+1, cell))
  4.   }
  5. }
复制代码
  1. 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个单元格:男
复制代码
文件源码
  1. package main

  2. import (
  3.         "fmt"
  4.         "github.com/tealeg/xlsx"
  5.         "log"
  6. )

  7. func main() {
  8.         output, err := xlsx.FileToSlice("demo.xlsx")
  9.         if err != nil {
  10.                 panic(err.Error())
  11.         }
  12.         log.Println(output[0][1][1])
  13.         for rowIndex, row := range output[0] {
  14.                 for cellIndex, cell := range row {
  15.                         log.Println(fmt.Sprintf("第%d行,第%d个单元格:%s", rowIndex+1, cellIndex+1, cell))
  16.                 }
  17.         }
  18. }
复制代码
修改表格

只是读取表格内容可能在特定场景下无法满足需求,有时候需要对表格内容进行更改。
  1. file, err := xlsx.OpenFile("demo.xlsx")
  2. if err != nil {
  3.   panic(err.Error())
  4. }
复制代码
修改表格之前依然需要先读取文件,只是这次并没有直接将其转化为三维切片。拿到文件句柄后,可以直接修改某一行的内容。
  1. file.Sheets[0].Rows[1].Cells[0].Value = "李四"
复制代码
上述代码将第二行的张三改为了李四,但这还没有结束,接下来需要将文件重新保存。
  1. err = file.Save("demo.xlsx")
  2. if err != nil {
  3.   panic(err.Error())
  4. }
复制代码
打开文件预览,可以看到已经成功将张三改为了李四。
3.png

文件源码
  1. package main

  2. import "github.com/tealeg/xlsx"

  3. func main() {
  4.         file, err := xlsx.OpenFile("demo.xlsx")
  5.         if err != nil {
  6.                 panic(err.Error())
  7.         }
  8.         file.Sheets[0].Rows[1].Cells[0].Value = "李四"
  9.         err = file.Save("demo.xlsx")
  10.         if err != nil {
  11.                 panic(err.Error())
  12.         }
  13. }
复制代码
样式设置

该开源库不仅支持内容的编辑,还支持表格的样式设置,样式统一由结构体 Style 来负责。
  1. type Style struct {
  2.         Border          Border
  3.         Fill            Fill
  4.         Font            Font
  5.         ApplyBorder     bool
  6.         ApplyFill       bool
  7.         ApplyFont       bool
  8.         ApplyAlignment  bool
  9.         Alignment       Alignment
  10.         NamedStyleIndex *int
  11. }
复制代码
拿上述生成的文件为例,假如我要将姓名所在单元格居中,首先要实例化样式对象。
  1. style := xlsx.NewStyle()
复制代码
赋值居中属性。
  1. style.Alignment = xlsx.Alignment{
  2.   Horizontal:   "center",
  3.   Vertical:     "center",
  4. }
复制代码
给第一行第一个单元格设置样式。
  1. file.Sheets[0].Rows[0].Cells[0].SetStyle(style)
复制代码
与修改表格处理逻辑相同,最后保存文件。
  1. err = file.Save("demo.xlsx")
  2. if err != nil {
  3.   panic(err.Error())
  4. }
复制代码
打开预览,可以看到文字已经上下左右居中。
4.png

同理,可以修改文字颜色和背景,同样通过 style 的属性来设置。
  1. style.Font.Color = xlsx.RGB_Dark_Red
  2. style.Fill.BgColor = xlsx.RGB_Dark_Green
复制代码
5.png

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

  2. import "github.com/tealeg/xlsx"

  3. func main() {
  4.         file, err := xlsx.OpenFile("demo.xlsx")
  5.         if err != nil {
  6.                 panic(err.Error())
  7.         }
  8.         style := xlsx.NewStyle()
  9.         style.Font.Color = xlsx.RGB_Dark_Red
  10.         style.Fill.BgColor = xlsx.RGB_Dark_Green
  11.         style.Alignment = xlsx.Alignment{
  12.                 Horizontal:   "center",
  13.                 Vertical:     "center",
  14.         }
  15.         file.Sheets[0].Rows[0].Cells[0].SetStyle(style)
  16.         err = file.Save("demo.xlsx")
  17.         if err != nil {
  18.                 panic(err.Error())
  19.         }
  20. }
复制代码
以上就是Golang操作excel的技巧与方法的详细内容,更多关于Golang操作excel的资料请关注晓枫资讯其它相关文章!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
18
积分
16
注册时间
2022-12-25
最后登录
2022-12-25

发表于 2024-11-22 04:34:04 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
11
积分
2
注册时间
2025-1-14
最后登录
2025-1-14

发表于 2025-4-20 17:07:09 | 显示全部楼层
感谢楼主,顶。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表