簡體   English   中英

使用 Ajax 和 Flask 下載 Excel 文件

[英]Download Excel file with Ajax and Flask

用戶按下頁面上form包含的按鈕:

<form id="form">
    <input type="button" id="export" value="Export"/>
</form>

單擊該按鈕后,將進行以下 Ajax 調用:

ajaxCall('/export', {}, callback_export, 'get');

在哪里

function ajaxCall(url, params, callback, type) {
    if (validate()) {
        var request;
        request = $.ajax({
            url: url,
            type: type,
            data: params
        });
    }
    request.done(function (response, textStatus, jqXHR){
        callback(response);
    });
}

Flask 應用程序如下所示:

@app.route('/export')
def export():
    xl_file= '/absolute/path/to/excel/file.xlsx'
    return send_file(xl_file, as_attachment=True, mimetype='application/vnd.ms-excel')

文件的文件內容將返回到瀏覽器(見下圖),而不是文件本身作為附件返回。

問題是,接受響應作​​為文件附件的回調需要是什么樣的? 否則,需要進行哪些修改?

(是的,我搜索並閱讀了 SE 上的許多帖子。大多數討論使用form.submit()方法,但沒有提供詳細信息。我希望避免使用form.submit()因為其中還有其他元素無法提交的#form 。)

在此處輸入圖片說明

你真的需要使用ajax嗎? 我發現 ajax 是一種用燒瓶下載 excel 文件的解決方法......但它對我不起作用。 我只是在“rb”模式下打開excel文件並將mimetype更改為在windows中被識別為excel文件。 你的 Flast 只需要調用 getPlotExcel()。

@app.route("/getPlotExcel")
def getPlotExcel():
    excelDownload = open("sample.xlsx",'rb').read()
    return Response(
        excelDownload,
        mimetype="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
        headers={"Content-disposition":
                 "attachment; filename=sample.xlsx"})

你可以使用 Flask 的send_from_directory函數

@app.route('/uploads/<path:filename>', methods=['GET', 'POST'])
def download(filename):
    return send_from_directory(directory='uploads', filename=filename)

我使用了不同的方法,而不是 Ajax,我創建了一個函數,每次選擇更改它時都會用一些參數更新 href,在這種情況下是 country_id。

HTML:

<a type="button" class="btn btn-sm" id="export-excel" href="#">Download</a>

在腳本部分我寫道:

function country_change(country_id)
{
   var param = "/export_excel?";
   param += "country_id=" + country_id;
   $("a[id='export-excel']").attr('href', param);
}

因此,當您單擊按鈕時,href 已經更新。 我的燒瓶部分是:

@app.route('/export_excel')
def export_excel ():
     country_id = request.args.get('country_id')
     obj = class_calc.calc()
     file_excel = obj.generate_excel(country_id)
     return send_file(file_excel, as_attachment=True, cache_timeout=0)

工作正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM