在Google App Engine上使用xlsxwriter进行Python开发

3

我想知道是否有人知道如何在Google App Engine for Python中使用xlsxwriter。文档只显示如何打开、写入和保存文件。我已经查看了使用StringIO处理其他Excel库的解决方法,但它们似乎不能转移到xlsxwriter上。主要原因似乎是在其他库中,您可以提供StringIO缓冲区,而在xlsxwriter中,您只能为文件的名称提供字符串。

我已经使用pyexcelerator实现了一个基本的解决方案,但是xlsxwriter具有更丰富的功能,如果可能的话,我想使用它。


2
你看过这个吗: https://dev59.com/BmQo5IYBdhLWcg3wBLco - voscausa
只是提醒一下,这在Google App-Engine上不起作用,因为xlsxwriter试图将东西保存到临时目录。 - Steve G
更新:XlsxWriter版本 >= 0.4.8 可以在Google App Engine上运行。请参阅此示例。 - jmcnamara
2个回答

3

更新:xlsxwriter作者已经修复了问题(从0.4.8版本开始可用)。请查看示例


这个帖子中,我已经回答了相关问题。以下是在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.TemporaryFile

因为xlsxwriter尝试使用tempfile.tempdir写入临时目录,无论如何都会报错,参见_store_workbook方法的source。而且,GAE不允许在项目中使用tempfile模块,参见source,因为你知道,在那里没有访问磁盘的权限。

所以,这里形成了一个“恶性循环”。也许你应该考虑修改_store_workbook方法,使其完全在内存中工作。或者,你可以在运行时mocktempfile.tempdir调用,并将其替换为你自己的内存对象。

另一种选择是在xlsxwriter 问题跟踪器上创建一个问题,我敢打赌@jmcnamara在这个主题上有一些好主意。希望能对你有所帮助。

谢谢。我实际上已经开始深入研究tempfile.tempdir,当我决定在这里发布时。我一定会向他们的问题跟踪器提交一些内容。 - Steve G
为解决NotImplementedError,在Api()创建期间将cache参数设置为None即可,它会禁用默认的基于文件的缓存。 - 0xc0de

2
我最近在使用Python和xlsxwriter开发了一个App Engine项目。 我遇到了类似的问题,但我找到了更好的解决方法,不需要额外的代码,并且可以像在本地系统上运行一样工作
我们可以使用tmp环境 - App Engine中的运行时文件系统,该文件系统存在于请求/任务队列的生命周期中。
在创建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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接