前言
我还有一个朋友, 最近要实现一个数据导出excel的功能, 来看一下主要怎么实现吧
实现
主要用到了 https://godoc.org/github.com/tealeg/xlsx
测试脚本
package main import ( "testing" ) import ( "github.com/tealeg/xlsx" ) func TestCreateExcel(t *testing.T) { var user = struct { Name string Age int }{} user.Name, user.Age = "飞起来", 11 // 生成一个新的文件 file := xlsx.NewFile() // 添加sheet页 sheet, _ := file.AddSheet("Sheet1") // 插入表头 titleRow := sheet.AddRow() titleRow.AddCell().Value = "名字" titleRow.AddCell().Value = "年龄" // 插入内容 for a := 0; a <= 2; a++ { row := sheet.AddRow() row.WriteStruct(&user, -1) } // 保存文件 err := file.Save("file.xlsx") if err != nil { panic(err) } }
这是生成的excel文件
封装个公用方法
主要的功能还是api生成excel返回给前端提供用户下载(接口如果是get请求的话则可以直接下载)
// DataToExcel 数据导出excel, dataList里面的对象为指针 func DataToExcel(w http.ResponseWriter, r *http.Request, titleList []string, dataList []interface{}, fileName string) { // 生成一个新的文件 file := xlsx.NewFile() // 添加sheet页 sheet, _ := file.AddSheet("Sheet1") // 插入表头 titleRow := sheet.AddRow() for _, v := range titleList { cell := titleRow.AddCell() cell.Value = v cell.GetStyle().Font.Color = "00FF0000" } // 插入内容 for _, v := range dataList { row := sheet.AddRow() row.WriteStruct(v, -1) } fileName = fmt.Sprintf("%s.xlsx", fileName) //_ = file.Save(fileName) w.Header().Add("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, fileName)) w.Header().Add("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") var buffer bytes.Buffer _ = file.Write(&buffer) content := bytes.NewReader(buffer.Bytes()) http.ServeContent(w, r, fileName, time.Now(), content) }
这样就可以了, 然后下面是让前端朋友写的测试代码, 主要使用blob来实现
fetch("http://127.0.0.1:9999/test", { method: "POST", body: JSON.stringify({ "page": 1, "size": 10, }), headers: { }, responseType: 'blob' }).then(async (res) => { let blob = await res.blob(); const link = document.createElement('a'); blob = new Blob([blob], {type: 'application/x-excel'}); console.log(blob); link.style.display = 'none'; link.href = URL.createObjectURL(blob); link.download = "测试execl.xlsx"; document.body.appendChild(link); link.click(); document.body.removeChild(link); }).catch(error => { console.log(error); });