测试管理平台需要增加导出用例成Excel的功能 有两种方式
一种是 Django获取数据先生成本地文件 读取本地文件后再传递给前端
还一种是 Django获取数据 生成文件流 文件流传给前端
第一种资料比较多 但是要每次下载都要在本地生成文件 太过繁琐 这边选择第二种方式
步骤
先处理Django后端
这边使用的是openpyxl
wb Worbook() ws wb.active ..... ws是个worksheet对象 我的目的是将其变成二进制数据 通过BytesIO()来处理 from io import BytesIO output BytesIO() wb.save(output) #这句是将worksheet保存到二进制字节中去 output.seek(0) #output读取所以数据 response FileResponse(output) #定义FileResponse 里面传字节流进去 最后返回的是response文件流 我的文件名想单独字段传递给前端 咋办 通过加response的headers来处理 还有文件名中文乱码咋搞 通过escape_uri_path来处理 tname 你好哟 tname escape_uri_path(tname) fileName tname time.strftime( %y%m%d%H%M%S ) .xlsx response[ name ] fileName response[ Access-Control-Expose-Headers ] name #这个name是上一句的key response[ Content-Type ] applecation/octet-stream #这边不加Content-Disposition也可以 return response
前端需要处理两个 一个是请求参数这么设置 还一个是相应和文件名咋处理
请求参数ajax需要设置responseType: blob
this.$axios({
method: post ,
url: /test/export/ ,
data: this.exportData,
responseType: blob
}).then(function(res){
其实就是通过创建a标签来处理打开href链接来下载 最后在移除a标签就行
let url window.URL.createObjectURL(res.data)//res.data就是接口返回的文件对象
let a document.createElement( a )
a.href url
a.download decodeURI(res.headers.name)//res.headers.nam就可以获取自定义的名称 再解码
document.body.appendChild(a)
a.click()
window.URL.revokeObjectURL(url)
document.body.removeChild(a)


