news 2026/7/3 5:03:16

GO 数据库内容导出到Excel表格

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GO 数据库内容导出到Excel表格

1.导出列表

func exportTaskList(c *gin.Context){u :=user.GetCookie(c)Data, err :=handleData(c)iferr!=nil{c.JSON(http.StatusInternalServerError, err.Error())return}warehouseId, _ :=Data["warehouse_id"].(string)ifok, err :=order.GetWareHouseEmpty(warehouseId);ok{c.JSON(http.StatusBadRequest, err)return}allList, err :=queryAllTaskFromDB(warehouseId, u)iferr!=nil{c.JSON(http.StatusInternalServerError, gin.H{"code":500,"msg":"查询失败"})return}//1. 创建文件 f :=excelize.NewFile()sheetName :="任务列表"//2. v1 用法:NewSheet 只返回一个 int 索引,没有 error index :=f.NewSheet(sheetName)// 这里只接收一个值,不再报错 //3. 设置活动工作表 f.SetActiveSheet(index)f.DeleteSheet("Sheet1")//4. 设置表头 headers :=[]string{"订单编号","状态","类型","容器码","起点位置","目标位置","下发时间","完成时间","用时","执行结果","组盘人","创建人","分拣人","所属仓库"}fori, h :=range headers{cell :=fmt.Sprintf("%c1",'A'+i)f.SetCellValue(sheetName, cell, h)}//5. v1 用法:NewStyle 返回(int, error),用两个变量接收 style, err :=f.NewStyle(`{"font":{"bold":true}}`)// v1 样式用 JSON 字符串iferr==nil{f.SetCellStyle(sheetName,"A1", fmt.Sprintf("%c1",'A'+len(headers)-1), style)}users, _ :=getUserAll(u)inventorys, _ :=getInventoryAll(u)//6. 填充数据forrowIdx, row :=range allList{rowNum :=rowIdx +2wcs_sn, _ :=row["wcs_sn"].(string)status, _ :=row["status"].(string)ss :=""switch status{case"status_wait":ss="待执行"breakcase"status_progress":ss="进行中"breakcase"status_success":ss="已完成"breakcase"status_cancel":ss="已取消"breakcase"status_fail":ss="失败"breakcase"status_delete":ss="已删除"breakcase"status_suspend":ss="已暂停"break}types, _ :=row["types"].(string)tt :=""switch types{case"in":tt="入库"breakcase"out":tt="出库"breakcase"return":tt="回库"breakcase"move":tt="移库"breakcase"outEmpty":tt="空托出库"breakcase"inEmpty":tt="空托入库"breakcase"outMaterial":tt="空筐出库"breakcase"inreturn":tt="盘点回库"breakcase"nin":tt="移车"break}container_code, _ :=row["container_code"].(string)port_addr, _ :=row["port_addr"].(mo.M)src :=""ifport_addr!=nil{src=fmt.Sprintf("%d-%d-%d", port_addr["f"], port_addr["c"], port_addr["r"])}dst :=""addr, _ :=row["addr"].(mo.M)ifaddr!=nil{dst=fmt.Sprintf("%d-%d-%d", addr["f"], addr["c"], addr["r"])}send_time, _ :=row["send_time"].(mo.DateTime)p :=send_time.Time()send_time_str :=p.Format("2006-01-02")ifsend_time_str=="1970-01-01"{send_time_str=""}complete_time, _ :=row["complete_time"].(mo.DateTime)cc :=complete_time.Time()complete_time_str :=cc.Format("2006-01-02")ifcomplete_time_str=="1970-01-01"{complete_time_str=""}minsecdiff :=""ifcomplete_time_str==""{minsecdiff=""}ifsrc==dst{minsecdiff=""}ifsend_time_str!=""&&complete_time_str!=""{duration :=p.Sub(cc)ifduration<0{duration=-duration}totalSeconds :=int(duration.Seconds())diffMinutes :=totalSeconds /60diffSeconds :=totalSeconds %60minsecdiff=fmt.Sprintf("%d分%d秒", diffMinutes, diffSeconds)}remark, _ :=row["remark"].(string)creatorStr :=""sort_creatorStr :=""groupStr :=""iflen(users)>0{creator, _ :=row["creator"].(mo.ObjectID)sort_creator, _ :=row["sort_creator"].(mo.ObjectID)creatorStr=users[creator]sort_creatorStr=users[sort_creator]iflen(inventorys)>0{group :=inventorys[wcs_sn]groupStr=users[group]}}f.SetCellValue(sheetName, fmt.Sprintf("A%d", rowNum), wcs_sn)f.SetCellValue(sheetName, fmt.Sprintf("B%d", rowNum), ss)f.SetCellValue(sheetName, fmt.Sprintf("C%d", rowNum), tt)f.SetCellValue(sheetName, fmt.Sprintf("D%d", rowNum), container_code)f.SetCellValue(sheetName, fmt.Sprintf("E%d", rowNum), src)f.SetCellValue(sheetName, fmt.Sprintf("F%d", rowNum), dst)f.SetCellValue(sheetName, fmt.Sprintf("G%d", rowNum), p)f.SetCellValue(sheetName, fmt.Sprintf("H%d", rowNum), cc)f.SetCellValue(sheetName, fmt.Sprintf("I%d", rowNum), minsecdiff)f.SetCellValue(sheetName, fmt.Sprintf("J%d", rowNum), remark)f.SetCellValue(sheetName, fmt.Sprintf("K%d", rowNum), groupStr)f.SetCellValue(sheetName, fmt.Sprintf("L%d", rowNum), creatorStr)f.SetCellValue(sheetName, fmt.Sprintf("M%d", rowNum), sort_creatorStr)f.SetCellValue(sheetName, fmt.Sprintf("N%d", rowNum), warehouseId)}//7. 设置列宽等样式 f.SetColWidth(sheetName,"A","A",10)f.SetColWidth(sheetName,"B","B",10)f.SetColWidth(sheetName,"C","C",10)f.SetColWidth(sheetName,"D","D",10)f.SetColWidth(sheetName,"E","E",10)f.SetColWidth(sheetName,"F","F",10)f.SetColWidth(sheetName,"G","G",10)f.SetColWidth(sheetName,"H","H",10)f.SetColWidth(sheetName,"I","I",10)f.SetColWidth(sheetName,"J","J",10)f.SetColWidth(sheetName,"K","K",10)f.SetColWidth(sheetName,"L","L",10)f.SetColWidth(sheetName,"M","M",10)f.SetColWidth(sheetName,"N","N",10)//8. 输出文件 filename :=fmt.Sprintf("%s.xlsx", time.Now().Format("20060102_150405"))c.Header("Content-Type","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")c.Header("Content-Disposition", fmt.Sprintf("attachment; filename*=UTF-8''%s", filename))c.Header("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", filename))iferr :=f.Write(c.Writer);err!=nil{c.JSON(http.StatusInternalServerError, gin.H{"code":500,"msg":"生成文件失败"})}}

2. 获取数据库数据

func queryAllTaskFromDB(wId string, u ii.User)([]mo.M, error){// 获取用户 fil :=mo.Matcher{}fil.Eq("warehouse_id", wId)fil.In("status", mo.A{"status_success","status_delete","status_cancel"})list, err :=svc.Svc(u).Find(stocks.WmsTaskHistory, fil.Done())iferr!=nil{returnnil, err}returnlist, nil}

3.获取用户列表

func getUserAll(u ii.User)(map[mo.ObjectID]string, error){users:=make(map[mo.ObjectID]string)list, err :=svc.Svc(u).Find(stocks.WmsUser, mo.D{})iferr!=nil{returnnil, err}for_, row :=range list{_id, _ :=row[mo.ID.Key()].(mo.ObjectID)name, _ :=row["name"].(string)users[_id]=name}returnusers, nil}

4.获取入库单数据

func getInventoryAll(u ii.User)(map[string]mo.ObjectID, error){data :=make(map[string]mo.ObjectID)list, err :=svc.Svc(u).Find(stocks.WmsGroupInventory, mo.D{})iferr!=nil{returnnil, err}for_, row :=range list{wcsSn, _ :=row["wcs_sn"].(string)creator, _ :=row["creator"].(mo.ObjectID)data[wcsSn]=creator}returndata, nil}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/3 5:02:06

Codex 任务协作指南

Codex 任务协作指南&#xff1a;消息队列、引导、批注和多任务并行 在使用 Codex 处理复杂开发任务时&#xff0c;理解「消息何时排队、何时插队」「如何定点修改」「何时开新对话」&#xff0c;以及「计划模式、权限设置、运行环境」如何配合&#xff0c;能显著提升协作效率&…

作者头像 李华
网站建设 2026/7/3 4:59:40

2026年论文降重技巧大全:从知网30%到5%的10个实战方法

一、2026年论文降重现状&#xff1a;从被动应对到主动出击2026年&#xff0c;论文降重已经成为毕业季的标配动作。知网、维普等检测系统不断升级算法&#xff0c;传统的复制粘贴式写作已经行不通。很多同学查重率高达30%以上&#xff0c;面临无法参加答辩的困境。但降重不是简单…

作者头像 李华
网站建设 2026/7/3 4:58:34

TTS-Backup终极指南:3个场景教你轻松保护桌游数据

TTS-Backup终极指南&#xff1a;3个场景教你轻松保护桌游数据 【免费下载链接】tts-backup Backup Tabletop Simulator saves and assets into comprehensive Zip files. 项目地址: https://gitcode.com/gh_mirrors/tt/tts-backup 还在担心辛苦创建的Tabletop Simulator…

作者头像 李华
网站建设 2026/7/3 4:58:02

ClaudeCode模型选型指南:如何为真实编码场景匹配最优AI模型

1. 项目概述&#xff1a;为什么“用哪个模型最划算”不是个简单选择题ClaudeCode 这个名字一出来&#xff0c;很多人第一反应是——哦&#xff0c;这是 Anthropic 官方出的 IDE 插件&#xff1f;其实不是。ClaudeCode 是社区自发构建的一类本地化 Claude 接入工具链&#xff0c…

作者头像 李华
网站建设 2026/7/3 4:52:38

JMeter高并发测试实战:从原理到性能瓶颈定位

1. 项目概述&#xff1a;为什么接口高并发测试是必选项 最近在复盘一个线上服务故障&#xff0c;起因很简单&#xff1a;一个核心查询接口在促销活动开始后的几分钟内响应时间飙升&#xff0c;最终导致服务雪崩。事后排查&#xff0c;根本原因是在开发阶段&#xff0c;这个接口…

作者头像 李华