我还有一个朋友, 最近要实现一个数据导出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)
}
}
主要的功能还是api生成excel返回给前端提供用户下载
// 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);
});