Go语言生成excel、将excel保存到本地、将多个excel表格压缩为压缩包、在压缩文件上传OSS删除本地excel文件和压缩包

        最近在公司了个需求,主要涉及到文件导出,需要根据特定表格文件生成excel文件导出,同时对导出的excel临时保存本地,生成压缩包,将压缩包上传至OSS(Object Storage Service)后删除本地临时文件。下面的文章中将对以上涉及到的几个点编写代码实现。

Go语言对excel文件的操作

        Go中对excel文件的操作主要依赖于Excelize库,提供了一组函数,可以对XLAM / XLSM / XLSX / XLTM / XLTX文件进行读写。支持读写由Microsoft Excel™2007及以后版本生成的电子表格文档。通过高兼容性支持复杂组件,并提供流API从具有大量数据的工作表中生成或读取数据。该库需要Go 1.16或更高版本。

        首先通过以下命令获取excelize依赖:

ge get github.com/xuri/excelize/v2

        常见的对excel文件的操作包括:生成excel表格、生成sheet页、向对应sheet页中的cell单元格内填写数据(对excel文件操作的基本步骤)。代码如下:

func genExcelFile() (err error) {// 创建一个新的Excel文件1f1 := excelize.NewFile() // 在Excel中创建一个新的sheet页f1.NewSheet("Sheet1")// 向工作表中写入数据if err = f1.SetCellValue("Sheet1", "A1", "Hello, World!"); err != nil {return}// 创建一个新的Excel文件2f2 := excelize.NewFile() // 在Excel中创建一个新的sheet页f2.NewSheet("Sheet1")if err = f2.SetCellValue("Sheet1", "B1", 123); err != nil {return}return
}

        上述代码给出了对excel文件操作的基本思路实现,在公司中不可能让自己单独实现一个excel的SDK对文件进行导出操作。具体学习参考下述链接:一文搞懂Go读写Excel文件_go excel-CSDN博客

将生成的excel文件保存到本地

        我在公司中做的需求需要同时导出多个excel文件,一个excel文件又包含多个sheet页,最终测试环境导出数据量达6W条之多。我需要将导出的多个excel文件生成一个压缩包。可能会问为什么需要将excel文件暂时保存到磁盘中,而不是暂时保存到内存中等所有的excel文件生成后直接在内容中将其生成zip文件。最终数据量非常大,若将其直接保存到内存中等所有excel表格生成后,将其合并生成zip文件是非常不明智的决定,对于内存的压力巨大。正确的做法每生成一个excel文件将其保存到磁盘目录中,等到所有excel文件生成后,遍历并读取所有excel文件,每遍历一个压缩一个,最终生成一个zip文件。并在将zip文件上传至OSS后删除磁盘文件。

        在上面的步骤中我们得到了 file *excelize.File 类型的excel文件,在填充了对应sheet单元格中具体内容后,需要将其保存到磁盘。借助于和File文件绑定的SaveAs()方法可以实现。

        在得知以上方法之后,自己编写了一个简易的文件保存方法:

const(celFilePath = "excelFiles"
)
func saveExcelFile(file *excelize.File, sub string) (path string, err error) {path = filepath.Join(excelFilePath, fmt.Sprintf("%s%s", sub, "test.xlsx"))if err = file.SaveAs(path); err != nil {return "", err}return path, nil
}

        将对应的excel文件保存到当前项目下并且创建一个excelFiles文件夹用以保存所有excel文件。上述代码最终报错:

open excelFiles/1test.xlsx: no such file or directory

        显示对应路径不存在。之前并没有创建临时目录,我本以为SavaAs方法在对应目录不存在时会创建对应的目录,和文件,但实验过后发现并非如此。在写入本地对应目录前,需要借助os.MkdirAll()函数判断对应目录是否存在,如果不存在会创建对应的目录,包含子目录。 

        修改后代码如下所示:

func saveExcelFile(file *excelize.File, sub string) (path string, err error) {path = filepath.Join(excelFilePath, fmt.Sprintf("%s%s", sub, "test.xlsx"))if err = os.MkdirAll(filepath.Dir(path), os.ModePerm); err != nil {return "", err}if err = file.SaveAs(path); err != nil {return "", err}return path, nil
}

        执行创建excel,并将excel写入本地代码后在项目文件夹下创建 excelFiles 文件夹用以存储所有excel文件,效果如下:

使用压缩工具将多个excel文件压缩为压缩包

        最终根据保存的excel文件路径去遍历读取每个excel文件并将其添加到zip压缩文件中。此时需要记住 "archive/zip" 依赖中的 zip.NewWriter(zipFile) 创建zip文件写入器:

    // zip压缩文件存放路径zipFilePath = filepath.Join(excelFilePath, excelZipName)// 创建ZIP文件zipFile, err := os.Create(zipFilePath)if err != nil {return "", err}defer zipFile.Close()// 创建ZIP写入器zipWriter := zip.NewWriter(zipFile)defer zipWriter.Close()

        随后遍历读取所有excel文件,并将其写入到zip压缩文件中。

删除临时文件及目录

        使用  os.RemoveAll(excelFilePath) 可以删除对应目录下的文件及目录。

        此外自己代码编写过程中学习了如何删除对应目录下的所有文件,不删除对应目录:

func deleteFiles(path string) error {// 要删除文件的目录// 读取目录中的所有文件files, err := os.ReadDir(path)if err != nil {fmt.Println(err)return err}// 遍历所有文件for _, file := range files {err := os.Remove(filepath.Join(path, file.Name()))if err != nil {fmt.Println(err)return err}}return nil
}

代码及效果展示 

        最终代码展示了如何创建多个excel、将excel写入本地磁盘、遍历读取磁盘excel生成zip文件、将zip文件上传到OSS(伪代码)、删除临时文件:注释defer中的删除临时目录及文件后代码如下:

package mainimport ("archive/zip""fmt""github.com/xuri/excelize/v2""io""os""path/filepath"
)const (excelFilePath = "excelFiles"excelZipName  = "wwtTest.zip"
)func main() {defer func() {//os.RemoveAll(excelFilePath)}()genExcelFile()
}func genExcelFile() (err error) {f1 := excelize.NewFile() // 创建一个新的Excel文件// 在Excel中创建一个新的工作表f1.NewSheet("Sheet1")// 向工作表中写入数据if err = f1.SetCellValue("Sheet1", "A1", "Hello, World!"); err != nil {fmt.Println(err)return}f2 := excelize.NewFile() // 创建一个新的Excel文件// 在Excel中创建一个新的工作表f2.NewSheet("Sheet1")if err = f2.SetCellValue("Sheet1", "B1", 123); err != nil {fmt.Println(err)return}path1, err := saveExcelFile(f1, "1")if err != nil {fmt.Println(err)return}path2, err := saveExcelFile(f2, "2")if err != nil {fmt.Println(err)return}// 获取zip文件zipFilePath, _ := genZipFiles([]string{path1, path2})fmt.Println(zipFilePath)// 将zip文件上传至OSS // TODOreturn
}
func saveExcelFile(file *excelize.File, sub string) (path string, err error) {path = filepath.Join(excelFilePath, fmt.Sprintf("%s%s", sub, "test.xlsx"))if err = os.MkdirAll(filepath.Dir(path), os.ModePerm); err != nil {return "", err}if err = file.SaveAs(path); err != nil {return "", err}return path, nil
}func genZipFiles(filePaths []string) (zipFilePath string, err error) {zipFilePath = filepath.Join(excelFilePath, excelZipName)// 创建ZIP文件zipFile, err := os.Create(zipFilePath)if err != nil {return "", err}defer zipFile.Close()// 创建ZIP写入器zipWriter := zip.NewWriter(zipFile)defer zipWriter.Close()// 遍历文件列表,逐个添加到ZIP文件中for _, filePath := range filePaths {if err = addFileToZip(zipWriter, filePath); err != nil {return "", err}}return zipFilePath, nil
}// 将文件写入zip压缩器
func addFileToZip(zipWriter *zip.Writer, filePath string) error {// 打开要添加的文件file, err := os.Open(filePath)if err != nil {return err}defer file.Close()// 获取文件信息fileInfo, err := file.Stat()if err != nil {return err}// 创建ZIP文件中的文件头zipHeader, err := zip.FileInfoHeader(fileInfo)if err != nil {return err}// 将文件头写入ZIP文件writer, err := zipWriter.CreateHeader(zipHeader)if err != nil {return err}// 将文件内容复制到ZIP文件中_, err = io.Copy(writer, file)if err != nil {return err}return nil
}

        效果如下:

参考链接

一文搞懂Go读写Excel文件_go excel-CSDN博客

 Golang 生成压缩文件教程_golang 压缩文件-CSDN博客

golang 实现多文件压缩下载_golang将多个文件压缩到一起-CSDN博客 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/387977.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go+Redis零基础到用户管理系统API实战_20240730 课程笔记

概述 如果您没有Golang的基础,应该学习如下前置课程。 Golang零基础入门Golang面向对象编程Go Web 基础Go语言开发REST API接口_20240728Go语言操作MySQL开发用户管理系统API教程_20240729Redis零基础快速入门_20231227 基础不好的同学每节课的代码最好配合视频进…

AI绘画模型之:VAE、SD 与 SD-XL

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

Linux常用工具

文章目录 tar打包命令详解unzip命令:解压zip文件vim操作详解netstat详解df命令详解ps命令详解find命令详解 tar打包命令详解 tar命令做打包操作 当 tar 命令用于打包操作时,该命令的基本格式为: tar [选项] 源文件或目录此命令常用的选项及…

19082 中位特征值

这个问题可以通过深度优先搜索(DFS)和优先队列来解决。我们首先使用DFS来计算每个节点的特征值,然后我们将所有节点的特征值放入一个优先队列中,然后我们从优先队列中取出中间的元素,这就是我们要找的中位数。 以下是…

如何选择合适的自动化测试工具!

选择合适的自动化测试工具是一个涉及多方面因素的决策过程。以下是一些关键步骤和考虑因素,帮助您做出明智的选择: 一、明确测试需求和目标 测试范围:确定需要自动化的测试类型(如单元测试、集成测试、UI测试等)和测试…

React-Native 宝藏库大揭秘:精选开源项目与实战代码解析

1. 引言 1.1 React-Native 简介 React-Native 是由 Facebook 开发的一个开源框架,它允许开发者使用 JavaScript 和 React 的编程模型来构建跨平台的移动应用。React-Native 的核心理念是“Learn Once, Write Anywhere”,即学习一次 React 的编程模型&am…

社区养老服务小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,服务人员管理,服务产品管理,服务预约管理,服务状态管理,服务退订管理,活动管理,视频管理 微信端账号功能包…

基于cubeMX的STM32的RTC实时时钟实现

1、在仪器仪表的项目开发中,时常需要设备显示当前的日期和时间,这时,可以使用STM32自带的RTC实时时钟模块来实现此功能。这里我们使用STM32F103RCT6单片机芯片为例。 2、cubeMX的设置 (1)RTC设置 (2&…

民大食堂用餐小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,商家管理,档口号管理,商家餐品管理,餐品种类管理,购物车管理,订单信息管理 微信端账号功能包括:系统首页&a…

yolov10来了!用yolov10训练自己的数据集(原理、训练、部署、应用)

一、引言 YOLOv9还没热乎呢,YOLOv10就出来了,太卷了!太快了! 自今年2月YOLOv9发布之后, YOLO(You Only Look Once) 系列的接力棒传到了清华大学研究人员的手上。YOLOv10推出的消息引发了AI界的…

使用 Postman 进行 Trello API 自动化测试的完整指南

文章目录 前言一、自动化测试是什么?二、比较自动化测试与手工测试1. 自动化测试2. 手工测试 三、环境搭建1.创建Collection2.创建环境变量3.添加API请求 四、设计测试用例1. API简单调用2. 获取所有emoji3. 创建一个新看板:4. 获得创建的看板信息5. 在看…

安装nodejs服务器

Java项目可以运行在tomcat服务器,开始完成前后端完全分离。前端有自己独立的工程。我们需要把前端独立的工程运行起来。 运行在nodejs服务器下。 验证是否安装成功:敲cmd--输入node --version 1.安装npm java项目需要依赖jar,安装maven。前端项目也需要依…

Vitis HLS 完美嵌套循环通过 m_axi 接口读取DDR 的迭代次数细粒度控制实验 — 问题描述

1 自媒体账号 目前运营的自媒体账号如下: 哔哩哔哩 【雪天鱼】: 雪天鱼个人主页-bilibili.comCSDN 【雪天鱼】: 雪天鱼-CSDN博客 QQ 学习交流群 FPGA科研硕博交流群 910055563 (进群有一定的学历门槛,长期未发言会被请出群聊,主要交流FPG…

免费!OpenAI发布最新模型GPT-4o mini,取代GPT-3.5,GPT-3.5退出历史舞台?

有个小伙伴问我,GPT-4O mini是什么,当时我还一脸懵逼,便做了一波猜测: 我猜测哈,这个可能是ChatGPT4o的前提下,只支持文本功能的版本,速度更快 结果,大错特错。 让我们一起看看Open…

【简单介绍Gitea】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

吴恩达老师机器学习-ex4

梯度检测没有实现。有借鉴网上的部分 导入相关库,读取数据 因为这次的数据是mat文件,需要使用scipy库中的loadmat进行读取数据。 通过对数据类型的分析,发现是字典类型,查看该字典的键,可以发现又X,y等关…

类和对象【下】

一、类的默认成员函数 默认成员函数从名字就告诉我们何为默认成员函数,即:用户没有实现,编译器默认自动实现的函数。 这时你不禁一喜,还有这好事,编译器给我打工,那么,我们今天都来了解一下都有…

漏洞复现-路由器TOTOLINK-A6000R-RCE

本文来自无问社区,更多漏洞信息可前往查看http://wwlib.cn/index.php/artread/artid/14996.html 0x01 产品简介 TOTOLINK A6000R是一款性能卓越的无线路由器,采用先进的技术和设计,为用户提供出色的网络体验。其支持最新的Wi-Fi标准&#x…

锅总详解开源组织之ASF

ASF是什么?ASF孵化的顶级项目有哪些?ASF顶级项目商用化有哪些?涉及的版权是什么?应用案例有哪些?衍生项目及其关联是什么?希望本文能帮您解答这些疑惑! 一、ASF简介 Apache Software Foundati…

Centos7.6安装Nginx(yum安装和源码安装)

Centos7.6安装Nginx(yum安装和源码安装) 简介 yum安装 源码安装 安装后的事情 常见问题 简介 Nginx(发音为“engine X”)是一个高性能的HTTP和反向代理服务器,也可以作为邮件代理服务器使用。它被广泛应用于高流量…