使用Ajax和Flask下载Excel文件

时间:2014-10-13 13:34:11

标签: javascript python ajax 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()方法,但没有提供详细信息。我希望避免使用{{1}因为form.submit()中有其他元素无法提交。)

enter image description here

3 个答案:

答案 0 :(得分:6)

你真的需要使用ajax吗?我发现ajax是一个用烧瓶下载excel文件的工作......但它对我没用。 我只需在&#39; rb&#39;中打开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"})

答案 1 :(得分:2)

您可以使用Flask的send_from_directory function

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

答案 2 :(得分:0)

我使用了一种不同的方法,而不是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)

工作正常。