后台返回文件流
word
// 导出 Word
let blob = new Blob([res.data], { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=utf-8' });
let objectUrl = URL.createObjectURL(blob);
window.location.href = objectUrl;
excel
// 导出Excel
var blob = new Blob([res.data]); //创建一个blob对象
var a = document.createElement('a'); //创建一个<a></a>标签
a.href = URL.createObjectURL(blob); // response is a blob
a.download = "保单.xlsx"; //文件名称
a.style.display = 'none';
document.body.appendChild(a);
a.click();
a.remove();
bug:下载后的文件,打不开
解决办法:
请求时,加 responseType: blob
传参
- window.location.href —— 动态输出跳转
let arr = []
this.multipleSelection.forEach((item, index) => {
arr.push(item.userId)
})
let b = arr.join(',')
window.location.href=axios.defaults.baseURL+"/sys/exportTownUserAccountingFraudInfo?ids="+b // 接口传参
- axios.defaults.baseURL —— axios默认请求的地址前缀
main.js 中设置
axios.defaults.baseURL = 'http://域名:端口'
前端通过列表数据,直接下载
方法一、vue-json-excel(企业微信中打开项目报错)
1、安装:npm install vue-json-excel -S
2、main.js
import JsonExcel from 'vue-json-excel'
Vue.component('downloadExcel', JsonExcel)
3、组件内
<download-excel
:fields="json_fields" // 定义导出的数据结构
:fetch="exportCreate" // 异步请求数据
name="导出.xls"> // 导出文件名
<i class="el-icon-download"></i>导出 // 导出文字
</download-excel>
- data
json_fields: {
'序号': 'index',
'姓名': {
label: 'name',
callback: (value) => {
return value.face_photo + value.name; // 拼接字段
}
},
'数字': {
label: 'case_number',
callback: (value) => {
return ' ' + value.case_number; // ' ' 防止数字过长,展示不全
}
},
'日期': {
label: 'register_time',
callback: (value) => {
return value.register_time?value.register_time.slice(0, 10):''; // 截取字符串
}
},
'数组': {
label: 'treatment_planning',
callback: (value) => {
return value.treatment_planning && value.treatment_planning.length > 0?value.treatment_planning.join(','):''; // 数组用逗号隔开
}
},
'数组拼接重组': {
label: 'intraoral_photo',
callback: (value) => {
let str = value.intraoral_photo && value.intraoral_photo.length > 0?value.intraoral_photo.join(' '):'';
let str2 = value.side_intraoral_photo && value.side_intraoral_photo.length > 0?value.side_intraoral_photo.join(' '):'';
let str3 = value.maxillofacial_photo && value.maxillofacial_photo.length > 0?value.maxillofacial_photo.join(' '):'';
return str + ' ' + str2 + ' ' + str3 // 多个数组拼接
}
},
'数组': {
label: 'plan',
callback: (value) => {
return value.plan && value.plan.length > 0?value.plan.join(' '):'';
}
}
},
exportList: [] // 导出的数据
- methods
// 导出 每页导出3000条,最多导出50000条数据
async exportCreate () { // 异步请求
let that = this
let total = that.customerSeeList.total // 列表总数
if (total == 0) {
that.$message.warning('暂无数据可导出')
return
}
if (total > 50000) {
that.$message.warning('导出数据过多,导出失败!')
return
}
let pages = (total + 3000 - 1) / 3000 // 共有多少页
that.exportList = [] // 导出的数据
for (var i = 1; i< pages; i++) {
const response = await that.$store.dispatch('treat/exportCustomerSee', { // 每3000条请求一次,列表接口
pm_id: that.search.pm_id, // 其他参数,列表下拉筛选
currentPage: i, // 第几页
pageSize: 3000 // 每页限额3000
})
if (response.status == 0) {
that.exportList = that.exportList.concat(response.data.list) // 列表数据拼接
that.exportList.forEach((item, index) => {
item.index = index + 1 // 加字段,序号
})
}
}
return that.exportList
},
https://www.cnblogs.com/shaozhu520/p/12653855.html
https://zhuanlan.zhihu.com/p/77791428
问题:数字长度太长转为科学计数法
解决办法:数字前拼接
json_fields: {
'数字过长': {
label: 'number',
callback: (value) => {
return ' ' + value.number;
}
}
}
https://www.ngui.cc/51cto/show-69687.html
网友评论