在Google App Engine for Python中使用xlsxwriter
我想知道是否有人知道如何在Google App Engine for Python中使用xlsxwriter。文档仅显示如何打开、写入和保存文件。我已经研究过在其他Excel库中使用StringIO的变通方法,但它们似乎不适用于xlsxwriter。主要原因似乎是,在其他库中,您可以提供StringIO缓冲区,而在xlsxwriter中,您只能为文件名提供字符串 我有一个使用pyexcelerator的基本解决方案,但是xlsxwriter的功能非常丰富,如果可能的话,我想使用它 UPD:xlsxwriter的作者(自0.4.8版本开始工作)修复了该问题。看在Google App Engine for Python中使用xlsxwriter,python,google-app-engine,xlsxwriter,Python,Google App Engine,Xlsxwriter,我想知道是否有人知道如何在Google App Engine for Python中使用xlsxwriter。文档仅显示如何打开、写入和保存文件。我已经研究过在其他Excel库中使用StringIO的变通方法,但它们似乎不适用于xlsxwriter。主要原因似乎是,在其他库中,您可以提供StringIO缓冲区,而在xlsxwriter中,您只能为文件名提供字符串 我有一个使用pyexcelerator的基本解决方案,但是xlsxwriter的功能非常丰富,如果可能的话,我想使用它 UPD:xls
根据我在中的回答,以下是GAE应该采取的措施:
from xlsxwriter.workbook import Workbook
class IndexHandler(webapp2.RequestHandler):
def get(self):
book = Workbook(self.response.out)
sheet = book.add_worksheet('test')
sheet.write(0, 0, 'Hello, world!')
book.close()
# construct response
self.response.headers['Content-Type'] = 'application/ms-excel'
self.response.headers['Content-Transfer-Encoding'] = 'Binary'
self.response.headers['Content-disposition'] = 'attachment; filename="workbook.xls"'
但是,它抛出了一个错误:
NotImplementedError:只有tempfile.temporary文件可供使用
由于xlsxwriter
尝试使用tempfile.tempdir
写入临时目录,请参阅\u store\u工作簿的
方法。而且,GAE不允许在项目中使用tempfile
模块:请参阅,因为您知道,无法访问那里的磁盘
所以,这里有一个“恶性循环”。也许您应该考虑修改\u store\u workbook
方法,使其完全在内存中工作。或者,您可以动态调用mock
tempfile.tempdir
并用自己的内存对象替换它
另一个选择是在xlsxwriter
上创建一个问题,我打赌@jmcnamara在这个问题上有一些好的想法
希望能有所帮助。我最近使用python和xlsxwriter开发了一个关于应用程序引擎的项目。 我面临一个类似的问题,我发现了一个更好的解决方案,它不需要额外的代码,可以在本地系统上运行 我们可以使用-运行时文件系统应用程序内引擎,它存在于请求/任务队列的生命周期中 创建writer对象时,传递
/tmp/file
,如下所示
writer = pd.ExcelWriter('/tmp/my_file.xlsx', engine='xlsxwriter')
#
# perform your operations
#
writer.save()
在随后的代码中,您可以读取同一个文件并执行所需的操作,如在邮件中发送或将其上载到某个位置,如
file_path = '/tmp/'+ filename
with open(file_path, 'rb') as f:
my_file_data = f.read()
f.close()
您是否看到:仅供参考,这在Google App Engine上不起作用,因为它的xlsxwriter尝试将内容保存到临时目录。更新:xlsxwriter的版本>=0.4.8适用于Google App Engine。看,谢谢。当我决定在这里发帖时,我实际上开始进入tempfile.tempdir兔洞。我肯定会向他们的问题追踪器提交一些东西。要解决NotImplementedError,请在Api()创建期间将cache参数设置为None,它将禁用默认的基于文件的缓存。