之前在做項目管理系統的時候需要實現將數據導出到excel表的功能,搜索之后發現了python的xlwt模塊可以很好的實現這項功能。
首先是導入xlwt模塊:
import xlwt
from io import BytesIO
將處理好的數據寫入excel並且傳給前端
# 獲取當前時間 nowtime = datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S') # 創建一個workbook,設置編碼格式為utf8 workbook = xlwt.Workbook(encoding='utf-8') # 創建一個 worksheet worksheet = workbook.add_sheet('Worksheet') # 將處理好的數據寫入excel,其中i為行,j為列 for i in range(len(msg_list)): for j in range(len(msg_list[i])): worksheet.write(i, j, msg_list[i][j]) # 創建操作二進制數據的對象 output = BytesIO() # 將excel數據寫入到內存中 workbook.save(output) # 設置文件讀取的偏移量,0表示從頭讀起 output.seek(0) # 設置HTTP的報頭為二進制流 self.set_header("Content-Type", "application/octet-stream") # 設置文件名 self.set_header("Content-Disposition", "attachment; filename=export-%s.xls" % nowtime) return self.write(output.getvalue())
在前端我發現如果是通過a標簽的href來請求對應的API接口,可以直接下載到excel文件,但是如果希望在發送請求時攜帶一些數據,則需要發送ajax請求,代碼如下:
$("#export-from").submit(function(e){ e.preventDefault(); var data = {}; $(this).serializeArray().map(function(x){ data[x.name] = x.value; }); if (data["start_time"] && data["end_time"]){ var url= ("api/export/results?start_time="+data["start_time"]+"&end_time="+data["end_time"]); var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); // 返回blob類型,該類型用來存儲二進制數據 xhr.responseType = "blob"; xhr.onload = function () { // 請求完成,執行回調函數 if (this.status === 200) { // 狀態碼為200 var blob = this.response; var reader = new FileReader(); // 轉換為base64 reader.readAsDataURL(blob); reader.onload = function (e) { // 轉換完成,創建一個a標簽用於下載 var a = document.createElement('a'); a.download = 'results.xls'; a.href = e.target.result; // 修復firefox中無法觸發click $("body").append(a); a.click(); $(a).remove(); } } }; // 發送ajax請求 xhr.send() } });