[英]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.