在Gin路由中创建一个内存Excel对象,提供给前端下载

使用的库

"github.com/xuri/excelize/v2"

后端的代码

	f := excelize.NewFile()
	defer func() {
		if err := f.Close(); err != nil {
			fmt.Println(err)
		}
	}()
	sheetName := "Sheet1"
	//新增工作表
	index, err := f.NewSheet(sheetName)
	f.SetActiveSheet(index)
	//第一行的样式, 加粗, 字体14
	styleID, _ := f.NewStyle(&excelize.Style{
		Font: &excelize.Font{
			Bold: true,
			Size: 14, // 字体大小设置为14号字
		},
	})

	//插入第一行的内容
	if err = f.SetSheetRow(sheetName, "A1", &[]any{code.DBNAME, code.DBLocation, fact.Name}); err != nil {
		global.Logger.Errorf("往xlsx文件追加行失败:%v", err)
		app.NewResponse(c).ToErrorResponse(code.ServerError)
		return
	}
	//设置第一行样式
	if err = f.SetRowStyle(sheetName, 1, 1, styleID); err != nil {
		global.Logger.Errorf("设置xlsx文件样式失败:%v", err)
		app.NewResponse(c).ToErrorResponse(code.ServerError)
		return
	}
	//设置行宽度
	if err = f.SetColWidth(sheetName, prefix, "C", 20); err != nil {
		global.Logger.Errorf("设置xlsx文件追加行失败:%v", err)
		app.NewResponse(c).ToErrorResponse(code.ServerError)
		return
	}
	nowStr := time.Now().Format(time.DateTime)
	filename := "test" + nowStr
	c.Header("Content-Disposition", "attachment; filename="+filename)
	c.Header("filename", filename)
	buff, err := f.WriteToBuffer()
	if err != nil {
		app.NewResponse(c).ToErrorResponse(code.ServerError)
		return
	}
	c.Data(200, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", buff.Bytes())

前端的代码

    exportWinTillByFact(_type, fid, params, setLoading) {
        this.axios.get(`fact/${_type}/${fid}/xlsx`, { params, responseType: 'blob' }).then(res => {
            const url = window.URL.createObjectURL(new Blob([res.data],
                {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'}));
              const link = document.createElement('a');
              link.href = url;
              const fileName = decodeURI(res.headers['filename']);
              link.setAttribute('download', fileName);
              document.body.appendChild(link);
              link.click();
              document.body.removeChild(link)
        }).catch(error => {
            const { data: { msg }, status } = error.response
            message.error(`Error Code:${status}  Message: ${msg}`)
        }).finally(
            e => {
                setLoading(false)
            }
        )
    }

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注