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