我正在尝试使用谷歌应用引擎,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)
答案 0 :(得分:1)
这是一个“hello world”(!)GAE处理程序试图做你正在谈论的事情:这是main.py
,app.yaml
路由所有URL;我已将xlwt/*.py
复制到xlwt
和main.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.save
与StringIO
参数一起使用的简单问题(我也尝试了不需要的out.seek(0)
不需要它仍然会产生正确的结果: - )。