go实现导出excel或csv文件

go实现导出excel或csv文件

很早之前的一个项目需求要,需要把公司信息列表和漏洞信息列表导出excel文件,没有很高要求,能看就行吧,就做了导出csv的两个接口。 最近看我的CSDN发现好久没有写了,惭愧啊!其实遇到的问题,我都有详细记录,自己能看懂,但分享给别人也能看懂就需要好好写了,尽量有空整吧,需要坚持!


实现代码

我把实现代码简单写了一下,是用调用接口的方式实现的,用的gin 包。

最近又有了导出CSV文件的需求,就重新修改了一下这篇文章,根据不同情况分类4类,用4个api来分别请求实现。
第一个接口是这个文章之前的代码,直接返回了文件,请求接口就下载文件,因为在代码里创建了文件。
第二、三、四个接口都是,代码里只返回对应文件格式的数据,需要前端进行处理保存到对应的文件中实现下载。

先说一下优缺点,第一种,需要后端在进程里创建对应的文件保存,最后还要删除掉,如果请求多或文件内容多,都会给后端内存造成很大压力,所以建议使用后面的api,让前端直接获取数据进行保存文件。也要看各自的需求吧,看代码。

Content-Type

下载文件一般要设置对应的文件格式,就是Content-Type ,包括 http 的mime type,知道这个内容的可以跳过直接先看代码,有疑问可以先看下这几篇文章:
1, HTTP Content-Type(MIME List)介绍
2, 阿里云 MIME List 介绍
3, 菜鸟学院 MEMI List 介绍

package main
import ("bytes""encoding/csv""fmt""net/http""os""time""github.com/gin-gonic/gin""github.com/tealeg/xlsx"
)type Server struct {engine *gin.Engine
}func NewServer() *Server {ser := &Server{// 用的gin.Default()引擎,自带Logger and Recovery两个中间件,也可以用gin.New(),不带中间件engine: gin.Default(),  }return ser
}// 这个是为了造数据,可以忽略。
type Student struct {ID    stringName  stringAge   stringScore stringAddr  stringDate  string
}
// 造数据的方法
func (s *Server) getData() []*Student {res := make([]*Student, 0, 25)for i := 1; i <= 20; i++ {res = append(res, &Student{ID:    fmt.Sprintf("2021000000%d", i),Name:  fmt.Sprintf("辣条精-%d", i),Age:   fmt.Sprintf("1%d", i),Score: fmt.Sprintf("8%d", i),Addr:  fmt.Sprintf("辣条小镇太平村-%d号", i),Date:  fmt.Sprintf("2012-12-%d", i),})}return res
}// 这是对应的4个接口,下面会具体说明一下不同接口的作用。
func (s *Server) Start() {gin.SetMode(gin.ReleaseMode)s.engine.GET("/csv", s.csvApi)              //1,请求后直接下载csv文件s.engine.GET("/csv_data", s.saveCSVApi)     //2,请求后,返回csv格式的文件数据byte,需要前端保存到一个对应格式的文件中s.engine.GET("/xlsx_data", s.saveXlxsApi)   //3,请求后,返回xlsx格式的文件数据byte,需要前端保存到一个对应格式的文件中s.engine.GET("/xlsx_csv", s.saveXlsxCSVApi) //4,请求后,使用xlsx返回csv格式的文件数据byte,需要前端保存到一个对应格式的文件中s.engine.Run(":9999")
}//启动进程
func main() {NewServer().Start()
}// 接口一
// 请求接口后,会直接下载csv格式文件,使用 "encoding/csv" 包实现,代码里直接创建了文件,最后还删除,不然也会给服务器压力,或定期删除。
func (s *Server) csvApi(c *gin.Context) {filename, err := s.toCsv()if err != nil {fmt.Println("t.toCsv() failed == ", err)}if filename == "" {fmt.Println("export excel file failed == ", filename)}defer func() {err := os.Remove("./" + filename)  //下载后,删除文件if err != nil {fmt.Println("remove  excel file failed", err)}}()c.Writer.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename=%s", filename))c.Writer.Header().Add("Content-Type", "application/octet-stream") //设置下载文件格式,流式下载c.File("./" + filename) //直接返回文件
}// 接口一 function
func (t *Server) toCsv() (string, error) {//获取数据data := t.getData()strTime := time.Now().Format("20060102150405")//创建csv文件filename := fmt.Sprintf("学生信息-%s.csv", strTime)xlsFile, fErr := os.OpenFile("./"+filename, os.O_RDWR|os.O_CREATE, 0766)if fErr != nil {fmt.Println("Export:created excel file failed ==", fErr)return "", fErr}defer xlsFile.Close()//开始写入内容//写入UTF-8 BOM,此处如果不写入就会导致写入的汉字乱码xlsFile.WriteString("\xEF\xBB\xBF")wStr := csv.NewWriter(xlsFile)wStr.Write([]string{"学生学号", "学生姓名", "学生年龄", "学生成绩", "家庭地址", "学生生日"})for _, s := range data {wStr.Write([]string{s.ID, s.Name, s.Age, s.Score, s.Addr, s.Date})}wStr.Flush()  //写入文件return filename, nil
}// 接口二
// 返回csv文件格式的 []byte数据,使用 "encoding/csv" 包实现,用于导出csv文件。
func (s *Server) saveCSVApi(c *gin.Context) {respData, err := s.SetValueToCSV()if err != nil {fmt.Println("SetValueToCSV failed == ", err.Error())}//指定下载文件名,可以注释掉,让前端处理文件名c.Header("Content-Disposition", "attachment; filename=StudentList.csv") c.Header("Content-Type", "text/csv")  //设置为 .csv 格式文件c.Data(http.StatusOK, "text/csv", respData)
}// 接口二 function
func (t *Server) SetValueToCSV() ([]byte, error) {data := t.getData() //获取数据	//内容先写入buffer缓存buff := new(bytes.Buffer)//写入UTF-8 BOM,此处如果不写入就会导致写入的汉字乱码buff.WriteString("\xEF\xBB\xBF")wStr := csv.NewWriter(buff)wStr.Write([]string{"学生学号", "学生姓名", "学生年龄", "学生成绩", "家庭地址", "学生生日"})for _, s := range data {wStr.Write([]string{s.ID, s.Name, s.Age, s.Score, s.Addr, s.Date})}wStr.Flush() // 返回[]byte数据return buff.Bytes(), nil
}//接口三
//返回xlsx文件格式的 []byte数据,使用 "github.com/tealeg/xlsx" 包实现,用于导出xlsx文件。
func (s *Server) saveXlxsApi(c *gin.Context) {respData, err := s.SetValueToXlsx()if err != nil {fmt.Println("SetValueToCSV failed == ", err.Error())}//指定下载文件名,可以注释掉,让前端处理文件名c.Header("Content-Disposition", "attachment; filename=StudentList.xlsx") // 设置为 .xlsx格式文件c.Header("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")c.Data(http.StatusOK, "", respData)
}
//接口三 function
func (t *Server) SetValueToXlsx() ([]byte, error) {data := t.getData() //获取数据var file *xlsx.Filevar sheet *xlsx.Sheetvar row *xlsx.Rowvar cell *xlsx.Cellvar err errorfile = xlsx.NewFile()sheet, err = file.AddSheet("Sheet1")if err != nil {fmt.Println("init xlsx file failed, err == ", err.Error())return nil, err}row = sheet.AddRow()row.SetHeightCM(1)cell = row.AddCell()cell.Value = "学生学号"cell = row.AddCell()cell.Value = "学生姓名"cell = row.AddCell()cell.Value = "学生年龄"cell = row.AddCell()cell.Value = "学生成绩"cell = row.AddCell()cell.Value = "家庭地址"cell = row.AddCell()cell.Value = "学生生日"for _, v := range data {row1 := sheet.AddRow()cell = row1.AddCell()cell.Value = v.IDcell = row1.AddCell()cell.Value = v.Namecell = row1.AddCell()cell.Value = v.Agecell = row1.AddCell()cell.Value = v.Scorecell = row1.AddCell()cell.Value = v.Addrcell = row1.AddCell()cell.Value = v.Date}buff := new(bytes.Buffer)file.Write(buff)return buff.Bytes(), nil
}//接口四
//返回csv文件格式的 []byte数据,使用 "encoding/csv"包实现,用于导出csv文件。
func (s *Server) saveXlsxCSVApi(c *gin.Context) {// 还是使用的接口三function 包的方法,respData, err := s.SetValueToXlsx()if err != nil {fmt.Println("SetValueToXlsx failed == ", err.Error())}//指定下载文件名,可以注释掉,让前端处理文件名c.Header("Content-Disposition", "attachment; filename=StudentList.csv") c.Header("Content-Type", "text/csv") //设置为 .csv 格式文件c.Data(http.StatusOK, "text/csv", respData)
}

请求测试

接口一

请求地址: http://127.0.0.1:9999/csv,直接在浏览器里请求这个地址即可。
请求后会直接下载导出CSV文件,但是看起来不太好看,有些数据自动被转化了,点击查看的话是没有问题。

在这里插入图片描述

接口二

请求地址:http://127.0.0.1:9999/csv_data ,不能在浏览器直接请求,在Postman测试接口,
在这里插入图片描述
点击Send and Download,会显示保存 .csv 文件,可以选择保存文件目录地址和修改文件名,文件内容和接口一 一样。
在这里插入图片描述

接口三

请求地址:http://127.0.0.1:9999/xlsx_data ,不能在浏览器直接请求,在Postman测试接口,
点击Send and Download,会显示保存 .xlsx 文件,可以选择保存文件目录地址和修改文件名。
在这里插入图片描述在这里插入图片描述

对比之后,可以看到,导出的excel文件,xlsx格式文件比csv格式文件 会更好看一些,可以考虑导出 .xlsx文件, 如果有要求 导出 .csv 格式文件,可以使用接口四,使用xlsx包 实现文件内容,导出.csv 文件,也是可以的,我目前使用的是 接口四。

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

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

相关文章

2.2如何从CSV文件中导入数据

2.2 如何从CSV文件中导入数据 1、CSV格式&#xff0c;顾名思义就是指逗号分隔的值&#xff08;文件中还包括一个文件头&#xff0c;也是用逗号分隔&#xff09; 2、从CSV文件中导入数据有一下5个步骤&#xff1a; 打开ch02-data.csv文件。首先读取文件头然后读取剩余行当发生…

免费“白嫖” GPT-4 方法 +1,飙升 GitHub 热榜第二!开发者锐评:跟“偷”有什么区别?...

整理 | 郑丽媛 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 前不久&#xff0c;可“白嫖” GPT-4 的 Forefront Chat 吸引了众多关注&#xff0c;导致该网站一度崩溃&#xff0c;也令不少人发出疑问&#xff1a;“GPT-4 这么贵&#xff0c;为什么它能免费让我们…

雅思两次7.5经验分享~希望帮你冲击雅思高分!

本文首发于我的知乎文章&#xff0c;见链接。 雅思两次7.5经验分享~希望帮你冲击雅思高分&#xff01; - Mr.HenryHuang的文章 - 知乎 https://zhuanlan.zhihu.com/p/163391234 长文预警&#xff0c;可以点赞收藏再看&#xff0c;希望对你们有帮助O(∩_∩)O~ 本文并不能通过一…

雅思写作攻略 - 提高Task 1成绩

雅思写作攻略 - 提高Task 1成绩 Move Up In IELTS - Succeed in IELTS Task 1 Academic Writing &#x1f393;✍️想在IELTS写作考试中取得好成绩吗&#xff1f;这本书《Move Up In IELTS - Succeed in IELTS Task 1 Academic Writing》是你必须拥有的工具&#x1f4da;&…

大数据精准营销应用(一)

文章目录​​​​​​​ 前言 一、精准营销简介 二、大数据精准营销过程 三、大数据精准营销方式 四、项目目标 五、项目流程 六、数据的处理​​​​​​​ 数据的预览 数据的读取 数据的解析 数据预处理 异常值处理 缺失值处理 时间格式和时区转换 量纲转化 重…

最新版本的ChatGPT代码解释器使用指南来了

ChatGPT推出至今最强最有用的功能是什么&#xff1f; 可能要非代码解释器&#xff08;Code Interpreter&#xff09;莫属了。 如果你还无法体验和享受plus带来的极致体验&#xff0c;可以选择共享plus的方式或者自行升级&#xff0c;更多内容访问&#xff1a;链接&#xff1a…

北大斩获ICLR 2023杰出论文奖!清华人大、LeCun获提名

来源&#xff1a;新智元 近日&#xff0c;ICLR公布了2023年的获奖名单&#xff0c;共有4篇获最佳论文奖&#xff0c;5篇获荣誉提名。 其中&#xff0c;来自北京大学的张博航、罗胜杰、王立威、贺笛荣获杰出论文奖&#xff0c;来自清华大学的孔祥哲、刘洋&#xff0c;中国人民大…

什么是技术美术?

前言 技术美术&#xff0c;英文名是Technical Art&#xff0c;简称TA. 说白了就是一群既懂程序又懂美术的人。 至于技术美术是属于程序还是属于美术我们在这里不做过多讨论&#xff0c;要不然会打起来的。。。 反正我认为技术美术就是一名特殊的美术&#xff0c;要不然的话为什…

基于Java+SpringBoot+Vue实现前后端分离美术馆管理系统

博主介绍&#xff1a;✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

基于GTSRB数据集的交通标志识别实验(Tensorflow)

基于GTSRB的交通标志识别实验 一、数据数据读取 二、搭建网络三、模型预测四、附录模块导入Code 结语 一、数据 官网下载太慢&#xff0c;然后我找到了一个整理好的数据集 链接: GTSRB-德国交通标志识别图像数据 . 数据集很干净&#xff0c;直接用就好了&#xff0c;它把所有的…

MOOC TensorFlow入门实操课程代码回顾总结(二)

欢迎来到TensorFlow入门实操课程的学习 MOOC TensorFlow入门实操课程代码回顾总结&#xff08;一&#xff09; MOOC TensorFlow入门实操课程代码回顾总结&#xff08;三&#xff09; 注&#xff1a; 用于表示python代码粘贴运行结果 目录 5 图像分类基础应用——猫狗分类案例5…

基于jupyter notebook的python编程-----猫狗数据集的阶段分类得到模型精度并进行数据集优化

基于jupyter notebook的python编程-----猫狗数据集的阶段分类并得到模型精度和后续优化 一、名词解释1、什么是overfit&#xff08;过拟合&#xff09;&#xff1f;2、什么是数据增强&#xff1f;3、什么是猫狗数据集&#xff1f; 二、猫狗数据集下载1、猫狗数据集下载2、数据集…

【动手撸深度学习】深度挖掘AI的图像分类能力!

欢迎来到动手撸深度学习~ cv君力挺的:最值得看的专栏系列:动手撸深度学习, 学习完本系列,你能从调包侠到一个能独立打比赛的朋友周边的神!文章付费,不想让太多人白嫖!!!因为全部原创,珍很贵 !!今天给大家来分享一下调参技巧,看完你会感谢我的~ 今天第一节 介绍如何…

卷积神经网络的猫狗识别

文章目录 一、准备工作二、猫狗识别2.1、下载数据集2.1.1、 图片分类2.1.2、图片数量统计 2.2、卷积神经网络CNN2.2.1、网络模型搭建2.2.2、图像生成器读取文件中数据2.2.3、训练2.2.4、保存模型2.2.5、结果可视化 2.3、对模型进行调整2.3.1、图像增强方法2.3.2、模型调整2.3.3…

Python基于keras训练简单微笑识别

文章目录 一、数据预处理二、训练模型创建模型训练模型训练结果 三、预测效果 四、源代码pretreatment.pytrain.pypredict.py 一、数据预处理 实验数据来自genki4k 提取含有完整人脸的图片 def init_file():num 0bar tqdm(os.listdir(read_path))for file_name in bar:bar…

猫狗识别与分类

猫狗识别与分类 文章目录 猫狗识别与分类一、前言二、环境配置三、源码以及数据集四、基础猫狗识别程序如下1、train.pytrain.py程序结构&#xff1a; 2、detect.pydetect.py程序结构&#xff1a; 五、配置环境过程1、打开Anaconda Prompta、创建一个叫MNIST4的环境b、创建成功…

基于卷积神经网络(CNN)的猫狗识别

目录 引言 1.什么是卷积神经网络&#xff1f; 1.1什么是神经网络&#xff1f; 1.2什么是卷积&#xff1f; 2.准备工作 2.1一些知识&#xff1a; 2.2keras 2.3Conv2D 2.4 MaxPooling2D 3.基于卷积神经网络的猫狗识别 3.1导入必要库 3.2模型定义 3.3实例化模型并训练…

使用卷积神经网络构建图像分类模型检测肺炎

在本篇文章中&#xff0c;我将概述如何使用卷积神经网络构建可靠的图像分类模型&#xff0c;以便从胸部x光图像中检测肺炎的存在。 肺炎是一种常见的感染&#xff0c;它使肺部的气囊发炎&#xff0c;引起呼吸困难和发烧等症状。尽管肺炎并不难治疗&#xff0c;但及时诊断是至关…

实验3:卷积神经网络图像分类

卷积神经网络图像分类 1 理解卷积神经网络1.1 搭建环境1.2 猫狗分析实例 2 卷积神经网络2.1 网络模型搭建2.2 使用图像生成器读取图片 本次实验将完成以下任务&#xff1a; 按照 python笔记本深度学习,利用TensorFlow和Keras&#xff0c;自己搭建卷积神经网络完成狗猫数据集的分…

Python-猫狗数据集两阶段分类 原始数据直接训练;数据增强后训练

本博客运行环境为Jupyter Notebook-Python3.7。 由于我使用的是Anaconda3配置的jupyter环境&#xff0c;我也将直接在anaconda下搭建keras环境。 博客目录 下载tensorflow、keras下载数据集并重新划分数据预处理训练数据增强 由于我电脑性能不是很好&#xff0c;又是AMD显卡的…