gin导出excel文件

news2024/11/19 20:15:33

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一摸一样(公司的数据,这里我就不打开演示了)
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS2(一):CSS选择器

文章目录 1、CSS基础1.1 CSS简介1.2 CSS编写位置1.2.1 行内样式1.2.2 内部样式1.2.3 外部样式1.2.4 样式优先级 1.2.5 CSS代码风格 2、CSS选择器2.1、基本选择器2.1.1 通配选择器2.1.2 元素选择器2.1.3 类选择器2.1.4 ID选择器2.1.5 总结 2.2、CSS复合选择器2.2.1 交集选择器2.…

Spring MVC 介绍及其使用(详细)

目录 一.什么是SpringMVC呢? 1.1MVC的介绍 1.2SpringMVC和MVC的关系 二.SpringMVC的学习 第一步:创建项目 第二步,SpringMVC的连接 第三步,Spring MVC获取参数 第四步 SpringMVC的输出 总结 特点和优势 核心组件 一.什…

网络编程套接字(一) 【简单的Udp网络程序】

网络编程套接字<一> 理解源端口号和目的端口号PORT VS PID认识TCP协议和UDP协议网络字节序socket编程接口sockaddr结构简单的UDP网络程序服务端创建套接字服务端绑定运行服务器客户端创建套接字关于客户端的绑定问题启动客户端启动客户端本地测试INADDR_ANY 理解源端口号…

在js中table表格中进行渲染轮播图

效果图&#xff1a;示例&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8"><title></title><script src"js/jquery-3.6.3.js"></script><style>/* 轮播图 */.basko {width: 100%;h…

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

文章目录 前言内存管理数据存储位置C语言动态内存管理方式C动态内存管理方式&#xff1a;new/deleteoperator new与operator delete函数new和delete的实现原理定位new表达式&#xff08;了解&#xff09;常见面试题 总结C语言系列学习目录 前言 本章要介绍的是动态内存管理&am…

React: memo

React.memo 允许你的组件在 props 没有改变的情况下跳过重新渲染。 const MemoizedComponent memo(SomeComponent, arePropsEqual?)React 通常在其父组件重新渲染时重新渲染一个组件。你可以使用 memo 创建一个组件&#xff0c;当它的父组件重新渲染时&#xff0c;只要它的新…

re--SMC

参考&#xff1a;http://t.csdnimg.cn/g7fUY 参考&#xff1a;http://t.csdnimg.cn/qi3q5 简介 SMC&#xff0c;即Self Modifying Code&#xff0c;动态代码加密技术&#xff0c;指通过修改代码或数据&#xff0c;阻止别人直接静态分析&#xff0c;然后在动态运行程序时对代…

二、服务器配置修改

二、服务器配置修改 1 防火墙相关配置 systemctl status firewalld systemctl enable firewalld systemctl start firewalld firewall-cmd --reload firewall-cmd --list-all# 开启端口 firewall-cmd --zonepublic --add-port6030-6060/tcp --permanent firewall-cmd --zonep…

PDF文件转换为CAD的方法

有时候我们收到一个PDF格式的设计图纸&#xff0c;但还需要进行编辑或修改时&#xff0c;就必须先将PDF文件转换回CAD格式。分享两个将PDF转换回CAD的方法&#xff0c;一个用到在线网站&#xff0c;一个用到PC软件&#xff0c;大家根据情况选择就可以了。 ☞在线CAD网站转换 …

Git大文件无法直接push用git lfs track 上传大文件具体操作

Git 因为大文件push失败 回退到git add前用git lfs track单独添加大文件 以下work flow仅代表个人解决问题的办法&#xff0c;有优化流程的欢迎交流 回退到git add前 以下指令回退一个commit git reset --soft HEAD~1以下指令撤销所有git add操作&#xff0c;但不删除本地修…

什么品牌洗地机最好?怎么选?2024家用洗地机推荐攻略

随着科技的不断发展&#xff0c;家用洗地机已经成为人们家庭清洁任务重非常重要的辅助工具。家用洗地机集吸尘、扫地、拖地等功能于一体&#xff0c;通过高速旋转的滚刷和强力的吸力&#xff0c;将地面上的污渍、细菌和毛发等吸入污水箱&#xff0c;从而达到清洁地面的目的。但…

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

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

赋能业务全球化,明道云HAP通过亚马逊云科技 FTR认证

近日&#xff0c;明道云作为融合多元能力的超级应用平台&#xff0c;成功通过了AWS&#xff08;Amazon Web Service&#xff09;的FTR&#xff08;Foundational Technical Review&#xff09;认证。FTR是亚马逊云科技为合作伙伴解决方案提供的一项全面技术审核机制&#xff0c;…

memset函数

让我们先看两个代码 memset(dp, 0x3f, sizeof(dp)); for (int i 0; i < 5; i)cout << dp[i] << " "; memset(dp, 127, sizeof(dp)); for (int i 0; i < 5; i)cout << dp[i] << " "; 代码结果如下&#xff1a; 现在我们来分…

for循环 while循环

for循环 for循环格式 for 变量 in 取值列表 #for in &#xffe5; &#xff08;seq 1 10&#xff09; do 命令序列 .......... done 另一种 for &#xff08;&#xff08;变量初始值&#xff1b; 变量范围&#xff0c; 变量迭代方…

简单记录下:Navicat 导出表结构至 Excel

首先我们需要通过sql语句查询出相关的表结构的结构 SELECT COLUMN_NAME AS 字段名称,COLUMN_TYPE AS 字段类型,IF(IS_NULLABLENO,否,是) AS 是否必填,COLUMN_COMMENT AS 注释FROM INFORMATION_SCHEMA.COLUMNSWHERE table_schema bs-gdsAND table_name sys_menu;查询的结构如下…

【软件测试】自动化测试 Selenium 篇(一)

一、什么是自动化测试 1、自动化测试介绍 自动化测试指软件测试的自动化&#xff0c;在预设状态下运行应用程序或者系统&#xff0c;预设条件包括正常和异常&#xff0c;最后评估运行结果。将人为驱动的测试行为转化为机器执行的过程。 自动化就相当于将人工测试手段进行转换…

微软必应bing国内官方代理商,广告账户如何开户?

微软必应Bing作为全球知名的搜索引擎之一&#xff0c;其广告平台为众多企业提供了广阔的市场空间和精准的推广机会。对于中国内地的企业而言&#xff0c;通过必应Bing开展国内广告推广不仅能够触及更广泛的潜在客户群体&#xff0c;还能有效提升品牌影响力。通过微软必应Bing国…

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

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

Python 操作数据库

十、Python3 操作数据库 1、Python3 操作 MySQL 1、基本介绍 Python3 操作 MySQL 数据库 可以使用的模块是 pymysql 和 MySQLdb。 这个两个模块都是通过自己的 API 执行原生的 SQL 语句实现的。 MySQLdb 是最早出现的一个操作 MySQL 数据库的模块&#xff0c;核心由C语言编…