如何通过Flask下载根目录中用xlsxwriter生成的XLSX文件
如何用Flask触发xlsxwriter生成的XLSX文件下载
嘿,我来帮你搞定Flask下载xlsx文件的问题!你已经用xlsxwriter生成了文件,现在只需要在Flask里添加对应的视图函数来触发下载就行,这里有两种常用方案:
方案1:先保存本地文件再下载
如果你需要保留生成的文件在服务器上,这种方法很直接:
首先导入必要的模块,然后在视图函数里先完成文件生成,再用Flask的send_from_directory返回文件:
from flask import Flask, send_from_directory import xlsxwriter import os app = Flask(__name__) @app.route('/download-excel') def download_excel(): # 定义文件名 file_name = 'images.xlsx' # 生成XLSX文件(就是你原来的代码) workbook = xlsxwriter.Workbook(file_name) worksheet = workbook.add_worksheet() # 写入你的数据,比如: worksheet.write('A1', '示例数据1') worksheet.write('B1', '示例数据2') workbook.close() # 从项目根目录发送文件,as_attachment=True让浏览器触发下载 return send_from_directory(os.getcwd(), file_name, as_attachment=True)
注意:os.getcwd()会获取当前项目的根目录,如果你把文件存在其他路径,替换成对应的路径就行。
方案2:内存中生成文件(推荐,无需保存到本地)
如果不需要在服务器上保留文件,这种方法更高效,还能避免文件覆盖、清理旧文件的麻烦:
我们用BytesIO把文件存在内存里,直接返回给浏览器:
from flask import Flask, send_file import xlsxwriter from io import BytesIO app = Flask(__name__) @app.route('/download-excel') def download_excel(): # 创建一个内存文件对象 output = BytesIO() # 把workbook写入到内存对象中 workbook = xlsxwriter.Workbook(output) worksheet = workbook.add_worksheet() # 写入你的数据 worksheet.write('A1', '示例数据1') worksheet.write('B1', '示例数据2') # 一定要先关闭workbook,确保所有数据都写入内存 workbook.close() # 重置内存文件的指针到开头,不然send_file会读不到内容 output.seek(0) # 发送文件,设置下载文件名和正确的MIME类型 return send_file( output, download_name='images.xlsx', as_attachment=True, mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' )
关键提示:
- 内存方案里必须调用
output.seek(0),因为写入后指针在文件末尾,重置后才能从开头读取。 - MIME类型
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet是XLSX文件的标准类型,手动设置能避免浏览器识别错误。
启动Flask后,访问/download-excel就能触发文件下载啦!
内容的提问来源于stack exchange,提问作者AaronDT
相关产品推荐
相关产品推荐

