很早之前的一个项目需求要,需要把公司信息列表和漏洞信息列表导出excel文件,没有很高要求,能看就行吧,就做了导出csv的两个接口。 最近看我的CSDN发现好久没有写了,惭愧啊!其实遇到的问题,我都有详细记录,自己能看懂,但分享给别人也能看懂就需要好好写了,尽量有空整吧,需要坚持!
实现代码
我把实现代码简单写了一下,是用调用接口的方式实现的,用的gin 包。
package main
import (
"encoding/csv"
"fmt"
"github.com/gin-gonic/gin"
"os"
"time"
)
type ToCSV struct {
engine *gin.Engine
}
func NewServer() *ToCSV {
ser := &ToCSV{
// 用的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 (t *ToCSV) 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
}
// 实现csv文件写入的过程
func (t *ToCSV) toCsv() (string, error) {
data := t.getData()
strTime := time.Now().Format("20060102150405")
filename := fmt.Sprintf("学生%s.csv", strTime)
xlsFile, fErr := os.OpenFile("./"+filename, os.O_RDWR|os.O_CREATE, 0766)
if fErr != nil {
fmt.Println("Export:created excel file failed ==", fErr)
return "", fErr
}
defer xlsFile.Close()
xlsFile.WriteString("\xEF\xBB\xBF")
wStr := csv.NewWriter(xlsFile)
wStr.Write([]string{"学生学号", "学生姓名", "学生年龄", "学生成绩", "家庭地址", "学生生日"})
for _, s := range data {
wStr.Write([]string{s.ID, s.Name, s.Age, s.Score, s.Addr, s.Date})
}
wStr.Flush()
return filename, nil
}
// 给api返回前端用的,导出下载
func (t *ToCSV) csvApi(c *gin.Context) {
filename, err := t.toCsv()
if err != nil {
fmt.Println("t.toCsv() failed == ", err)
}
if filename == "" {
fmt.Println("export excel file failed == ", filename)
}
// 导出后删除文件
defer func() {
err := os.Remove("./" + filename)
if err != nil {
fmt.Println("remove excel file failed", err)
}
}()
c.Writer.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename=%s", filename))
c.Writer.Header().Add("Content-Type", "application/octet-stream")
c.File("./" + filename)
}
// gin 调用接口
func (t *ToCSV) Start() {
// 设置gin的模式,不设置默认为 测试模式
gin.SetMode(gin.ReleaseMode)
t.engine.GET("/csv", t.csvApi)
t.engine.Run(":9999")
}
// 逻辑入口
func main() {
NewServer().Start()
}
请求测试
请求地址: http://127.0.0.1:9999/csv
请求后会直接下载导出文件。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)