Go怎么结合Gin导出Mysql数据到Excel表格

1、实现目标

Golang 使用excelize 导出表格到浏览器下载或者保存到本地。后续导入的话也会写到这里

2、使用的库

go get github.com/xuri/excelize/v2

3、项目目录

go-excel├─ app│  ├─ excelize│  │  └─ excelize.go│  ├─ model│  │  └─ sysUser.go│  └─ service│     └─ userService.go├─ common│  └─ mysql.go├─ go.mod├─ go.sum├─ main.go└─ setting.json

4、主要代码编写

读取配置文件是用的viper

4.1、excelize.go(主要工具类)

ExportExcelByStruct 函数 是从网络上直接copy的,研究他这个写法花了好一会儿,所以也写上去了,提供大家学习

import ("fmt""math/rand""net/url""reflect""strconv""time""github.com/gin-gonic/gin""github.com/xuri/excelize/v2")var (defaultSheetName = "Sheet1" //默认Sheet名称defaultHeight    = 25.0     //默认行高度)type lzExcelExport struct {file      *excelize.FilesheetName string //可定义默认sheet名称}func NewMyExcel() *lzExcelExport {return &lzExcelExport{file: createFile(), sheetName: defaultSheetName}}//导出基本的表格func (l *lzExcelExport) ExportToPath(params []map[string]string, data []map[string]interface{}, path string) (string, error) {l.export(params, data)name := createFileName()filePath := path + "/" + nameerr := l.file.SaveAs(filePath)return filePath, err}//导出到浏览器。此处使用的gin框架 其他框架可自行修改ctxfunc (l *lzExcelExport) ExportToWeb(params []map[string]string, data []map[string]interface{}, c *gin.Context) {l.export(params, data)buffer, _ := l.file.WriteToBuffer()//设置文件类型c.Header("Content-Type", "application/vnd.ms-excel;charset=utf8")//设置文件名称c.Header("Content-Disposition", "attachment; filename="+url.QueryEscape(createFileName()))_, _ = c.Writer.Write(buffer.Bytes())}//设置首行func (l *lzExcelExport) writeTop(params []map[string]string) {topStyle, _ := l.file.NewStyle(`{"font":{"bold":true},"alignment":{"horizontal":"center","vertical":"center"}}`)var word = 'A'//首行写入for _, conf := range params {title := conf["title"]width, _ := strconv.ParseFloat(conf["width"], 64)line := fmt.Sprintf("%c1", word)//设置标题_ = l.file.SetCellValue(l.sheetName, line, title)//列宽_ = l.file.SetColWidth(l.sheetName, fmt.Sprintf("%c", word), fmt.Sprintf("%c", word), width)//设置样式_ = l.file.SetCellStyle(l.sheetName, line, line, topStyle)word++}}//写入数据func (l *lzExcelExport) writeData(params []map[string]string, data []map[string]interface{}) {lineStyle, _ := l.file.NewStyle(`{"alignment":{"horizontal":"center","vertical":"center"}}`)//数据写入var j = 2 //数据开始行数for i, val := range data {//设置行高_ = l.file.SetRowHeight(l.sheetName, i+1, defaultHeight)//逐列写入var word = 'A'for _, conf := range params {valKey := conf["key"]line := fmt.Sprintf("%c%v", word, j)isNum := conf["is_num"]//设置值if isNum != "0" {valNum := fmt.Sprintf("'%v", val[valKey])_ = l.file.SetCellValue(l.sheetName, line, valNum)} else {_ = l.file.SetCellValue(l.sheetName, line, val[valKey])}//设置样式_ = l.file.SetCellStyle(l.sheetName, line, line, lineStyle)word++}j++}//设置行高 尾行_ = l.file.SetRowHeight(l.sheetName, len(data)+1, defaultHeight)}func (l *lzExcelExport) export(params []map[string]string, data []map[string]interface{}) {l.writeTop(params)l.writeData(params, data)}func createFile() *excelize.File {f := excelize.NewFile()// 创建一个默认工作表sheetName := defaultSheetNameindex := f.NewSheet(sheetName)// 设置工作簿的默认工作表f.SetActiveSheet(index)return f}func createFileName() string {name := time.Now().Format("2006-01-02-15-04-05")rand.Seed(time.Now().UnixNano())return fmt.Sprintf("excle-%v-%v.xlsx", name, rand.Int63n(time.Now().Unix()))}//excel导出(数据源为Struct) []interface{}func (l *lzExcelExport) ExportExcelByStruct(titleList []string, data []interface{}, fileName string, sheetName string, c *gin.Context) error {l.file.SetSheetName("Sheet1", sheetName)header := make([]string, 0)for _, v := range titleList {header = append(header, v)}rowStyleID, _ := l.file.NewStyle(`{"font":{"color":"#666666","size":13,"family":"arial"},"alignment":{"vertical":"center","horizontal":"center"}}`)_ = l.file.SetSheetRow(sheetName, "A1", &header)_ = l.file.SetRowHeight("Sheet1", 1, 30)length := len(titleList)headStyle := Letter(length)var lastRow stringvar widthRow stringfor k, v := range headStyle {if k == length-1 {lastRow = fmt.Sprintf("%s1", v)widthRow = v}}if err := l.file.SetColWidth(sheetName, "A", widthRow, 30); err != nil {fmt.Print("错误--", err.Error())}rowNum := 1for _, v := range data {t := reflect.TypeOf(v)fmt.Print("--ttt--", t.NumField())value := reflect.ValueOf(v)row := make([]interface {}, 0)for l := 0; l < t.NumField(); l++ {val := value.Field(l).Interface()row = append(row, val)}rowNum++err := l.file.SetSheetRow(sheetName, "A"+strconv.Itoa(rowNum), &row)_ = l.file.SetCellStyle(sheetName, fmt.Sprintf("A%d", rowNum), fmt.Sprintf("%s", lastRow), rowStyleID)if err != nil {return err}}disposition := fmt.Sprintf("attachment; filename=%s.xlsx", url.QueryEscape(fileName))c.Writer.Header().Set("Content-Type", "application/octet-stream")c.Writer.Header().Set("Content-Disposition", disposition)c.Writer.Header().Set("Content-Transfer-Encoding", "binary")c.Writer.Header().Set("Access-Control-Expose-Headers", "Content-Disposition")return l.file.Write(c.Writer)}// Letter 遍历a-zfunc Letter(length int) []string {var str []stringfor i := 0; i < length; i++ {str = append(str, string(rune('A'+i)))}return str}

4.2、userService.go(接受请求)

其中导出的函数都已经测试是ok的,可以直接用,数据改成自己的就好,
注意的事项里面我也写了,避雷!!

import ("go-excel/app/excelize""go-excel/app/model"config "go-excel/common""github.com/gin-gonic/gin")//获取所有用户数据-excelfunc GetAllUserExportToWeb(ctx *gin.Context) {var users []model.TUserdb := config.GetDB()db.Find(&users)//定义首行标题dataKey := make([]map[string]string, 0)dataKey = append(dataKey, map[string]string{"key":    "id","title":  "索引","width":  "20","is_num": "0",})dataKey = append(dataKey, map[string]string{"key":    "username","title":  "用户名","width":  "20","is_num": "0",})dataKey = append(dataKey, map[string]string{"key":    "remark","title":  "备注","width":  "20","is_num": "0",})//填充数据data := make([]map[string]interface{}, 0)if len(users) > 0 {for _, v := range users {data = append(data, map[string]interface{}{"id":       v.ID,"username": v.Username,"remark":   v.Remark,})}}ex := excelize.NewMyExcel()  // ex.ExportToWeb(dataKey, data, ctx)//保存到D盘ex.ExportToPath(dataKey, data, "D:/")}//excel 导出func GetUserExcelByMap(ctx *gin.Context) {var users []model.TUserdb := config.GetDB()db.Find(&users)titles := []string{"ID", "用户名", "备注"}ex := excelize.NewMyExcel()var datas []interface{}for _, v := range users {//这里最好新建一个struct 和titles一致,不然users里面的多余的字段也会写进去datas = append(datas, model.TUser{ID:       v.ID,Username: v.Username,Remark:   v.Remark,})}ex.ExportExcelByStruct(titles, datas, "用户数据", "用户", ctx)}

4.2、测试结果

GetAllUserExportToWeb

Go怎么结合Gin导出Mysql数据到Excel表格

GetUserExcelByMap

Go怎么结合Gin导出Mysql数据到Excel表格

以上就是Go怎么结合Gin导出Mysql数据到Excel表格的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/161803.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
EasyControl— Tiamat AI 联合上海科大等开源的图像生成控制框架
上一篇 2026年8月25日 10:01:14
win11平板模式怎么开启_Win11手动开启与自动切换平板模式
下一篇 2026年8月25日 10:05:17

相关推荐

  • mysql如何设置自动重连

    答案:通过连接配置、连接池和应用层逻辑实现MySQL自动重连。启用MYSQL_OPT_RECONNECT选项(旧版本),推荐使用连接池如PooledDB、HikariCP并配置ping机制,应用层捕获连接异常后重试,结合指数退避策略提升稳定性。 MySQL 客户端或应用程序在连接断开后无法自动恢复,…

    2026年9月21日
    000
  • mysql如何理解数据完整性

    数据完整性在MySQL中通过主键、外键、约束等机制确保数据准确一致。1. 实体完整性用主键保证记录唯一,主键非空且不重复;2. 域完整性通过数据类型、CHECK约束、默认值等确保字段数据合法;3. 参照完整性利用外键维护表间关系,支持级联操作;4. 用户定义完整性由开发者通过触发器或程序实现业务规则…

    2026年9月21日
    100
  • 如何迁移触发器

    迁移触发器需确保逻辑重建与行为一致,须考虑平台差异、依赖对象及权限。首先确认源与目标数据库对触发事件、时机、级别及功能支持的兼容性,如MySQL支持BEFORE/AFTER行级触发器,SQLite不支持语句级触发器,跨平台可能需重写。接着通过元数据查询或系统表导出触发器定义,如MySQL使用SHOW…

    2026年9月21日
    100
  • mysql如何配置默认存储引擎

    首先查看当前默认存储引擎,通过SHOW VARIABLES命令确认;然后编辑my.cnf或my.ini文件,在[mysqld]下添加default-storage-engine=InnoDB;接着重启MySQL服务使配置生效;最后验证更改结果并检查建表默认引擎。 MySQL 默认存储引擎的配置可以通…

    2026年9月21日
    100
  • google浏览器开发者工具怎么打开_google浏览器打开开发者工具方法

    1、使用F12或Ctrl+Shift+I快捷键可快速打开开发者工具;2、右键点击页面元素选择“检查”能直接定位HTML节点;3、通过浏览器右上角菜单进入“更多工具”-“开发者工具”也可启动;4、在地址栏输入chrome://inspect可管理远程设备调试并打开对应开发者工具窗口。 如果您在使用 G…

    2026年9月21日
    100
  • Jedis jsonGet 方法返回字节数组值末尾出现 .0 的处理策略

    当使用jedis客户端的`jsonget`方法从redis获取json数据时,如果其中包含字节数组(如xml字符串的字节表示),可能会因底层json库(如gson或org.json)的默认行为,导致数字被统一上转型为`double`类型,从而在输出中显示`.0`后缀。本文将深入探讨此问题产生的原因,…

    2026年9月21日
    300
  • mysql索引的类型和作用有哪些

    MySQL常见索引类型包括:1. 普通索引用于加速查询;2. 唯一索引确保列值唯一;3. 主键索引为唯一非空且自动创建聚簇索引;4. 聚簇索引决定数据物理存储顺序,每表仅一个;5. 非聚簇索引保存主键值,需回表查询;6. 覆盖索引避免回表提升性能;7. 联合索引遵循最左前缀原则;8. 全文索引支持文…

    2026年9月21日
    100
  • Linux怎么使用systemctl管理服务

    Linux怎么使用systemctl管理服务Linux怎么使用systemctl管理服务Linux怎么使用systemctl管理服务Linux怎么使用systemctl管理服务

    systemctl是Linux中管理systemd服务的核心工具,提供统一命令集来启动、停止、重启、查看服务状态及设置开机自启,支持并行启动、依赖管理与Cgroups资源控制,相比SysVinit更高效;通过创建/etc/systemd/system/下的.service文件可自定义服务,包含[Un…

    2026年9月21日 用户投稿
    200
  • mysql如何优化子查询

    优先使用JOIN替代相关子查询,减少扫描行数并利用索引;对子查询字段建立合适索引;用EXISTS代替IN处理大量数据;物化不相关子查询结果;避免无索引的标量子查询;通过EXPLAIN分析执行计划优化性能。 MySQL中子查询如果使用不当,容易导致性能下降,尤其是在数据量大的情况下。优化子查询的核心是…

    2026年9月21日
    100
  • win11怎么校准笔记本电脑电池_Win11笔记本电池校准方法

    若Windows 11电池显示不准,可通过BIOS校准、手动充放电或第三方软件恢复精度。首先尝试BIOS中“Battery Calibration”功能,执行自动充放循环;若不支持,则手动充满后使用至自动关机再充满;最后可用BatteryInfoView等工具验证校准效果。 如果您发现Windows…

    2026年9月21日
    100
  • 如何在服务器上优化mysql安装

    优化MySQL需从系统环境、配置参数、存储引擎到日常维护多层面入手,首先确保内存合理分配、选用XFS等高性能文件系统、关闭非必要服务并调整内核参数;其次在MySQL配置中优先使用InnoDB引擎,科学设置innodb_buffer_pool_size、innodb_log_file_size、max…

    2026年9月21日
    100
  • mysql如何启用binlog日志

    MySQL启用binlog需修改配置文件添加log-bin和server-id,重启服务后执行SHOW VARIABLES LIKE ‘log_bin’验证是否为ON,确认启用。 MySQL启用binlog日志需要修改配置文件并重启服务,同时可进行简单验证确保生效。以下是具体…

    2026年9月21日
    100
  • mysql如何使用事务保证操作原子性

    答案:MySQL中事务通过START TRANSACTION开启,需使用InnoDB引擎并关闭自动提交,执行SQL后根据结果COMMIT或ROLLBACK,结合异常处理确保原子性。 在MySQL中,事务是保证数据库操作原子性的核心机制。通过事务,可以确保一组SQL操作要么全部成功执行,要么全部不执行…

    2026年9月21日
    600
  • mysql如何理解索引选择性

    索引选择性是衡量索引效率的关键指标,定义为索引列不同值数量与总行数的比值,范围在0到1之间。越接近1,数据唯一性越高,索引过滤能力越强,查询性能越好。例如主键列选择性为1,而性别列因重复值多选择性极低。MySQL优化器会优先选择高选择性索引以缩小搜索范围,提高执行效率。可通过SELECT COUNT…

    2026年9月21日
    100
  • CentOS安装Mysql8.0图文教程[通俗易懂]

    CentOS安装Mysql8.0图文教程[通俗易懂]CentOS安装Mysql8.0图文教程[通俗易懂]CentOS安装Mysql8.0图文教程[通俗易懂]CentOS安装Mysql8.0图文教程[通俗易懂]

    大家好,又见面了,我是你们的朋友全栈君。 本文将为您提供一个详细的CentOS通过yum安装Mysql8.0的图文教程,并指导您如何配置和运行Mysql,使其能够被外部访问。 首先,我们需要从官网下载对应的rpm包,并复制下载链接。 接着,执行以下命令进行下载: # 先进入到local文件夹cd u…

    2026年9月21日 用户投稿
    100
  • mysql如何配置ssl安全连接

    MySQL支持SSL时返回YES,通过生成证书并配置my.cnf中的ssl-ca、ssl-cert、ssl-key启用SSL,创建REQUIRE SSL用户确保加密连接,客户端连接需指定证书参数,STATUS或Ssl_cipher验证加密状态。 MySQL 配置 SSL 安全连接可以提升数据库通信的…

    2026年9月21日
    200
  • 访问DeepSeek官方网站 deepseek在线版免费登录

    答案:DeepSeek在线版免费登录入口位于官网https://chat.deepseek.com/sign_in,用户可通过手机号验证码或微信授权登录,新用户免注册,登录后自动创建账户并同步多端数据,支持网页和APP使用。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 De…

    2026年9月21日
    100
  • mysql如何在SQL中使用聚合函数

    聚合函数用于统计计算并返回单个值,常见函数有COUNT、SUM、AVG、MAX、MIN,通常与GROUP BY配合使用。1. COUNT统计非空值或总行数,SUM求和,AVG求平均,MAX和MIN分别取最大最小值。2. 对orders表整体统计可得总订单数、总额等信息。3. 按user_id分组后可…

    2026年9月21日
    400
  • 连接管理(Connection)的核心逻辑

    连接管理的核心逻辑包括资源管理、性能优化、错误处理和安全性。1. 连接池是关键,预先创建连接存放在池中,使用后归还。2. 连接池大小需平衡,太小导致连接不足,太大浪费资源。3. 生命周期管理要处理长时间 unused 和死连接。4. 错误处理确保系统稳定性。 在编程世界里,连接管理(Connecti…

    2026年9月21日
    100
  • MySQL如何高效存储时间日期数据_时区和格式问题处理?

    MySQL如何高效存储时间日期数据_时区和格式问题处理?MySQL如何高效存储时间日期数据_时区和格式问题处理?MySQL如何高效存储时间日期数据_时区和格式问题处理?MySQL如何高效存储时间日期数据_时区和格式问题处理?

    核心策略是统一存储utc时间并由应用层处理时区转换与格式化。1.timestamp适合跨时区场景,自动转换utc且节省空间;2.datetime适合固定日期事件,不随时区变化;3.写入前应用层转utc,读取后转用户本地时间;4.格式化应在应用层完成以提升性能与灵活性;5.避免字符串存储时间,优先使用…

    2026年9月21日 用户投稿
    100

发表回复

登录后才能评论
关注微信