// 此处为代码主要功能,如想知道 download 这三个传参的具体类型,可直接看下一个代码块
export function download(url, data, fileName) {
return new Promise((resolve, reject) => {
// 先来一段经典的element加载界面
const loading = Loading.service({
text: '正在下载数据...',
background: 'rgba(0, 0, 0, 0.7)'
});
instance.request({
url: url,
method: 'post',
data: data,
timeout: 1200000,
responseType: 'blob'
}).then(res => {
// 此处res的类型后端返回的是一个对象,由于我们下方代码只会用到res.data属性,我在这贴一下data的数据方便理解
console.log(res); // res.data -> Blob {size: 5017, type: 'application/octet-stream'}
loading.close();
// 文件下载 上方展示了res.data的数据格式,此时创建一个Blob对象,将res.data的值传入,同时给定type类型
// 此处略微说一下blob对象
// 第一个参数: 为一个数据序列,可以是任意格式的值,例如,任意数量的字符串,Blobs 以及 ArrayBuffers
// 第二个参数: 用于指定将要放入Blob中的数据的类型(MIME)(后端可以通过枚举MimeType.获取对应类型
// Blob对象的基本属性
// size: Blob对象包含的字节数。(只读)
// type: Blob对象包含的数据类型MIME,如果类型未知则返回空字符串。
const blob = new Blob([res.data], {
type: 'application/vnd.ms-excel' // 此时设置的为导出excel,如果改成'application/vnd.ms-word',则为导出word
});
// 此处展示创建完成后blob的数据格式,方便理解
console.log(blob) // Blob {size: 5017, type: 'application/vnd.ms-excel'}
// 创建一个a标签
let link = document.createElement('a');
// URL.createObjectURL() 方法会根据传入的参数创建一个指向该参数对象URL。
// 此处传入了一个参数 blob,得到一个地址,将地址赋值给link.href,也就是a标签的href
link.href = URL.createObjectURL(blob);
link.setAttribute('download', fileName);
// 此时这个link,也就是说这个a标签是这样的 <a href="blob:http://localhost:9527/e24444444-3c69-4444-4444-3463885f7754" download="班级管理详情统计数据.xlsx"></a>
console.log(link)
// 让这个a标签出发点击事件,即可完成导出功能
link.click();
link = null;
Message.success('导出成功!');
}).catch(err => {
loading.close();
reject(err);
});
});
}
// 此处return 的 download 有三个传参,分别对应上面代码的三个参数,如过想知道data的数据类型,看下一代码块
export function exportAllClassDetail(data) {
return download('/api/excel/export/findAllClassesByConditions', data, '班级管理详情统计数据.xlsx');
}
// 此处为data数据类型
exportAllClassDetail({
deptCode: this.listQuery.params.deptCode,
className: this.className,
classType: this.listQuery.params.classType,
startTime: this.listQuery.params.startTime,
majorName: this.majorName,
major: this.listQuery.params.major,
courseType: 1
})