前端和后台代码结合,实现导出功能,前端使用vue,后台使用python,后台生成表格的数据流,返回给前端导出
vue业务代码块
download(res){
const a = document.createElement('a');
let blob = new Blob([res], {type: 'application/vnd.ms-excel'})
a.style.display = 'none';
var now = new Date();
var nowStr = now.format("YYYYMMDDhhmmss");
a.download = '导出' + '_'+ nowStr + '.xls';
a.href = URL.createObjectURL(blob);
document.body.appendChild(a)
a.click();
document.body.removeChild(a)
},
exportTaskClick() {
const querystring = require("querystring");
const data = {
id: this.id_list.join(','),
};
http.post("/export_excel/", querystring.stringify(data), {responseType: 'blob'}).then((res) => {
this.download(res)
});
},
main.js
Date.prototype.format = function (fmt) {
var o = {
"M+": this.getMonth() + 1, //月份
"d+": this.getDate(), //日
"h+": this.getHours(), //小时
"m+": this.getMinutes(), //分
"s+": this.getSeconds(), //秒
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
"S": this.getMilliseconds() //毫秒
};
// 获取年份
// ①
if (/(y+)/i.test(fmt)) {
fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
}
for (var k in o) {
// ②
if (new RegExp("(" + k + ")", "i").test(fmt)) {
fmt = fmt.replace(
RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
}
}
return fmt;
},
python 后台代码块
from io import BytesIO
import xlwt
# 导出Excel文件
def export_excel(request):
city = request.POST.get('city')
list_obj = [{'place': '广东', 'sum': '120', 'lng': 1, 'lat': 2}, {'place': '深圳', 'sum': '220', 'lng': 3, 'lat': 4}]
# 设置HTTPResponse的类型
response = HttpResponse(content_type='application/vnd.ms-excel')
response['Content-Disposition'] = 'attachment;filename='+city+'.xls'
"""导出excel表"""
if list_obj:
# 创建工作簿
ws = xlwt.Workbook(encoding='utf-8')
# 添加第一页数据表
w = ws.add_sheet('sheet1') # 新建sheet(sheet的名称为"sheet1")
# 写入表头
w.write(0, 0, '地名')
w.write(0, 1, '次数')
w.write(0, 2, '经度')
w.write(0, 3, '纬度')
# 写入数据
excel_row = 1
for obj in list_obj:
name = obj['place']
sum = obj['sum']
lng = obj['lng']
lat = obj['lat']
# 写入每一行对应的数据
w.write(excel_row, 0, name)
w.write(excel_row, 1, sum)
w.write(excel_row, 2, lng)
w.write(excel_row, 3, lat)
excel_row += 1
# 写出到IO
output = BytesIO()
ws.save(output)
# 重新定位到开始
output.seek(0)
response.write(output.getvalue())
return response