go项目中,有很多操作Excel的库,我使用的是github.com/xuri/excelize/v2,这个库的官方教程介绍 · Excelize 简体字文档 (xuri.me)
下面我介绍我用到的一些方法
f:excelize.NewFile() //新建一个文件
f.SetCellValue("Sheet1", "A1", "姓名") //写入属性
//为表格设置一些样式
styleID, err := f.NewStyle(&excelize.Style{
Alignment: &excelize.Alignment{
Horizontal: "center",
},
Font: &excelize.Font{
Family: "宋体",
Size: 10,
},
})
将文件格式和数据编辑好后,下面就要将数据返回给前端,
// 将 Excel 文件保存到临时文件中
tempFile, err := os.CreateTemp("", "excel_*.xlsx")
if err != nil {
return nil, err
}
defer os.Remove(tempFile.Name())
defer tempFile.Close()
if err := f.Write(tempFile); err != nil {
return nil, err
}
// 设置 HTTP 响应头
w.Header().Set("Content-Disposition", "attachment; filename=xxx.xlsx")
w.Header().Set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
err = f.Write(w)
if err != nil {
return nil, err
}
我们可以将导出Excel的方法抽离出来,我们用的是Gin框架,那末在Controller层,我们可以将c.Writer响应体传入导出Excel的方法中
// ExportHandler
func ExportHandler(c *gin.Context) {
f, err := utils.ExportExcel(c.Writer, data)
if err != nil {
global.GVA_LOG.Error("导出失败", zap.Error(err))
response.FailWithMessage("导出失败", c)
return
}
response.OkWithData(f, c)
}
那末在导出Excel的方法里,我们这样设置
func ExportExcel(w http.ResponseWriter, datas []response.ExamPeople) (*excelize.File, error) {
f := excelize.NewFile()
// 将 Excel 文件保存到临时文件中
tempFile, err := os.CreateTemp("", "excel_*.xlsx")
if err != nil {
return nil, err
}
defer os.Remove(tempFile.Name())
defer tempFile.Close()
if err := f.Write(tempFile); err != nil {
return nil, err
}
// 设置 HTTP 响应头
w.Header().Set("Content-Disposition", "attachment; filename=xxx.xlsx")
w.Header().Set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
err = f.Write(w)
if err != nil {
return nil, err
}
return f, err
}
然后前端请求这个方法的时候会自动下载Excel的文件。这样导出Excel文件就实现了。