Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用Flask动态下载excel_Python_Pandas_Flask_Excel 2010_Python 3.5 - Fatal编程技术网

Python 如何使用Flask动态下载excel

Python 如何使用Flask动态下载excel,python,pandas,flask,excel-2010,python-3.5,Python,Pandas,Flask,Excel 2010,Python 3.5,我正在使用Python 3。下面是为文件下载设置响应的部分- import io import pandas as pd @app.route('/download_log',methods=['GET']) def download_log(): output = io.BytesIO() writer = pd.ExcelWriter(output, engine='xlsxwriter') # s is a Pandas Dataframe that I want to

我正在使用Python 3。下面是为文件下载设置响应的部分-

import io
import pandas as pd
@app.route('/download_log',methods=['GET'])
def download_log():
   output = io.BytesIO() 
   writer = pd.ExcelWriter(output, engine='xlsxwriter')
   # s is a Pandas Dataframe that I want to have downloaded as an excel
   s.to_excel(writer, sheet_name='Sheet1')
   writer.save()
   output.seek(0)
   excelDownload=output.read()
   return send_file(excelDownload,attachment_filename='log.xlsx',as_attachment=True)
我的主要目标是,我需要将数据帧(在本例中为“s”)的内容作为xlsx下载提供给客户端,并且我不想将此文件保存在服务器上(我已经尝试过了,它可以工作);我希望能够在飞行中做到这一点。为此,我只允许使用io.BytesIO作为ExcelWriter的输入。DataFrame中的值是实际的字符串,但当我打印excelDownload时,我会得到表单的值(这只是第一行)

我不确定这是否是我的问题的根源,但在客户端下载的xlsx无法打开;我收到错误“无法打开文件,因为文件格式或文件扩展名可能无效”。我是否需要在将字节流作为响应发送之前对其进行解码;如果是,我应该使用哪种编解码器?utf-8、拉丁语-1等似乎不起作用。 还有,我得到了一个错误- “调试中间件在已发送响应头的点上捕获流式响应中的异常” 在我的控制台里。我想这是因为我发送的文件格式(excelDownload) 如何在下载的excel中正确复制数据框的所有详细信息?
我已经花了十几个小时在这个问题上,如果有任何提示

对我来说就像是zipfile的开始,我将不胜感激。我敢肯定,您可以将其作为
发送文件(输出)
发送。您是否已验证您实际上正在生成excel文件,即您获取生成文件的代码并将其写入磁盘,然后在excel中打开该文件?最后,您没有一个完整的here,您可以通过在pandas dataframe.xlsx文件中添加几行虚拟行轻松地将其转换为zipfiles,因此
send_文件(输出,attachment_filename='log.xlsx',as_attachment=True)
应该可以正常工作。您仍然需要
输出。seek(0)
@waynewer您是对的!我对操纵全局变量有一个误解。s.to_excel()中的“s”是在download_log()方法之外设置的。我不知道要给一个全局变量赋值,我必须通过写行“global s”来显式引用作用域。我不记得必须在普通python中执行类似的操作。我想这是烧瓶的特点。也许你可以把你的建议打印出来作为答案,我可以接受。毕竟,如果不是你的建议,我不会想到打印“s”(这有点尴尬,顺便说一句!!),除非你分配给
s
,否则你不应该显式地声明
global s
。也就是说,单字母变量名很糟糕,您可能也不应该使用globals。老实说,如果我是你的话,我会删除这个问题——这个问题是一个打字错误,所以它不太可能在将来帮助任何人,除非他们做出同样的打字错误。在我看来,这就像是zipfile的开始。我敢肯定,您可以将其作为
发送文件(输出)
发送。您是否已验证您实际上正在生成excel文件,即您获取生成文件的代码并将其写入磁盘,然后在excel中打开该文件?最后,您没有一个完整的here,您可以通过在pandas dataframe.xlsx文件中添加几行虚拟行轻松地将其转换为zipfiles,因此
send_文件(输出,attachment_filename='log.xlsx',as_attachment=True)
应该可以正常工作。您仍然需要
输出。seek(0)
@waynewer您是对的!我对操纵全局变量有一个误解。s.to_excel()中的“s”是在download_log()方法之外设置的。我不知道要给一个全局变量赋值,我必须通过写行“global s”来显式引用作用域。我不记得必须在普通python中执行类似的操作。我想这是烧瓶的特点。也许你可以把你的建议打印出来作为答案,我可以接受。毕竟,如果不是你的建议,我不会想到打印“s”(这有点尴尬,顺便说一句!!),除非你分配给
s
,否则你不应该显式地声明
global s
。也就是说,单字母变量名很糟糕,您可能也不应该使用globals。老实说,如果我是你的话,我会删除这个问题——问题是打字错误,所以这不太可能在将来帮助任何人,除非他们也有同样的打字错误。
 b'PK\x03\x04\x14\x00\x00\x00\x08\x00\xf5c9J,)\xbdS\x13\x01\x00\x00\xc6\x01\x00\x