Golang Gin 接口返回 Excel 文件

文章目录

  • 1.Web 页面导出数据到文件由后台实现还是前端实现?
  • 2.Golang Excel 库选型
  • 3.后台实现示例
  • 4.xlsx 库的问题
  • 5.小结
  • 参考文献

1.Web 页面导出数据到文件由后台实现还是前端实现?

Web 页面导出表数据到 Excel(或其他格式)可以由前端或后台来实现,具体的实现方式取决于你的应用需求和架构。以下是一些考虑因素:

  1. 前端实现
  • 如果你的数据导出不涉及复杂的数据处理、数据权限控制或数据来源的保护,你可以考虑在前端实现数据导出。

  • 前端实现通常意味着使用JavaScript库或框架来生成Excel文件,例如使用开源库如SheetJS的xlsx.js或者使用浏览器内置的API,如Blob对象和FileSaver.js来生成Excel文件。

  • 前端实现具有即时性,用户可以在浏览器中直接进行数据导出操作,不需要等待后台处理。

  1. 后台实现
  • 如果你需要处理大量数据、进行复杂的数据操作、实施数据权限控制、或者需要从数据库或其他后端数据源提取数据,通常更适合在后台实现。

  • 后台实现可以使用服务器端脚本,如 PHP、Node.js、Python 等,来生成 Excel文件。这可以确保数据的一致性和安全性。

  • 后台实现还可以允许对大型数据集进行分页、筛选、排序等操作,以提供更强大的导出功能。

一种常见的做法是,前端触发数据导出请求,将请求发送到后台,后台处理数据生成Excel文件,然后将生成的Excel文件发送回前端以供用户下载。这种方法结合了前后端的优势,可以提供数据处理和安全性。

2.Golang Excel 库选型

目前开源 Golang Excel 库流行的有两个:

  • excelize

Excelize 是一个功能强大的 Go 语言 Excel 库,你可以使用 Excelize 创建和编辑工作簿、工作表、单元格等内容。

GitHub 仓库:https://github.com/qax-os/excelize

  • xlsx

xlsx 是一个简单的Golang库,用于读写 XLSX 文件。它提供了创建、编辑工作簿、工作表和单元格的功能。

GitHub 仓库:https://github.com/tealeg/xlsx

因为 xlsx 较为轻量,所以下面以 xlsx 为例,给出实现。

3.后台实现示例

在 Web 框架 Gin 中生成 Excel 文件并在接口返回。

func ExportHandler(c *gin.Context) {file := xlsx.NewFile()sheet, _ := file.AddSheet("InsuranceActive")// Add titles.titles := []string{"Id","CreatedAt","UpdatedAt","CreatorId","UpdaterId","CompanyName",}row := sheet.AddRow()for _, title := range titles {cell := row.AddCell()cell.Value = title}// Add rows just like add titles....// Return the excel file.c.Header("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")filename := fmt.Sprintf("IndustryInfos_%v.xlsx", time.Now().Format("2006-01-02T15:04:05"))c.Header("Content-Disposition", "attachment; filename="+filename)if err := file.Write(c.Writer); err != nil {c.JSON(http.StatusOK, "failed")return}c.JSON(http.StatusOK, "suceess")
}// 设置路由
engine.GET("/xlsx/export", ExportHandler)

注意回包 Header 的设置:
(1)Content-Type 设为:

"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"

关于其他类型文件的 MIME 可以参考:What is a correct MIME type for .docx, .pptx, etc.? - Stack Overflow。

(2)还需要设置 “Content-Disposition” 表示回包是一个附件,并需要指定附件名称。

4.xlsx 库的问题

通过浏览器下载库 tealeg/xlsx 生成的 Excel 文件后,打开时会报下面的错误。

在这里插入图片描述
点击“是”后可正常打开文件,说明文件内容是正确的。

该警告在 v1 就已经出现,且库的作者早已知晓,但目前最新版本 v3 仍未解决该问题。可能因为不影响 Excel 文件内容的正确性,所以拖到现在仍未解决。

详细讨论,请参见 XLSX files produced by this library need repair by Excel. #53。

奇怪地是通过func (*File) Save直接保存至本地的 Excel 文件没有这个问题。

5.小结

综上所述,前端或后台的选择取决于你的具体需求、性能、安全性以及数据处理的复杂性。一些应用可能会同时在前端和后台实现导出功能,以提供更灵活的选项。


参考文献

The tealeg/xlsx Tutorial: Reading and writing xlsx files with Go
What is a correct MIME type for .docx, .pptx, etc.? - Stack Overflow
XLSX files produced by this library need repair by Excel. #53

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

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

相关文章

【算法挑战】设计一个支持增量操作的栈(含解析、源码)

1381.设计一个支持增量操作的栈 https://leetcode-cn.com/problems/design-a-stack-with-increment-operation/ 1381.设计一个支持增量操作的栈 题目描述方法 1: 用数组或链表模拟栈 数组复杂度分析链表复杂度分析代码 方法 2: 空间换时间 图解复杂度分析代码 题目描述 请…

与云栖的浪漫邂逅:记一段寻找云端之美的旅程

云端之旅 2023 年的云栖大会如约而至,这次云栖大会也是阿里新任掌门蔡老板当任阿里巴巴董事局主席以来的第一次。大会与以往有很多不一样的地方,其中 AIGC 更是本届大会的重点议题!你会感叹,阿里还是猛啊! 我逛了下展…

算法学习打卡day40|343. 整数拆分、96.不同的二叉搜索树

343. 整数拆分 力扣题目链接 题目描述: 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 …

一条 SQL 是如何在 MyBatis 中执行的

前言 MyBatis 执行 SQL 的核心接口为 SqlSession 接口,该接口提供了一些 CURD 及控制事务的方法,另外还可以通过 SqlSession 先获取 Mapper 接口的实例,然后通过 Mapper 接口执行 SQL,Mapper 接口方法的执行最终还是委托到 SqlSe…

Unity屏幕中涂鸦

LineRenderer LineRenderer是Unity中的一个组件,用于在场景中绘制简单的线段。 LineRenderer组件允许你通过设置一系列顶点来定义线段的形状和外观。它会根据这些顶点自动在场景中绘制出线段。 下面是LineRenderer的一些重要属性和方法: positionCou…

栈及其栈的模拟实现和使用

1. 栈(Stack) 1.1 概念 栈 :一种特殊的线性表,其 只允许在固定的一端进行插入和删除元素操作 。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO ( Last In First Out )的原则…

初识FFmpeg

前言 无意间见到群里的小伙伴展示视频工具。功能比较多,包括视频编码修改,画质处理,比例处理、名称提取,剪辑、标题拆解。因此开始了FFmpeg学习。以下摘自百度百科的解释。 FFmpeg是一套可以用来记录、转换数字音频、视频&#xf…

【Proteus仿真】【Arduino单片机】简易电子琴

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器,使用无源蜂鸣器、按键等。 主要功能: 系统运行后,按下K1-K7键发出不同音调。 二、软件设计 /* 作者:嗨小易&a…

视频平台跨网级联视频压缩解决方案

一、 简介 视频监控领域对带宽有着较大的需求,这是因为视频流需要实时占用网络带宽资源。视频监控的传输带宽是组网结构的基础保障,关系到视频监控的稳定性、可靠性和可拓展性等因素。例如,720P的视频格式每路摄像头的比特率为2Mbps&#xff…

【机器学习合集】模型设计之网络宽度和深度设计 ->(个人学习记录笔记)

文章目录 网络宽度和深度设计1. 什么是网络深度1.1 为什么需要更深的模型浅层学习的缺陷深度网络更好拟合特征学习更加简单 2. 基于深度的模型设计2.1 AlexNet2.2 AlexNet工程技巧2.3 VGGNet 3. 什么是网络宽度3.1 为什么需要足够的宽度 4. 基于宽度模型的设计4.1 经典模型的宽…

在IDEA运行spark程序(搭建Spark开发环境)

建议大家写在Linux上搭建好Hadoop的完全分布式集群环境和Spark集群环境,以下在IDEA中搭建的环境仅仅是在window系统上进行spark程序的开发学习,在window系统上可以不用安装hadoop和spark,spark程序可以通过pom.xml的文件配置,添加…

【洛谷算法题】P5710-数的性质【入门2分支结构】

👨‍💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5710-数的性质【入门2分支结构】🌏题目描述🌏输入格式&a…

开源库存管理系统InvenTree的安装

本文是应网友 shijie880500 要求折腾的; 什么是 InvenTree ? InvenTree 是一个开源的库存管理系统,提供强大的低级别库存控制和零件跟踪。InvenTree 系统的核心是 Python/Django 数据库后端,它提供了一个管理界面(基于…

绝缘检测原理和绝缘电阻计算方法

文章目录 简介绝缘检测功能绝缘检测原理绝缘电阻检测的常用方法不平衡电桥法 绝缘电阻绝缘电阻的计算 绝缘检测开启或关闭为什么根据 V1 < V2 或 V1 ≥ V2 判断是上桥臂并入电阻还是下桥臂并入电阻 简介 绝缘检测是判断动力(正、负)总线与外…

Flutter三棵树的创建流程

一、Flutter常见的家族成员 Widget常见的家族成员 Element常见的家族成员 Render常见的家族成员 二、示例代码对应的Flutter Inspector树 示例代码:MyApp->MyHomePage->ErrorWidget,包含了StatelessWidget、StatefulWidget、LeafRenderObjectWid…

位运算与简单应用

一.位运算的基本概念: 首先,位运算是针对二进制的,(数字本来int,4字节,下面假设为1字节)。比如数字12,它的二进制本来是: 0000 0000 0000 0000 0000 0000 0000 1100 因为前面的数字大都是0,所以为了简写…

火影忍者游戏攻略大公开!成为忍者大师的秘诀揭秘

大家好!作为火影忍者游戏的玩家,我们都希望能够在游戏中成为优秀的忍者大师,战胜强大的对手。为了帮助大家实现这一目标,我想分享一些实用的攻略和技巧。 首先,熟悉忍者技能是成为忍者大师的基础。在火影忍者游戏中&am…

C语言_自定义类型详解

文章目录 前言一.结构体的声明1.1结构体的基础知识1.2结构的声明1.3特殊声明1.4结构体的自引用在结构中包含一个类型为该结构本身的成员是否可以?正确的自引用方式匿名结构体类型和typedef的结合形式 1.5 结构体变量的定义和初始化结构体定义与初始化结构体里嵌套结…

【Linux进程】再谈软件—操作系统(Operator System)

目录 操作系统(Operator System) 概念 设计OS的目的 如何理解 "管理"——先描述再组织 系统调用和库函数概念 总结 操作系统(Operator System) 概念 任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。 笼统的理解,操作系统…