轉:https://www.cnblogs.com/supery007/p/9360188.htmljavascript
1. 功能敘述html
前端web頁面經過訪問url+id的形式訪問url lottery/draw/(?P<pk>(\d+))/download/ 後端代碼經過orm查詢pk相關數據 過濾出本身想要的字段
2. 前端頁面前端
<a onclick="downloadFilebyAjax(this,'{{ period.id }}')" href="javascript:;" title="下載"> <i class="layui-icon"></i>#下載圖標 </a>
/*下載統計*/ function downloadFilebyAjax(obj, id) { layer.confirm('確認要下載嗎?', function (index) { $.ajaxSetup({ data: {csrfmiddlewaretoken: '{{ csrf_token }}'} }); $.ajax({ type: "post", url: id + '/download/', dataType: "json", success: function (data) { if (data.status) { console.log(data.filePath, "文件下載中... ..."); window.location.href = data.filePath; layer.msg(data.msg, {icon: 6, time: 1000}); } else { layer.msg(data.msg, {icon: 5, time: 1000}); } }, error: function (data) { console.log("對不起,網絡錯誤,請稍後重試或聯繫管理員"); } }); }); }
3. 後端功能java
def download_draw(request,pk): if request.method =="POST": data = {'status':True,'msg': '下載成功','filePath':''} searia_list= huodong_models.SearialNum.objects.filter(period_id=pk) xls_name = searia_list[0].period.title+'.xls' xls_path =os.path.join(settings.BASE_DIR, 'static','download',xls_name) if os.path.exists(xls_path): os.remove(xls_path) book = xlwt.Workbook(encoding='utf-8') sheet = book.add_sheet(searia_list[0].period.title, cell_overwrite_ok=True) # 第0行寫入標題 sheet.write(0,0,'期號') sheet.write(0,1,'抽獎碼') sheet.write(0,2,'會員帳號') sheet.write(0,3,'得到獎品') sheet.write(0,4,'使用狀態') # 初始行,寫入數據從第一行開始寫入 line = 1 manipulation(searia_list,line,sheet) book.save(xls_path) if os.path.exists(xls_path): filePath = '/static/download/%s' % xls_name data['filePath']=filePath else: data['status']=False data['msg']='下載失敗' return JsonResponse(data) return HttpResponse('無效請求')
def manipulation(searia_list,line,sheet): for searia in searia_list: vip_acount = '' prize = '' style = 0 if searia.status == 1: vip_acount = searia.userinfo.vip_acount prize = searia.userinfo.prize style = 2 sheet.write(line, 0, searia.period.period) sheet.write(line, 1, searia.searial) sheet.write(line, 2, vip_acount) sheet.write(line, 3, prize) sheet.write(line, 4, searia.get_status_display()) line += 1
4. 說明代碼思路web
先初始化execl文件第0行標題名稱 以後經過數據庫取出的數據生成一個數據列表 初試行位第一行一次循環寫入每條字段過濾的數據 初試行數以此累加 最後保存execl文件 而後將服務器的保存的地址返回給前端 經過window.location.href來進行訪問實現下載