繁体   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