GAE / webapp2:使用xlwt提供由脚本创建的Excel文件

时间:2015-02-14 21:06:24

标签: python google-app-engine webapp2 xlwt

我正在尝试使用谷歌应用引擎,webapp2和基于xlwt的脚本调用其save方法来创建特定的Excel文件 in situ 并让用户下载。

现在我根据不同的网站尝试了几种不同的方法,但到目前为止都没有取得任何成功。我将概述我的尝试,如果你们中的任何人知道如何让它发挥作用,我将非常感激。

提前多多感谢。如果您需要更多信息,请告诉我,我会立即更新,我看到了。

注意
xls_create(arg, filename_or_stream)是调用xlwt.save()并创建要下载的excel文件的函数。


尝试1:“使用StreamIO”
到目前为止,这是我最好的尝试。它给了我一个excel文件,但由于某种原因它没有完全“完成内容”。看起来它只写了应该写的四分之一。在检查我的脚本stand_alone时,它一切正常,所以我100%确信这不是我的脚本的问题,但使用下面的代码。

附录
事实证明,这里的主要错误是在a_list = self.request.get('a_list')行,我没有放allow_multiple=True。因为这只是列表的第一个值,我正在经过,正在使用。

我推荐AlexMartelli关于如何使用xlwt,webapp2和GAE来做类似于我的最小例子。

class XLSCreator(webapp2.RequestHandler):

    def post(self):
        self.response.headers['Content-Type'] = 'application/vnd.ms-excel'
        a_list = self.request.get('a_list')

        # create a stringIO object
        output = StringIO.StringIO()

        # Create file in memory
        xls_create(a_list, output)

        # Set back to start
        output.seek(0)
        self.response.out.write(output.getvalue())

        # When uncommented, process does not finish
        #output.close()

尝试2:
接下来的两个是绝望的尝试;)我从代码中拾取并且只是坚持并且尝试了。可悲的是,没有运气。

类XLSCreator(webapp2.RequestHandler):

def post(self):

    fname = 'excelfile.xls'
    self.response.headers['Content-Type'] = 'application/vnd.ms-excel'
    self.response.headers['Content-Disposition'] = 'attachment; filename="%s"' % fname
    a_list = self.request.get('a_list')
    self.response.out.write(xls_create(a_list, fname))

尝试3:

类XLSCreator(webapp2.RequestHandler):

def post(self):

    fname = 'excelfile.xls'
    self.response.headers['Content-Type'] = 'application/vnd.ms-excel'
    self.response.headers['Content-Disposition'] = 'attachment; filename="%s"' % fname
    a_list = self.request.get('a_list')

    xls_create(a_list, self.response.out)

1 个答案:

答案 0 :(得分:1)

这是一个“hello world”(!)GAE处理程序试图做你正在谈论的事情:这是main.pyapp.yaml路由所有URL;我已将xlwt/*.py复制到xlwtmain.py所在目录的子目录app.yaml中。

import webapp2
import StringIO
import xlwt

def makeit():
    workbook = xlwt.Workbook() 
    sheet = workbook.add_sheet("Hello World") 
    sheet.write(0, 0, 'Hello world!')
    out = StringIO.StringIO()
    workbook.save(out)
    return out

class MainHandler(webapp2.RequestHandler):
    def get(self):
        self.response.headers['Content-Type'] = 'application/vnd.ms-excel'
        out = makeit()
        self.response.write(out.getvalue())

app = webapp2.WSGIApplication([
    ('/', MainHandler)
], debug=True)

使用我的Chrome浏览器访问此GAE应用中的/会下载download.xls个文件(5632个字节),Mac的Preview应用很乐意将其显示为单个单元格的电子表格是

现在,请尝试最低限度地修改它,直到它再现您观察到的错误(结果xls可能序列化为超过32MB,这被记录为App Engine响应的最大大小?) - 这应该有助于诊断问题的根本原因,现在我们知道,这不是将xlwt.saveStringIO参数一起使用的简单问题(我也尝试了不需要的out.seek(0)不需要它仍然会产生正确的结果: - )。