您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Go语言

Go操作Excel表格

时间:2020-08-05 11:05:15  来源:  作者:

最近工作忙于作图,图表,经常和Excel打交道,这不要读写excel文件。以前都是用Python,现在学习Go语言,刚好试试。

要操作excel,自然需要找读写Excel的Package,前人栽好树,等我去乘凉。

去哪里找合适的Package呢?

Go语言的包在 https://pkg.go.dev/。打开就能搜索。这里录入关键字xlsx(如果需要读写xls则录入xls也可以)。

「GoLang编程」Go操作Excel表格

通过关键字找到需要的包

这里我们使用 github.com/tealeg/xlsx/v3

「GoLang编程」Go操作Excel表格

xlsx 的v3版本

先点击Doc,看下文档。

「GoLang编程」Go操作Excel表格

Document 文档全面解释了包

func FileToSlice ¶

func FileToSlice(path string, options ...FileOption) ([][][]string, error)

A convenient wrApper around File.ToSlice, FileToSlice will return the raw data contained in an Excel XLSX file as three dimensional slice. The first index represents the sheet number, the second the row number, and the third the cell number.

这个函数可以直接打开一个表格文件,读取到一个3维切片中,第一维是sheet表,第二维是行,第三维是列。非常简单方便。

其实我比较讨厌这种包装,因为打开文件之后,何时关闭不受我控制。

「GoLang编程」Go操作Excel表格

这个错误就是表格文件打开后没有关闭,再次打开导致异常

For example:

var mySlice [][][]string
var value string
mySlice = xlsx.FileToSlice("myXLSX.xlsx")
value = mySlice[0][0][0]   //这就是 A1 了,简单吧
value = mySlice[0][0][1]   //这就是 A1 了,简单吧

Here, value would be set to the raw value of the cell A1 in the first sheet in the XLSX file.

如果代码中需要遍历每一个sheet表格,需要range 循环

sheetsn := len(mySlice)   //sheet 个数
rows :=len(mySlice[0])    //行数
cols :=len(mySlice[0][0]) //列数

怎么读excel文件表格内容?

举个例子:

 

「GoLang编程」Go操作Excel表格

准备读的文件

func xlxsreadtotable(pathname string){
    var mySlice [][][]string   
    var err error   
    mySlice ,err= xlsx.FileToSliceUnmerged(pathname)
    value := mySlice[0]
    sheetsn := len(mySlice)   //sheet 个数  
    rows :=len(mySlice[0])    //行数   
    cols :=len(mySlice[0][0]) //列数   
    fmt.Println( value,err)
    fmt.Println( sheetsn,cols,rows)
          //            表 行 列   
    A1 := mySlice[0][0][0]   //这就是 A1   
    B1 := mySlice[0][0][1]   //这就是 B1   
    A2 := mySlice[0][1][0]  //A2   
    B2 := mySlice[0][1][1]  //B2   
    C1 := mySlice[0][0][2]  //C1   
    fmt.Println("A1:",A1,"A2:",A2,"B1:",B1,"B2:",B2,"C1:",C1)
}
「GoLang编程」Go操作Excel表格

 

运行结果:

「GoLang编程」Go操作Excel表格

结果正确

如果使用OpenFile则代码会是这样:

func readxlsx(pathname string)  {
   wb, err := xlsx.OpenFile(pathname)
   if err != nil {panic(err)}
   // wb 引用 workbook   
   fmt.Println("Sheets in this file:")
   for i, sh := range wb.Sheets {
      fmt.Println(i, sh.Name)
   }
   fmt.Println("----")

}

那怎么改写一个excel的内容呢?

func editexlsx(pathname string)  {
       //改写一下某cell   
    wb, _ := xlsx.OpenFile(pathname)

     cell ,_:= wb.Sheet["Sheet1"].Cell(3,3)
     cell.Value ="改写D4"   wb.Save(pathname)
}

运行结果:

「GoLang编程」Go操作Excel表格

D4格子被改写成功

看文档还支持各种,表格格式,字体大小,文字颜色。

func SetDefaultFont ¶ 设置字体和字体大小

func SetDefaultFont(size float64, name string)  

func SkipEmptyCells ¶ 在Row.ForEachCell循环中跳过空cell

func SkipEmptyCells(flags *cellVisitorFlags)

SkipEmptyCells can be passed as an option to Row.ForEachCell in order to make it skip over empty cells in the sheet.

func SkipEmptyRows ¶ 同理也可跳过空行

func SkipEmptyRows(flags *rowVisitorFlags)

SkipEmptyRows can be passed to the Sheet.ForEachRow function to cause it to skip over empty Rows.

读写表格时,从表格得到时间需要用 TimeFromExcelTime()转换。

写表格时,时间需要转换成excel时间 TimeToExcelTime()。

如果表格超大,记得调用一下函数 UseDiskVCellStore(f *File)

如果表格较小,还可以全部放内存来加快表格处理,函数 UseMemoryCellStore(f *File)。

整数行列,可以直接转换到字符串,如下:

y := xlsx.RowIndexToString(2)
x :=xlsx.ColIndexToLetters(3)
   fmt.Println("x3:",x,"  y2:",y)

运行如下:

「GoLang编程」Go操作Excel表格

列索引3 即D,行索引2即第 3行

实际工作中,应该还需要整行写。就需要单独设计一个rowWrite函数,内部实现还是拆成一个个cell去写。

总结,

Go写Excel感觉上比Python还简单。坑少。



Tags:Go语言 Excel表格   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
最近工作忙于作图,图表,经常和Excel打交道,这不要读写excel文件。以前都是用python,现在学习Go语言,刚好试试。要操作excel,自然需要找读写Excel的Package,前人栽好树,等我去乘凉。...【详细内容】
2020-08-05  Tags: Go语言 Excel表格  点击:(88)  评论:(0)  加入收藏
▌简易百科推荐
zip 是一种常见的归档格式,本文讲解 Go 如何操作 zip。首先看看 zip 文件是如何工作的。以一个小文件为例:(类 Unix 系统下)$ cat hello.textHello!执行 zip 命令进行归档:$ zip...【详细内容】
2021-12-17  Go语言中文网    Tags:Go语言   点击:(12)  评论:(0)  加入收藏
大家好,我是 polarisxu。前段时间,Russ Cox 明确了泛型相关的事情,原计划在标准库中加入泛型相关的包,改放到 golang.org/x/exp 下。目前,Go 泛型的主要设计者 ianlancetaylor 完...【详细内容】
2021-11-30  Go语言中文网    Tags:slices 包   点击:(24)  评论:(0)  加入收藏
前言最近因为项目需要写了一段时间的 Go ,相对于 Java 来说语法简单同时又有着一些 Python 之类的语法糖,让人大呼”真香“。 但现阶段相对来说还是 Python 写的多一些,偶尔还...【详细内容】
2021-11-25  crossoverJie    Tags:Go   点击:(29)  评论:(0)  加入收藏
go-micro是基于 Go 语言用于开发的微服务的 RPC 框架,主要功能如下:服务发现,负载均衡 ,消息编码,请求/响应,Async Messaging,可插拔接口,最后这个功能牛p安装步骤安装proto...【详细内容】
2021-09-06    石老师小跟班  Tags:go-micro   点击:(196)  评论:(0)  加入收藏
GoLand 2021.2 EAP 5 现已发布。用户可以从工具箱应用程序中获得 EAP 构建,也可以从官方网站手动下载。并且从此 EAP 开始,只有拥有有效的 JetBrains 帐户才能加入该计划。手...【详细内容】
2021-06-29  IT实战联盟  今日头条  Tags:GoLand   点击:(185)  评论:(0)  加入收藏
作者:HDT3213今天给大家带来的开源项目是 Godis:一个用 Go 语言实现的 Redis 服务器。支持: 5 种数据结构(string、list、hash、set、sortedset) 自动过期(TTL) 发布订阅、地理位...【详细内容】
2021-06-18  HelloGitHub  今日头条  Tags:Go   点击:(125)  评论:(0)  加入收藏
统一规范篇合理规划目录本篇主要描述了公司内部同事都必须遵守的一些开发规矩,如统一开发空间,既使用统一的开发工具来保证代码最后的格式的统一,开发中对文件和代码长度的控制...【详细内容】
2021-05-18  1024课堂    Tags:Go语言   点击:(232)  评论:(0)  加入收藏
闭包概述 闭包不是Go语言独有的概念,在很多编程语言中都有闭包 闭包就是解决局部变量不能被外部访问的一种解决方案 是把函数当作返回值的一种应用 代码演示总体思想:在函数...【详细内容】
2021-05-14  HelloGo  今日头条  Tags:Go语言   点击:(223)  评论:(0)  加入收藏
一时想不开,想了解一下Go语言,于是安装了并体验了一下。下载1. 进入golang.google.cn 点击Download Go 2.选择对应的操作系统,点击后开始下载。 安装1. windows下执行傻瓜式安...【详细内容】
2021-05-12  程序员fearlazy  fearlazy  Tags:Go语言   点击:(236)  评论:(0)  加入收藏
1.简介channel是Go语言的一大特性,基于channel有很多值得探讨的问题,如 channel为什么是并发安全的? 同步通道和异步通道有啥区别? 通道为何会阻塞协程? 使用通道导致阻塞的协程...【详细内容】
2021-05-10  程序员麻辣烫  今日头条  Tags:Go通道   点击:(272)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条