返回带有flask的创建的excel文件

时间:2017-03-22 16:45:03

标签: python excel flask openpyxl pyexcel

我正在使用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沟通,那就没问题了。

有什么想法吗?

干杯,迈克

4 个答案:

答案 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'
        }
    )