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文件。

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

(2)后台实现。

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

  • 后台实现可以使用服务器端脚本,如 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.mzph.cn/news/128028.shtml

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

相关文章

One-to-N N-to-One: Two Advanced Backdoor Attacks Against Deep Learning Models

One-to-N & N-to-One: Two Advanced Backdoor Attacks Against Deep Learning Models----《一对N和N对一:针对深度学习模型的两种高级后门攻击》 1对N: 通过控制同一后门的不同强度触发多个后门 N对1: 只有当所有N个后门都满足时才会触发…

centos7完全卸载和安装mysql8

问题描述 最近安装了MYSQL8,遇到了各种问题,总体汇总一下,凡是无法启动就是my.cnf和初始化的参数不匹配。 第一种 启动前设置了mysqld --initialize --usermysql --lower-case-table-names1,my.cnf文件却没有修改就去启动。 第…

测试为什么分白盒、黑盒、单元、集成测试?

对于想进入测试行业的小萌新,本文的诉求主要分为三块: 1、想知道分为这么多种测试的原因 2、解决各种概念问题 3、提供各种软件测试工具 安排! 一、为什么测试的概念这么多 一个软件项目就好比一部复杂的汽车,有很多零件&#x…

Java作业二

一、使用方法编写求圆面积和周长的程序,运行时提示输入圆半径,然后输出计算结果。运行效果如下图所示: import java.util.Scanner;public class Test {public static void main(String[] args) {Scanner input new Scanner(System.in);Syste…

Vue使用Object.definedproperty的数据监听 使用js实现一种发布订阅的模式

Vue是一款流行的JavaScript框架,它可以帮助开发者构建交互式的Web应用程序。在Vue中,我们可以使用Object.definedproperty来实现数据的监听,也可以使用发布订阅模式来实现组件之间的通信。本文将详细讲解这两个主题,并提供代码注释…

pycharm更改远程服务器地址

一、问题描述 在运行一些项目时,我们常需要在pycharm中连接远程服务器,但万一远程服务器的ip发生了变化,该如何修改呢?我们在file-settings-python interpreter中找到远程服务器,但是发现ip是灰色的,没有办…

最新Ai智能创作系统源码V3.0,AI绘画系统/支持GPT联网提问/支持Prompt应用+搭建部署教程

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

docker--基本操作

第 1 章 Docker基础 1.1 docker简介 在这一部分我们主要讲两个方面: docker是什么、docker特点 1.1.1 docker是什么 docker是什么? docker的中文解释是码头工人。 官方解释: Docker是一个开源的容器引擎,它基于LCX容器技术&…

设计模式之两阶段终止模式

文章目录 1. 简介 2. 常见思路3. 代码实战 1. 简介 两阶段终止模式(Two-Phase Termination Pattern)是一种软件设计模式,用于管理线程或进程的生命周期。它包括两个阶段:第一阶段是准备阶段,该阶段用于准备线程或进程…

Go语言的键盘输入和打印输出

键盘输入和打印输出 一、打印输出 1.1 fmt包 fmt包实现了类似C语言printf和scanf的格式化I/O。格式化verb(‘verb’)源自C语言但更简单。 详见官网fmt的API:https://golang.google.cn/pkg/fmt/ 1.2 导入包 import "fmt"1.3 常…

elasticsearch中highlight的“假匹配”

elasticsearch中highlight的“假匹配” 一个highlight的假高亮现象: /company_meta_info/_search?rest_total_hits_as_inttrue {"_source": {"includes": ["name","address"]},"query": {"bool": {&…

[笔记] 字符串输入 #字符输入

字符串的多组输入格式 scanf("%c", &ch)读取单个字符,用EOF作为结束的判断标志。 刷题记录:[题] 查找最大元素 #字符输入 逐个字符手动读取,因为题目的要求,要对每个字符逐个操作,所以就输入的时候顺便…

android一些经验记录

1.应用程序闪退,连画面都没有,先去看看程序的xml文件中的控件是不是有错误。

C++:string类!

Cstring 是C中的字符串。 字符串对象是一种特殊类型的容器,专门设计来操作的字符序列。 不像传统的c-strings,只是在数组中的一个字符序列,我们称之为字符数组,而C字符串对象属于一个类,这个类有很多内置的特点,在操作…

软考 系统架构设计师系列知识点之设计模式(11)

接前一篇文章:软考 系统架构设计师系列知识点之设计模式(10) 所属章节: 老版(第一版)教材 第7章. 设计模式 第2节. 设计模式实例 相关试题 10. 设计模式按照目的可划分三类,其中,…

某国产中间件企业:提升研发安全能力,助力数字化建设安全发展

​某国产中间件企业是我国中间件领导者,国内领先的大安全及行业信息化解决方案提供商,为各个行业领域近万家企业客户提供先进的中间件、信息安全及行业数字化产品、解决方案及服务支撑,致力于构建安全科学的数字世界,帮助客户实现…

c语言刷题(9周)(6~10)

输入10个不等的整数创建数组a[10],在数组a中找是否存在整数t。若存在显示找到了及下标位置,若不存在显示error。 题干输入10个不等的整数创建数组a[10],在数组a中找是否存在整数t。若存在显示找到了及下标位置,若不存在显示error…

进程空间管理:用户态和内核态

用户态虚拟空间里面有几类数据,例如代码、全局变量、堆、栈、内存映射区等。在 struct mm_struct 里面,有下面这些变量定义了这些区域的统计信息和位置。 unsigned long mmap_base; /* base of mmap area */ unsigned long total_vm; /* Total page…

Python算法——选择排序

选择排序(Selection Sort)是一种简单的排序算法,它的基本思想是在未排序的部分中选择最小(或最大)的元素,然后将其放在已排序部分的末尾。选择排序不同于冒泡排序,它不需要反复交换元素&#xf…

Android 自定义View一

1.继承已有VIew,改写尺寸:重写onMeasure SquareImageView 2.完全自定义重写onMeasure 3.自定义Layout 重写onMeasure onLayout 1.继承已有VIew,改写尺寸:重写onMeasure 流程: 重写onMeasure 用getmeasureedWidth …