gin导出excel文件

go可以通过excelize 包实现对excel的操作

"github.com/xuri/excelize/v2"

导出示例

service层

批量导出数据的,我们可以在dao层中返回一个切片。在service中新建一个excelize对象,单独设置表头。遍历切片往excelize上修改即可。

func (s *Service) ExcelDown(req model.ReleaseRecordRequest) (*excelize.File, error) {
	// 从数据库拿到自己想要的数据
	data, err := s.dao.QueryData(req)
	if err != nil {
		return nil, err
	}
	if len(data) == 0 {
		return nil, errors.New("数据为空")
	}
	// 设置模版
	f := excelize.NewFile()		// 新建一个.xlsx文件
	f.SetCellValue("Sheet1", "A1", "project_name")	// 设置Sheet1中对应位置的值
	f.SetCellValue("Sheet1", "B1", "env_name")
	f.SetCellValue("Sheet1", "C1", "cluster_name")
	f.SetCellValue("Sheet1", "D1", "mode")
	f.SetCellValue("Sheet1", "E1", "remark")
	f.SetCellValue("Sheet1", "F1", "status")
	f.SetCellValue("Sheet1", "G1", "username")
	f.SetCellValue("Sheet1", "H1", "start_time")
	for i, datum := range data {
		f.SetCellValue("Sheet1", fmt.Sprintf("A%d", i+2), datum.ProjectName)
		f.SetCellValue("Sheet1", fmt.Sprintf("B%d", i+2), datum.EnvName)
		f.SetCellValue("Sheet1", fmt.Sprintf("C%d", i+2), datum.ClusterName)
		f.SetCellValue("Sheet1", fmt.Sprintf("D%d", i+2), datum.Mode)
		f.SetCellValue("Sheet1", fmt.Sprintf("E%d", i+2), datum.Remark)
		f.SetCellValue("Sheet1", fmt.Sprintf("F%d", i+2), datum.Status)
		f.SetCellValue("Sheet1", fmt.Sprintf("G%d", i+2), datum.Username)
		f.SetCellValue("Sheet1", fmt.Sprintf("H%d", i+2), datum.StartTime)
	}
	return f, err
}

controller层

这里跟普通的返回有点区别,需要给响应头添加参数

func  export(ctx *gin.Context) {
	file, err := s.ExportDown(req)
	if err != nil {
		...
		return
	}
	buffer := new(bytes.Buffer)
	if err := file.Write(buffer); err != nil {
		...
		return
	}
	excelData := buffer.Bytes()
	ctx.Header("Content-Disposition", "attachment;filename="+"xxx.xlsx")
	ctx.Data(http.StatusOK, "application/octet-stream", excelData)
}

cvs

如果一切顺利的话,导出到这里结束了,但我今天偏偏就遇到了不正常的。
在本地、测试环境下载文件均正常,在生产环境下载文件无法打开。

在这里插入图片描述
中间我查了很多资料,但是都没解决(我怀疑是生产环境的问题,但是由于是生产环境,也没有办法)
条条大陆通罗马,我们的目的是导出,至于具体是什么类型的文件,并没有要求
终于我找到了 cvs 文件

CSV(逗号分隔值)文件是一种特殊的文件类型,可在 Excel 中创建或编辑。 CSV 文件不是采用多列的形式存储信息,而是使用逗号分隔的形式存储信息。 将文本和数字保存在 CSV 文件中时,可轻松将它们从一个程序移动至另一个程序。

简直一摸一样,操作也十分简单,只需要对上面代码简单修改即可

server层

func (s *Service) ExcelDown(req model.ReleaseRecordRequest) (string, error) {
	// 查
	data, err := s.dao.QueryData(req)
	if err != nil {
		return "", err
	}
	if len(data) == 0 {
		return "", errors.New("数据为空")
	}
	var b strings.Builder
	writer := csv.NewWriter(&b)
	// 写入标题行
	err = writer.Write([]string{"project_name", "env_name", "cluster_name", "mode", "remark", "status", "username", "start_time"})
	if err != nil {
		return "", err
	}
	// 写入数据
	for _, datum := range data {
		err = writer.Write([]string{datum.ProjectName, datum.EnvName, datum.ClusterName, datum.Mode, datum.Remark, datum.Status, datum.Username, datum.StartTime})
		if err != nil {
			return "", err
		}
	}
	writer.Flush()
	return b.String(), nil
}

controller层

func  export(ctx *gin.Context) {
	data, err := s.ExportDown(req)
	if err != nil {
		...
		return
	}
	
	c.Header("Content-Type", "text/csv")
	c.Header("Content-Disposition", "attachment;filename=export.csv")
	c.String(http.StatusOK, "\xEF\xBB\xBF"+data) //  "\xEF\xBB\xBF 解决乱码问题"
}

最后成功导出,打开和excel一摸一样(公司的数据,这里我就不打开演示了)
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

05-13 周一 量化是什么

05-13 周一 量化是什么 时间版本修改人描述2024年5月13日11:27:25V0.1宋全恒新建文档2024年5月14日16:21:20V1.0宋全恒了解 简介 神经网络在运行时有较高的计算成本,而且随着大模型时代的到来,知识由一个巨大的LLM存储,为了获取知识&#xf…

【STM32】状态机实现定时器按键消抖,处理单击、双击、三击、长按事件

目录 一、简单介绍 二、模块与接线 三、cubemx配置 四、驱动编写 状态图 按键类型定义 参数初始化/复位 按键扫描 串口重定向 主函数 五、效果展示 六、驱动附录 key.c key.h 一、简单介绍 众所周知,普通的机械按键会产生抖动,可以采取硬件…

【江南大学×朗汀留学】部分留学录取案例合集

朗汀留学 X 江南大学 尽管客观条件如此艰难,朗汀留学的同学们还是斩获众多名校的录取。成绩属于过去,我们继续努力创造更好未来。 以下为我们摘取的江南大学部分学生案例供大家参考,再次恭喜所有获得理想大学offer的学生们,你们…

CAST: Cross-Attention in Space and Time for Video Action Recognition

标题:CAST: 时空交叉注意力网络用于视频动作识别 原文链接:2311.18825v1 (arxiv.org)https://arxiv.org/pdf/2311.18825v1 源码链接:GitHub - KHU-VLL/CASThttps://github.com/KHU-VLL/CAST 发表:NeurIPS-2023(CCF A…

Linux第四节--常见的指令介绍集合(持续更新中)

点赞关注不迷路!本节涉及初识Linux第四节,主要为常见的几条指令介绍。 如果文章对你有帮助的话 欢迎 评论💬 点赞👍🏻 收藏 ✨ 加关注👀 期待与你共同进步! 1. more指令 语法:more [选项][文件]…

MySQL文档_下载

可能需要:MySQL下载–》更新版本–》迁移数据库到MySQL 以下都不重要【只要确定好需要安装版本,找到对应的版本下载,安装,设置即可】 下载、安装: Determine whether MySQL runs and is supported on your platform…

电脑刚开机的时候不卡,用一会就变卡顿了…怎么回事?

前言 昨天咱们聊到旧电脑更换了固态硬盘之后,开机就会变快的事情,这个确实是可行且有效的升级电脑办法之一。 看完这篇之后,切莫着急升级电脑硬件配置,因为这里的坑比你想象的还要多。 从机械硬盘测试的数据和固态硬盘的测试数…

【C语言】—— 动态内存管理

【C语言】——动态内存管理 一、动态内存管理概述1.1、动态内存的概念1.2、动态内存的必要性 二、 m a l l o c malloc malloc 函数2.1、函数介绍2.2、应用举例 三、 c a l l o c calloc calloc 函数四、 f r e e free free 函数4.1、函数介绍4.2、应用举例 五、 r e a l l o …

SSL协议

SSL 安全传输协议(安全套接层) 也叫TLS ---- 传输层安全协议 SSL的工作原理:SSL协议因为是基于TCP协议工作的,通信双方需要先建立TCP会话。因为SSL协议需要进行安全保证,需要协商安全参数,所以也需要建立…

【数据结构】栈和队列专题

前言 上篇博客我们讨论了栈和队列的有关结构,本篇博客我们继续来讨论有关栈和队列习题 这些题算是经典了 💓 个人主页:小张同学zkf ⏩ 文章专栏:数据结构 若有问题 评论区见📝 🎉欢迎大家点赞&#x1f44d…

Oracle 临时表空间的管理

Oracle 临时表空间的管理 临时表空间的处理 1.创建一个新的temporary tablespace; create temporary tablespace tp tempfile ...... size 10m autoextend on; 2.改变数据库的默认临时表空间 alter database default temporary tablespace tp; 3。drop tablespace temp; …

Zoho CRM企业成长的智能引擎,智能化销售自动化

数字化时代,客户体验已成为企业竞争的核心要素。卓豪Zoho CRM,作为全球领先的SaaS云端客户关系管理平台,正引领着一场企业运营模式的变革,助力超过25万家企业跨越180多个国家,实现客户互动与业务增长的无缝对接。让我们…

Verlog-流水灯-FPGA

Verlog-流水灯-FPGA 引言: ​ 随着电子技术的飞速发展,现场可编程门阵列(FPGA)已成为电子设计自动化(EDA)领域中不可或缺的组件。FPGA以其高度的灵活性和可定制性,广泛应用于通信、图像处理、工…

【C++】学习笔记——继承_2

文章目录 十二、继承5. 继承与友元6. 继承与静态成员7. 复杂的菱形继承及菱形虚拟继承 未完待续 十二、继承 5. 继承与友元 友元关系不能继承,也就是说父类友元不能访问子类私有和保护成员 。除非子类也设置成友元。 6. 继承与静态成员 父类定义了 static 静态成…

单用户模式破解root密码

目录 一. 破解root密码 1. 查看操作系统版本 2.重启系统,进入grub菜单,选择要使用的内核,按e进入​编辑 3. 找到linux16那一行,把光标移动到最后,添加 init/bin/sh 然后ctrlx保存退出会自动进入系统 4. 进入系统后…

Spring WebFlux:响应式编程

在软件开发领域,随着互联网应用的规模和复杂性不断增加,传统的编程模型逐渐暴露出一些局限性,尤其是在面对高并发、大规模数据流处理等场景时。为了应对这些挑战,响应式编程(Reactive Programming)应运而生…

强化训练:day9(添加逗号、跳台阶、扑克牌顺子)

文章目录 前言1. 添加逗号1.1 题目描述2.2 解题思路2.3 代码实现 2. 跳台阶2.1 题目描述2.2 解题思路2.3 代码实现 3. 扑克牌顺子3.1 题目描述3.2 解题思路3.3 代码实现 总结 前言 1. 添加逗号   2. 跳台阶   3. 扑克牌顺子 1. 添加逗号 1.1 题目描述 2.2 解题思路 我的写…

ros键盘控制程序teleop_twist_keyboard 键值含义及用法

在机器人仿真中, 经常会用到键盘控制程序teleop_twist_keyboard 对机器人进行控制。但是对各个键值是何种含义, 如何操作并没有任何资料介绍,初次使用时会不知所措。 通过实践, 发现各个键值的作用如下: u-- 向左前方前进 i-- 直…

java-spring 09 下.populateBean (方法成员变量的注入@Autowird,@Resource)

1.在populateBean 方法中的一部分:用于Autowird,Resource注入 // 后处理器已经初始化boolean hasInstAwareBpps hasInstantiationAwareBeanPostProcessors();// 需要依赖检查boolean needsDepCheck (mbd.getDependencyCheck() ! AbstractBeanDefinitio…

现在闪侠惠递寄快递有福利了,千万不要因没把握住而后悔呀!

闪侠惠递平台寄快递现在真的是太便宜了,优惠价格把握不住,后悔都来不及!大家可以在闪侠惠递上面寄快递,价格真的非常优惠呢,比咱们平常寄快递的价格都优惠呢,真的,小编都亲自替大家尝试过了呢。…