django 前端使用ajax发送查询条件,后端查询并生成excel实现下载功能
程序员文章站
2022-03-15 10:18:28
...
最近在做一个功能,需要使用ajax实现条件组合查询,将查询结果内容生成excel下载。
经过查阅和尝试,ajax不能接收处理文件流,无法实现功能,最终解决思路为“ajax传送查询条件到后端-后端查询-后台将结果保存到服务器指定临时目录-将存放路径及文件名返回前端ajax-前端下载”,每次写文件时自动清理临时文件存放目录,释放存储空间。
编程纯属个人爱好,以实现功能为主,请忽略代码质量,部分代码如下:
前端原生ajax传送条件到后台并接收后端返回的文件存放路径并下载:
function submitsearchconditionstoexcel() {
form = document.getElementById('activeddatasearchconditionsform'); /* 获得表单对象,内容为拼接的查询条件 */
fd = new FormData(form); /* 根据表单对象,创建formdata对象,其包含用户提交的数据 */
var xhr = new XMLHttpRequest();
xhr.open('post', '/techapp/doquerysearchtoexcel/');/* 发送给后端 */
xhr.send(fd); /* 通过send函数将数据发给服务器 */
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == 200 || xhr.status == 304) {
var ret = eval("(" + xhr.responseText + ")");
var filelocal=ret.filename;/* 获取文件在服务器存放路径 */
window.location.href = filelocal;/*下载*/
}
}
}
}
自动删除服务器临时目录下的xls文件
def deltempfiles(path):
# 先导入所需的包
import os
# 指定路径
for root, dirs, files in os.walk(path):
for name in files:
if name.endswith(".xls"): # 填写规则
os.remove(os.path.join(root, name))
print("Delete File: " + os.path.join(root, name))
后端查询及生成写入excel:
def doquerysearchdatatoexcel(request): #将查询结果导出到excel
result = well_activedata.objects.filter(wa_isdeleted=0)
if request.POST.get("select_wellorrigname") != '':
if request.POST.get("select_wellorrigname") == 'like':
result = result & well_activedata.objects.filter(
Q(wa_wellname__icontains=request.POST.get("searchform_wellorrigname")) | Q(
wa_rig__icontains=request.POST.get("searchform_wellorrigname")))
else:
result = result & well_activedata.objects.filter(
Q(wa_wellname=request.POST.get("searchform_wellorrigname")) | Q(
wa_rig=request.POST.get("searchform_wellorrigname")))
# 以上为拼接查询条件并逐条筛选,根据自己需要编写
# 设置HTTPResponse的类型
response = HttpResponse(content_type='application/vnd.ms-excel')
response['Content-Disposition'] = 'attachment;filename=searchresult.xls'
# 创建一个文件对象
wb = xlwt.Workbook(encoding='utf8')
# 创建一个sheet对象
sheet = wb.add_sheet('order-sheet')
# 设置文件头的样式,这个不是必须的可以根据自己的需求进行更改
style_heading = xlwt.easyxf("""
font:
name Arial,
colour_index black,
bold on,
height 0xA0;
align:
wrap off,
vert center,
horiz center;
pattern:
pattern solid,
fore-colour 22;
borders:
left THIN,
right THIN,
top THIN,
bottom THIN;
""")
# 写入文件标题(根据自己数据库情况)
sheet.write(0,0,'平台',style_heading)
sheet.write(0,1,'井号',style_heading)
sheet.write(0,2,'区域',style_heading)
sheet.write(1,0,'',style_heading)
sheet.write(1,1,'',style_heading)
sheet.write(1,2,'',style_heading)
# 写入数据
data_row = 2
# UserTable.objects.all()这个是查询条件,可以根据自己的实际需求做调整.
# for i in well_activedata.objects.all():
for i in result:
# print('****')
# print(data_row)
# 格式化datetime
# pri_time = i.pri_date.strftime('%Y-%m-%d')
# oper_time = i.operating_time.strftime('%Y-%m-%d')
sheet.write(data_row,0,i.wa_rig)
sheet.write(data_row,1,i.wa_wellname)
sheet.write(data_row,2,i.wa_local)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 删除储存路径下的文件
deltempfiles(BASE_DIR + "/media/tempfile/")
path = BASE_DIR + "/media/tempfile/" + 'New-' + timestr + '.xls' # 储存路径
wb.save(path)# 将文件写入储存路径
content = {
'filename':"/media/tempfile/" + 'New-' + timestr + '.xls',
} # 将文件储存路径返回前端
return JsonResponse(content)
前端html:
<button onclick="submitsearchconditionstoexcel()" class="btn btn-success" type="button" >结果导出excel</button>
上一篇: bzoj 4590: [Shoi2015]自动刷题机
下一篇: 二分查找细节扫盲(转载)