我正在使用openpyxl创建一个excel文件,我想将其作为文件下载返回(因此不能在本地保存)。
我可以很好地创建excel文件并将其保存到磁盘。但是,我无法下载此文件。
尝试1:
import flask_excel as excel
...
create_excel_sheet(data) # internally save the sheet with name sheet.xlsx
output = excel.make_response()
output.headers["Content-Disposition"] = "attachment; filename=" + \
'sheet.xlsx'
output.headers["Content-type"] = "application/vnd.openxmlformats-\
officedocument.spreadsheetml.sheet"
return output
返回名为sheet.xlsx
的空文本文件尝试2: wb = create_excel_sheet(data)#return openpyxl workbook
output = excel.make_response(wb)
output.headers["Content-Disposition"] = "attachment; filename=" + \
'sheet.xlsx'
output.headers["Content-type"] = "application/vnd.openxmlformats-\
officedocument.spreadsheetml.sheet"
return output
我不想将pyexcel用于数据,因为我需要openpyxl来创建一个花哨的excel表。显然,如果pyexcel和openpyxl沟通,那就没问题了。
有什么想法吗?
干杯,迈克
答案 0 :(得分:1)
当我遇到同样的问题时,我做的是我在服务器上写了一个临时文件,我使用create_excel_sheet(data)
函数返回文件名,然后将文件发回烧瓶send_file()
功能:
send_file( create_excel_sheet_and_return_filename(data) )
您可以使用python模块创建在进程存在时删除的临时文件,如果安全性存在问题则使用授权。
答案 1 :(得分:1)
根据查理克拉克的提示,我终于找到了以下解决方案。
output = make_response(create_sheet(data))
output.headers["Content-Disposition"] = "attachment; filename=" + \
"sheet.xlsx"
output.headers["Content-type"] = \
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
其中
def create_sheet(data):
返回
return save_virtual_workbook(wb)
答案 2 :(得分:0)
所有看起来都是正确的。你真的从你的观点回复了回应吗?我认为这个问题并不清楚,并会解释这个问题。
例如:
@app.route('/download_sheet')
def download():
create_excel_sheet(data)
output = excel.make_response()
output.headers["Content-Disposition"] = "attachment; filename=sheet.xlsx"
output.headers["Content-type"] = "application/vnd.openxmlformats-\
officedocument.spreadsheetml.sheet"
return output # Send the response to the user
...
<a href="{{ url_for('app.download') }}">Click here for Sheet</a>
答案 3 :(得分:0)
由于我一直在努力解决模棱两可的问题,并且重新组合了零散的,有点老式的代码片段,所以我想在这里留下另一个答案。从技术上讲,这是相同的,但是是一个相当完整的代码片段,它是最新的。
from flask import Response
from openpyxl import Workbook
from openpyxl.writer.excel import save_virtual_workbook
...
@app.route("/download")
def download():
wb = Workbook()
...
return Response(
save_virtual_workbook(wb),
headers={
'Content-Disposition': 'attachment; filename=sheet.xlsx',
'Content-type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
}
)