关键术语介绍

为了方便开源库的快速上手,我们先来了解 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语言与技术原理。

Golang是如何操作excel的?的更多相关文章

  1. 免费高效实用的.NET操作Excel组件NPOI(.NET组件介绍之六)

    很多的软件项目几乎都包含着对文档的操作,前面已经介绍过两款操作文档的组件,现在介绍一款文档操作的组件NPOI. NPOI可以生成没有安装在您的服务器上的Microsoft Office套件的Excel ...

  2. C#通过NPOI操作Excel

    参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-post.html http://www.yuanjiaocheng.net/w ...

  3. POI操作Excel

    POI和Excel简介 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作 ...

  4. NPOI操作EXCEL(六)——矩阵类表头EXCEL模板的解析

    哈哈~~~很高兴还活着.总算加班加点的把最后一类EXCEL模板的解析做完了... 前面几篇文章介绍了博主最近项目中对于复杂excel表头的解析,写得不好,感谢园友们的支持~~~ 今天再简单讲诉一下另一 ...

  5. VB操作EXCEL文件

    用VB操作Excel(VB6.0)(整理) 首先创建Excel对象,使用ComObj:Dim ExcelID as Excel.ApplicationSet ExcelID as new Excel. ...

  6. VB.NET操作Excel

    VB.NET操作Excel的基本方法与例子:

  7. C# 操作excel单元格居中

    C# 操作excel //导出Excel        private void ExportExcel(string fileName, System.Data.DataTable myDGV, s ...

  8. NPOI操作Excel辅助类

    /// <summary> /// NPOI操作excel辅助类 /// </summary> public static class NPOIHelper { #region ...

  9. JAVA的POI操作Excel

    1.1Excel简介 一个excel文件就是一个工作簿workbook,一个工作簿中可以创建多张工作表sheet,而一个工作表中包含多个单元格Cell,这些单元格都是由列(Column)行(Row)组 ...

随机推荐

  1. Codeforces1249E By Elevator or Stairs?

    题意 给定整数c和数组a,b,\(a_i\)表示通过爬楼梯的方法从第\(i\)层到\(i+1\)层需要的时间,\(b_i\)表示通过坐电梯的方法从第\(i\)层到\(i+1\)层需要的时间,坐电梯前需 ...

  2. HTTPS建立过程

    由于HTTPS建立过程经常忘记,固记录 HTTPS建立流程 客户端发起SSL连接 服务端发送证书(证书中包含了服务端公钥) 客户端根据已有证书判断是否是可信任的(客户端决定是否继续) 服务端要求客户端 ...

  3. JS数组去重的实现

    其实数组去重的实现就分为两大类 利用语法自身键不可重复性 利用循环(递归)和数组方法使用不同的api来处理. 注意️:下列封装成方法的要在函数开始增加类型检测,为了让去重的实现代码更加简单易懂,封装时 ...

  4. go http请求流程分析

    前言 golang作为常驻进程, 请求第三方服务或者资源(http, mysql, redis等)完毕后, 需要手动关闭连接, 否则连接会一直存在; 连接池是用来管理连接的, 请求之前从连接池里获取连 ...

  5. 【python】itchat登录微信获取好友签名并生成词云

    在知乎上看到一篇关于如何使用itchat统计微信好友男女比例并使用plt生成柱状图以及获取微信好友签名并生成词云的文章https://zhuanlan.zhihu.com/p/36361397,感觉挺 ...

  6. Spring Boot 启动第一个页面(Spring二)

    在前面的文章里我配置好了spring boot的环境,并选择STS开发工具 具体文章见:https://blog.csdn.net/qq_38175040/article/details/105481 ...

  7. [程序员代码面试指南]字符串问题-回文最少分割数(DP)

    问题描述 给定一个字符串,输出把它全部切成回文子串的最小分割数. 例:str="ACDCDCDAD",输出2. 解题思路 DP 存储结构 dp数组dp[len+1],dp[i]表示 ...

  8. Redis必须会的知识点

    Nosql:非关系型数据库 分表分库 + 水平拆分 + mysql集群: 在Memcached的高速缓存,Mysql主从复制.读写分离的基础上,由于MyISAM使用表锁,高并发Mysql应用开始使用I ...

  9. 云计算openstack——虚拟机获取不到ip(13)

    一.现象描述: openstack平台中创建虚拟机后,虚拟机在web页面中显示获取到了ip,但是打开虚拟机控制台后查看网络状态,虚拟机没有ip地址,下图为故障截图: 二.分析思路: (1)查看neut ...

  10. Java Web学习(八)RESTful设计

    一.RESTful设计风格 REST :指的是一组架构约束条件和原则. RESTful :满足这些约束条件和原则的应用程序或设计就是 . REST 原则 客户端和服务器之间的交互在请求之间是无状态的. ...