使用模块
github.com/tealeg/xlsx
模块地址
官方文档地址
代码实现
- 核心代码func ToExcel、ResponseXls
- 篇幅原因这里只贴出核心代码
import (
"bytes"
"fmt"
"io"
"net/http"
"time"
"github.com/gin-gonic/gin"
"github.com/tealeg/xlsx"
)
type DownloadRoleInfoBo struct {
Name string `json:"name"`
Level int `json:"level"`
Description string `json:"description"`
CreateTime time.Time `json:"createTime"`
}
func DownRolesHandler(c *gin.Context) {
var roleData []DownloadRoleInfoBo
var res []interface{}
for _, role := range roleData {
res = append(res, &DownloadRoleInfoBo{
Name: role.Name,
Level: role.Level,
Description: role.Description,
CreateTime: role.CreateTime,
})
}
content := ToExcel([]string{`角色名称`, `角色级别`, `描述`, `创建日期`}, res)
ResponseXls(c, content, "角色数据")
}
func ToExcel(titleList []string, dataList []interface{}) (content io.ReadSeeker) {
file := xlsx.NewFile()
sheet, _ := file.AddSheet("Sheet1")
titleRow := sheet.AddRow()
for _, v := range titleList {
cell := titleRow.AddCell()
cell.Value = v
}
for _, v := range dataList {
row := sheet.AddRow()
row.WriteStruct(v, -1)
}
var buffer bytes.Buffer
_ = file.Write(&buffer)
content = bytes.NewReader(buffer.Bytes())
return
}
func ResponseXls(c *gin.Context, content io.ReadSeeker, fileTag string) {
fileName := fmt.Sprintf("%s%s%s.xlsx", NowTime(), `-`, fileTag)
c.Writer.Header().Add("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, fileName))
c.Writer.Header().Add("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
http.ServeContent(c.Writer, c.Request, fileName, time.Now(), content)
}