python實現導出excel表(前端+后端)


  之前在做項目管理系統的時候需要實現將數據導出到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()
        }
    });

 


免責聲明!

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



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