如何强制python输出保存为excel文件?

如何强制python输出保存为excel文件?,python,excel,downloadfile,Python,Excel,Downloadfile,我有一个在服务器上运行的python脚本。因此,它使用openpyxl库创建了一个excel工作簿,我在服务器磁盘上的tempfile中借助tempfile库将其写入磁盘。 但是现在,我想让客户端的浏览器也下载工作簿。我该怎么办 这是我的代码: @app.route('/', methods=['GET', 'POST']) def upload_file(): if request.method == 'POST': file = request.files['file

我有一个在服务器上运行的python脚本。因此,它使用openpyxl库创建了一个excel工作簿,我在服务器磁盘上的tempfile中借助tempfile库将其写入磁盘。 但是现在,我想让客户端的浏览器也下载工作簿。我该怎么办

这是我的代码:

@app.route('/', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        file = request.files['file']
        if file:# and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            output = gen_file(file)
            #gen_file makes a new excel workbook from the uploaded file
            return output
    return '''
    <!doctype html>
    <title>Upload new File</title>
    <h1>Upload new File</h1>
    <form action="" method=post enctype=multipart/form-data>
      <p><input type=file name=file>
         <input type=submit value=Upload>
    </form>
    '''

如果您正在使用flask,您可以选择直接从flask应用程序提供文件,或者使用负载平衡器(如
nginx
)将文件放入
nginx
的公共目录中

对于第一个选项,您可以使用如下内容:

来自flask导入响应的

@app.route('/',方法=['GET','POST'])
def upload_文件():
如果request.method==“POST”:
file=request.files['file']
如果文件:#和允许的文件(file.filename):
filename=secure\u文件名(file.filename)
输出=生成文件(文件)
#gen_文件根据上载的文件创建新的excel工作簿
文件内容=打开(输出'r')。读取()
返回响应(
文件内容,
mimetype=“text”,
标题={“内容处置”:
f“附件;文件名=anything.csv”})

可以是任何东西。您可以使用python的内置函数(如
open

)来读取文件内容,这还不清楚您需要什么和拥有什么。要从服务器下载文件,有很多不同的方法。您运行的是像nginx或apache这样的web服务器吗?你的客户是什么?如果你想通过一个网页来提供文件,你需要一个web服务器来实现这一点。这是一个简单的程序。目前它在我自己的计算机上的端口5000上使用flask。客户端是firefox。它将在服务器上运行,客户端将是不同的浏览器。根据上面添加的代码部分,我如何更改您的代码以使浏览器下载我的tempfile?感谢您的回复。我还不能检查它,我将在两天内再次访问代码后立即尝试。但这里已经有一个问题了:当我在“attachment;”之前加上“f”时,它给了我语法错误。它做什么?这是python 3中引入的
f-string
。如果您使用的是Python2,请删除它。非常感谢。我必须更改gen_file函数的返回值,以便它返回文件名。现在一切都正常运转。我更新了gen_file函数的最后一部分,以便其他人可以使用该代码。
    with NamedTemporaryFile(suffix=".xlsx",dir=".",delete=False) as tmp:
        output_workbook.save(tmp)
        return tmp.name