3

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

我有一个使用 pyexcelerator 的基本解决方案,但 xlsxwriter 功能丰富得多,如果可能的话,我想使用它。

4

2 回答 2

3

UPD:该问题已由 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都会尝试写入临时目录,请参阅方法的来源。而且,GAE 不允许在项目中使用模块:请参阅source,因为如您所知,无法访问那里的磁盘。tempfile.tempdir_store_workbooktempfile

所以,这里出现了“恶性循环”。可能您应该考虑修改_store_workbook方法以使其完全在内存中工作。或者,您可以mock tempfile.tempdir即时调用并将其替换为您自己的内存对象。

xlsxwriter 另一种选择是在问题跟踪器上创建一个问题,我敢打赌@jmcnamara 对此主题有一些好主意。

希望有帮助。

于 2013-06-10T20:34:43.077 回答
3

我最近使用 python 和 xlsxwriter 在 App Engine 上开发了一个项目。我遇到了类似的问题,我找到了一个更好的解决方法,它不需要额外的代码并且可以在本地系统上运行

我们可以使用tmp 环境——App Engine中的运行时文件系统,它存在于请求/任务队列的生命周期中。

在创建写入器对象时/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()
于 2019-07-23T13:45:02.160 回答