热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Golang 模块引入及表格读写业务快速实现示例

Golang 模块引入及表格读写业务快速实现示例-目录介绍正文配置模块引入环境引入excelize库创建表格读取表格写入表格结语介绍在很多管理系统下都有不少让后端进行表格进行操作的

介绍

在很多管理系统下都有不少让后端进行表格进行操作的业务需求,本期就带大家了解一下Golang中如何使用模块引入的,以及讲解怎么快速的使用excelize库,对表格进行读写创建的。

正文

配置模块引入环境

我们在期望在vscode终端中也可以使用模块引入,它是 Go 1.11后新版模块管理方式。

go env -w GO111MODULE=auto

GO111MODULE 可以传递:

  • auto:在其外层且根目录里有 go.mod 文件时,则开启模块支持,否者无模块支持。
  • on:开启模块支持。
  • off:无模块支持。

然后,初始化这个项目,就会生成一个 go.mod 文件。

go mod init excel-demo

 go.mod 是Go 1.11版本引入的官方的包管理工具(之前为 gopath 来管理),它可以理解为前端开发中的 npm 的作用,主要是为了解决没有记录依赖包具体版本查阅困难的问题,也极大程度上方便了依赖包的管理。

引入excelize库

excelize 是一个用于读写 Microsoft Excel™2007 及更高版本生成的电子表格文档(XLAM / XLSM / XLSX / XLTM / XLTX)的 Go 语言库,而且更新维护频繁且非常好用。

引入excelize

go get github.com/xuri/excelize/v2

这里因为站点是国外的所以经常会因无法访问而超时。此时,不要慌,我们换一个国内的代理就好了。

go env -w GOPROXY=https://goproxy.cn

创建表格

package main
import (
    "fmt"
    "github.com/xuri/excelize/v2"
)
func createExcel(){
    // 创建表格文件
	f := excelize.NewFile()
    // 在Sheet1设置A1项的值
	f.SetCellValue("Sheet1", "A1", "这是Sheet1的A1项")
    // 创建新的Sheet,命名为Sheet2
	selectIndex := f.NewSheet("Sheet2")
    // 在Sheet2设置B2项的值
	f.SetCellValue("Sheet2", "B2", "这是Sheet2的B2项")
    // 切换到Sheet2
    f.SetActiveSheet(selectIndex)
    // 保存文件
    if err := f.SaveAs("test.xlsx"); err != nil {
        fmt.Println(err)
    }
}
func main() {
    // 执行创建表格
	createExcel()
}

按照以上是创建文件并在列上随便写入一些数据然后保存下来,非常的简单,现在我们来执行一下,就会发现当前目录会多出一个text.xlsx文件,没错,这就是我们刚才生成出来的表格文件,打开它就可以看到我们刚才写入的一些内容了。

读取表格

func openExcel(){
	// 读取test.xlsx表格文件
	f, err := excelize.OpenFile("test.xlsx")
    if err != nil {
        fmt.Println(err)
        return
    }
    // 获取Sheet2的B2项的值
    cell, err := f.GetCellValue("Sheet2", "B2")
    if err != nil {
        fmt.Println(err)
        return
    }
	fmt.Println(cell)
	fmt.Println("---------------")
	// 获取Sheet1所有的项
    rows, err := f.GetRows("Sheet1")
    if err != nil {
        fmt.Println(err)
        return
	}
	// 遍历Sheet1所有的项并打印出来
    for _, row := range rows {
        for _, colCell := range row {
            fmt.Print(colCell, "\t")
        }
        fmt.Println()
    }
}

上面做的操作是把我们刚才保存好的表格文件的内容读取出来,这里分了两种形式,一种是用 GetCellValue 方法读取某个sheet的某一项,另一种是用 GetRows 对获取整个sheet的项,然后for循环遍历出来。

写入表格

刚刚在创建的时候其实已经使用 SetCellValue 方法对表格的写入操作,但这还远远不够,因为还有很多东西我们可以写入进去,比如说图表和图片甚至是其他表格文件。图表这里先简单说明一下,它用了 AddChart 方法也是对某一项进行操作,插入相关数据进去,形式如下(详见文档):

if err := f.AddChart("Sheet1", "E1", `{
        "type": "col3DClustered",
        "series": [
        {
            "name": "Sheet1!$A$2",
            "categories": "Sheet1!$B$1:$D$1",
            "values": "Sheet1!$B$2:$D$2"
        }]
        }`); err != nil {
    fmt.Println(err)
    return
}

接下来,我们主要讲一下图片是如何写入进表格的,首先,我们先准备一张图片,就放在assets目录吧,然后在到 import 中导入jpeg和png,目的是明确后面要解析的图片(目前可以解析出jpeg,jpg,png格式的图片了),如果不写或者格式不对则会出现 image: unknown format 的提示。

package main
import (
	"fmt"
	_ "image/jpeg"
    _ "image/png"
    "github.com/xuri/excelize/v2"
)

然后我们还是要读取一下刚刚生成出来的test.xlsx表格文件,再把图片写入进去。

func setPic(){
	f, err := excelize.OpenFile("test.xlsx")
    if err != nil {
        fmt.Println(err)
        return
	}
	// 导入并设置图片
    if err := f.AddPicture("Sheet2", "C3", "assets/anya.png",
		`{
			"x_offset": 10,
        	"y_offset": 10,
			"x_scale": 0.8, 
			"y_scale": 0.8
		}`); err != nil {
        fmt.Println(err)
	}
	// 保存刚才的操作
	if err = f.Save(); err != nil {
        fmt.Println(err)
    }
}

而且图片还可以这是位置,大小等参数,但这里一定要记住不管添加了什么最后一定要保存一下,不然就是一场空。最后么,一个小阿尼亚就写入到了表格中啦~

结语


推荐阅读
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
author-avatar
8090互助联盟
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有