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.Builderwriter := 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.hqwc.cn/news/700752.html

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

相关文章

76岁林子祥升级做爷爷,亲自为孙女取名

林子祥与前妻吴正元的儿子,现年39岁的林德信入行以来绯闻不少,自与圈外女友Candace拍拖后便修心养性,去年他已经低调与拍拖5年多Candace完婚,正式步入人生另一阶段。 昨日(5月12日)林德信借母亲节这个温馨日…

Amesim基础篇-表格类型设置与读取

前言 在Amesim仿真中,不可避免需要应用到表格。如新能源动力电池中内阻、充电倍率的调取,压缩机的机械效率、容积效率等,水泵的效率,管路的压降等等。本文将介绍如何对表格类型的选择与参数输入。 1 进入表格设置界面 如下图所示,在Amesim界面的右上角Table Editor进入…

leetcode.K站中转(python)

开始准备用dfs深度搜索,发现n100,dfs可能会超时,即使用了剪枝。 class Solution:def findCheapestPrice(self, n: int, flights: List[List[int]], src: int, dst: int, k: int) -> int:length k 2ans float(inf)rec []vis [True]*n…

百望云钉钉:重塑财务智能化管理,助力企业实现数字化飞跃

近年来,数字技术正在深刻改变着企业生产方式和组织模式,企业面连着业务流程再造、经营模式创新等一系列建设挑战。 其中,财务部门从价值守护走向价值创造的过程中,展现出对企业经营与业务发展的巨大影响力。叠加金税四期税务改革&…

【JS面试题】原型原型链

一、面试真题展示: 1. 如何准确判断一个变量是不是数组? ① 使用instanceof进行判断:a instanceof Array ② 使用Array.isArray()进行判断:Array.isArray(a) 2. 手写一个简易的jQuery,考虑插件和扩展性? …

【Web】HNCTF 2024 题解(部分)

目录 Please_RCE_Me ezFlask GoJava ez_tp GPTS Please_RCE_Me <?php if($_GET[moran] flag){highlight_file(__FILE__);if(isset($_POST[task])&&isset($_POST[flag])){$str1 $_POST[task];$str2 $_POST[flag];if(preg_match(/system|eval|assert|call|…

深度学习入门到放弃系列 - 阿里云人工智能平台PAI部署开源大模型chatglm3

通过深度学习入门到放弃系列 - 魔搭社区完成开源大模型部署调用 &#xff0c;大概掌握了开源模型的部署调用&#xff0c;但是魔搭社区有一个弊端&#xff0c;关闭实例后数据基本上就丢了&#xff0c;本地的电脑无法满足大模型的配置&#xff0c;就需要去租用一些高性价比的GPU机…

DOM重点核心(注册事件+DOM事件流)

目录 1.注册事件 注册时间概述 addEventListener() 删除事件 2.DOM事件流 DOM事件流理论 事件对象 事件对象的常见属性和方法 e.targe 和 this的区别 阻止默认行为 阻止冒泡 事件委托 禁止右键菜单和禁止选中文字 获得鼠标的坐标&#xff08;可视区、页面、浏览器…

物联网应用开发--STM32与新大陆云平台通信(云平台控制开发板上蜂鸣器、LED)

实现目标 1、掌握云平台执行器的创建 2、熟悉STM32 与ESP8266模块之间的通信 3、具体实现目标&#xff1a;&#xff08;1&#xff09;创建5个执行器&#xff1a;蜂鸣器&#xff0c;LED1&#xff0c;LED2&#xff0c;ED3&#xff0c;LED4;&#xff08;2&#xff09;执行器能对…

洁太司检测试剂盒:肝癌早诊新利器,共筑健康未来

随着科技进步及医疗技术的不断创新&#xff0c;人类对疾病的早期诊断和治疗提出了更高的要求。 先思达生物近期推出的“洁太司-寡糖链检测试剂盒”&#xff0c;在原发性肝细胞癌的诊断领域实现了重大突破&#xff0c;获得了国家药品监督管理局&#xff08;NMPA&#xff09;的三…

怎么得到所有大写字母/小写字母组成的字符串

有时候&#xff0c;可能需要获取a~z、A~Z组成的26个字母的字符串&#xff0c;这篇文章介绍一种简单的方法。 只需要几句简单到不能再简单的代码&#xff01;你不会还在傻傻地一个个字母敲吧~ /*** author heyunlin* version 1.0*/ public class Example {/*** 小写字母*/priv…

css如何实现边框模糊的效果

其实并不难&#xff0c;用属性 filter: blur(数字px); 即可。效果如下&#xff1a; 图上的圆形内有色彩的渐变&#xff0c;同样也是用filter: blur(数字px); 实现的&#xff0c;代码如下&#xff1a;、 <template><div id"root" :style"{}">…