由于xlsx库两年没有更新了,所以今天又写了个使用excelize到处excel
传参格式仍可参照用xlsx格式:
go语言使用tealeg/xlsx导出excel_借我三行代码的博客-CSDN博客
type UserData struct {
Name string
Age int
Gender string
}
func downRolesHandler(ctx *gin.Context) {
// 数据
data := []UserData{
{"张三", 18, "男"},
{"李四", 20, "女"},
{"王五", 22, "男"},
}
//var res []interface{}
//for _, trip := range data {
// res = append(res, trip)
//}
content := ToExcel([]string{"姓名", "年龄", "性别"}, data)
ResponseXls(ctx, content, "123")
}
func ToExcel(titleList []string, dataList []UserData) (content io.ReadSeeker) {
// 生成一个新的文件
file := excelize.NewFile()
// 添加sheet页
sheet, _ := file.NewSheet("Sheet1")
file.SetActiveSheet(sheet)
// 插入表头
for i, v := range titleList {
cellName, _ := excelize.CoordinatesToCellName(i+1, 1)
file.SetCellValue("Sheet1", cellName, v)
}
// 插入内容
for i, v := range dataList {
row := i + 2 //从第二行开始插入数据
//cellName, _ := excelize.CoordinatesToCellName(i+1, 2)
//file.SetCellValue("sheet1", cellName, v)
cells := []interface{}{v.Name, v.Age, v.Gender}
if err := file.SetSheetRow("Sheet1", fmt.Sprintf("A%d", row), &cells); err != nil {
panic(err)
}
}
var buffer bytes.Buffer
_ = file.Write(&buffer)
content = bytes.NewReader(buffer.Bytes())
return
}
// 向前端返回Excel文件
// 参数 content 为上面生成的io.ReadSeeker, fileTag 为返回前端的文件名
func ResponseXls(c *gin.Context, content io.ReadSeeker, fileTag string) {
fileName := fmt.Sprintf("%s%s%s.xlsx", xtime.Now(), `-`, 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, xtime.Now().Time(), content)
}