Django導出數據為Excel,調用瀏覽器下載


1. 環境

  Django (2.1.10) + Python3.6 + xlwt (1.3.0) 

  操作系統使用的為:Windows 7 

2. 接口代碼

def now_export(request):
    data_list = CIP.objects.all()   # 獲取數據的查詢集
    if not data_list:
        return HttpResponse(json.dumps({"state": "1", "msg": "查無數據,導出失敗"}), content_type="application/json")

    ws = Workbook(encoding='utf-8')  # 設置Excel為UTF-8的編碼格式
    w = ws.add_sheet(u"正在清洗的CIP報表")  # 設置sheet名稱
    w.write(0, 0, "id")
    w.write(0, 1, u"清洗線路")
    w.write(0, 2, u"操作者")
    w.write(0, 3, u"清洗目標")
    w.write(0, 4, u"清洗類型")
    w.write(0, 5, u"CIP狀態")
    w.write(0, 6, u"開始時間")
    # 把需要導出的數據寫到文件中
    excel_row = 1
    for obj in data_list:
        w.write(excel_row, 0, excel_row)
        w.write(excel_row, 1, obj.CIPNo)
        w.write(excel_row, 2, obj.oper)
        w.write(excel_row, 3, obj.ccid)
        w.write(excel_row, 4, obj.mode)
        w.write(excel_row, 5, "CIP程序啟動")
        w.write(excel_row, 6, datetime.strftime(obj.start_time, '%Y-%m-%d %H:%M:%S'))
        excel_row += 1
    sio = BytesIO()  # 寫出到IO
    ws.save(sio) 
    sio.seek(0)  # 重新定位到開始
    response = HttpResponse(sio.getvalue(), content_type='application/vnd.ms-excel')     # 設置文件格式為Excel
   #  attachment(意味着消息體應該被下載到本地;大多數瀏覽器會呈現一個“保存為”的對話框,將filename的值預填為下載后的文件名)
   response['Content-Disposition'] = 'attachment; filename=test.xls'
   response.write(sio.getvalue())
   return response

提示:若出現 TypeError: string argument expected, got 'bytes'  錯誤。問題出現在使用StringIO的write方法上,用BytesIO替代StringIO即可解決問題,筆者這里已經替換過了

3. 前端請求

注意:但需要注意的是,如果想要用這種方式下載文件,不能使用AJAX的方式,而是應該新建一個<a>標簽,模擬點擊下載。原因為處於安全性考慮,JavaScript無法與磁盤進行交互,因此AJAX得到的內容將被保留在內存中,而不是磁盤上。

3.1 請求方式為GET時:

  此時直接在A標簽的href屬性中指定路由即可

<a class="btn btn-success radius r" style="line-height:1.6em;margin-top:3px" title="導出報表" href="/CIP/now_export/">導出報表</a>
3.2 請求方式為POST時:

  這種請求 需寫一個form表單,把請求所需數據寫在表單中,在A標簽中指定表單的提交方法即可。(對於a標簽實現post請求感興趣的可以自行百度其他方法)

<a class="btn btn-success radius r" style="line-height:1.6em;margin-top:3px" title="導出報表" onclick="document.getElementById('form').submit();">
導出報表</a> <form action="/CIP/draft_export/" method="post" id="form" enctype="multipart/form-data"> <div class="row cl"> <div class="formControls col-xs-8 col-sm-9"> <label class="form-label col-xs-4 col-sm-2">開始日期:</label> <input type="text" style="width: 200px" onfocus="WdatePicker({ dateFmt:'yyyy-MM-dd',maxDate:'#F{$dp.$D(\'startdate\')||\'%y-%M-%d\'}'})"
id="startdate" class="input-text Wdate" name="startdate"> </div> <div class="formControls col-xs-8 col-sm-9" style="width: 400px"> <label class="form-label col-xs-4 col-sm-2">結束日期:</label> <input type="text" style="width: 200px" onfocus="WdatePicker({ dateFmt:'yyyy-MM-dd HH:mm:ss',minDate:'#F{$dp.$D(\'enddate\')}' })"
id="enddate" class="input-text Wdate" name="enddate"> </div> </div> <br> <div class="row cl"> <div class="formControls col-xs-8 col-sm-9"> <label class="form-label col-xs-4 col-sm-2">線路:</label> <span class="select-box"> <select class="select" id="line" name="line"> <option>all</option> </select> </span> </div> <div class="formControls col-xs-8 col-sm-9"> <label class="form-label col-xs-4 col-sm-2">目標:</label> <span class="select-box"> <select class="select" id="goal" name="goal"> <option>all</option> </select> </span> </div> <a name="" id="" class="btn btn-success" onclick="search_date(1)"><i class="Hui-iconfont" ></i> 搜索</a> </div> </form>

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM