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 

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表格的详细内容,更多请关注【创想鸟】其它相关文章!

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

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/1559884.html

(0)
上一篇 2025年2月18日 09:30:49
下一篇 2025年2月18日 09:31:12

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 如何写一个 web 程序和服务器端的一个 exe 程序进行通信?

    (1)服务器端的一个exe程序向web程序发送数据,web程序要知被通知的时候再将结果呈现在浏览器上的web页面上。(2)从浏览器web页面上按下按钮后,要让服务器端的一个exe知道,有些东西变了ps. web小程序和服务器端的一个exe程…

    编程技术 2025年4月1日
    100
  • LNMP与MySQL优化:如何提高数据库性能

    提升LNMP(Linux, Nginx, MySQL, PHP)架构下MySQL数据库性能的关键策略: 一、硬件升级 内存扩容: MySQL对内存需求量大,增加服务器内存可显著提升性能。SSD升级: 使用固态硬盘(SSD)替代传统机械硬盘(…

    2025年4月1日
    100
  • Linux LAMP如何实现远程访问

    本文将指导您如何在Linux系统上配置LAMP环境并实现远程访问。 以下步骤将确保您的Web服务器安全且可访问。 第一步:安装和配置Apache Web服务器 首先,确保您的Linux系统已安装Apache。使用您的发行版包管理器安装:例如…

    2025年4月1日
    100
  • Linux LAMP中MySQL如何调优

    Linux LAMP架构中,MySQL数据库的性能优化至关重要,直接关系到整个Web应用的效率和稳定性。本文将介绍关键的优化步骤和建议。 一、硬件资源优化 CPU: 选择64位处理器,高主频和高缓存容量能够有效提升并发处理能力。内存: 充足…

    2025年4月1日
    100
  • LNMP服务器搭建:需要哪些硬件资源

    构建高效稳定的LNMP服务器(Linux, Nginx, MySQL/MariaDB, PHP),需要合适的硬件资源作为支撑。以下建议基于行业最佳实践和经验总结: 处理器 (CPU): 建议: 采用多核心服务器级CPU,例如Intel Xe…

    2025年4月1日
    100
  • LNMP环境配置:你需要知道哪些步骤

    LNMP架构是构建高效Web服务器的理想选择,它结合了Linux操作系统、Nginx网页服务器、MySQL/MariaDB数据库和PHP编程语言。以下步骤将指导您完成LNMP环境的搭建: 一、准备工作: 确保您的Linux系统已更新至最新版…

    2025年4月1日
    100
  • LNMP如何更新换代

    LNMP (Linux, Nginx, MySQL, PHP) 技术栈是构建动态网站和应用的常用选择。 本文将指导您如何安全高效地更新您的LNMP环境。 第一步:数据备份与配置文件保存 在开始任何更新操作前,务必备份所有关键数据和配置文件。…

    2025年4月1日
    100
  • LNMP安全设置:怎样做才更安全

    LNMP架构(Linux、Nginx、MySQL、PHP)是构建Web应用的常用技术栈,其安全性至关重要。本文提供一系列安全建议,助您提升LNMP系统的安全性: 及时更新软件: 定期更新Nginx、MySQL、PHP及操作系统至最新版本,修…

    2025年4月1日
    100
  • LNMP备份策略:如何确保数据安全

    LNMP(Linux, Nginx, MySQL, PHP)架构的网站数据安全至关重要。本文提供一套有效的LNMP备份策略,助您有效保护宝贵数据。 核心策略: 定时备份计划: 制定全量备份和增量备份计划,频率根据数据重要性和变化频率而定。全…

    2025年4月1日
    200
  • 如何利用Linux LAMP搭建博客系统

    本文将指导您如何在Ubuntu Linux系统上搭建一个基于LAMP(Linux, Apache, MySQL, PHP)架构的博客系统,以WordPress为例。 一、系统准备:安装Ubuntu操作系统 首先,在您的服务器上安装Ubunt…

    2025年4月1日
    100

发表回复

登录后才能评论