go实现导出excel或csv文件
很早之前的一个项目需求要,需要把公司信息列表和漏洞信息列表导出excel文件,没有很高要求,能看就行吧,就做了导出csv的两个接口。 最近看我的CSDN发现好久没有写了,惭愧啊!其实遇到的问题,我都有详细记录,自己能看懂,但分享给别人也能看懂就需要好好写了,尽量有空整吧,需要坚持!
实现代码
我把实现代码简单写了一下,是用调用接口的方式实现的,用的gin 包。
最近又有了导出CSV文件的需求,就重新修改了一下这篇文章,根据不同情况分类4类,用4个api来分别请求实现。
第一个接口是这个文章之前的代码,直接返回了文件,请求接口就下载文件,因为在代码里创建了文件。
第二、三、四个接口都是,代码里只返回对应文件格式的数据,需要前端进行处理保存到对应的文件中实现下载。
先说一下优缺点,第一种,需要后端在进程里创建对应的文件保存,最后还要删除掉,如果请求多或文件内容多,都会给后端内存造成很大压力,所以建议使用后面的api,让前端直接获取数据进行保存文件。也要看各自的需求吧,看代码。
Content-Type
下载文件一般要设置对应的文件格式,就是Content-Type ,包括 http 的mime type,知道这个内容的可以跳过直接先看代码,有疑问可以先看下这几篇文章:
1, HTTP Content-Type(MIME List)介绍
2, 阿里云 MIME List 介绍
3, 菜鸟学院 MEMI List 介绍
package main
import (
"bytes"
"encoding/csv"
"fmt"
"net/http"
"os"
"time"
"github.com/gin-gonic/gin"
"github.com/tealeg/xlsx"
)
type Server struct {
engine *gin.Engine
}
func NewServer() *Server {
ser := &Server{
// 用的gin.Default()引擎,自带Logger and Recovery两个中间件,也可以用gin.New(),不带中间件
engine: gin.Default(),
}
return ser
}
// 这个是为了造数据,可以忽略。
type Student struct {
ID string
Name string
Age string
Score string
Addr string
Date string
}
// 造数据的方法
func (s *Server) getData() []*Student {
res := make([]*Student, 0, 25)
for i := 1; i <= 20; i++ {
res = append(res, &Student{
ID: fmt.Sprintf("2021000000%d", i),
Name: fmt.Sprintf("辣条精-%d", i),
Age: fmt.Sprintf("1%d", i),
Score: fmt.Sprintf("8%d", i),
Addr: fmt.Sprintf("辣条小镇太平村-%d号", i),
Date: fmt.Sprintf("2012-12-%d", i),
})
}
return res
}
// 这是对应的4个接口,下面会具体说明一下不同接口的作用。
func (s *Server) Start() {
gin.SetMode(gin.ReleaseMode)
s.engine.GET("/csv", s.csvApi) //1,请求后直接下载csv文件
s.engine.GET("/csv_data"