[Python]GAE、Django导出Excel的方法

在Python中操作Excel的方法可以通过COM,最常用的跨平台的方法是使用pyExcelerator,pyExcelerator的使用方法可以参考limodou的《使用pyExcelerator来读写Excel文件》。但GAE、Django并没有直接将pyExcelerator导出为Excel的方法。我的思路是先用把数据导入到Workbook和Worksheet中,如果存为文件可以直接调用Workbook的save方法,但GAE不支持本地文件操作,即使图片也只能存放在DataStore中,但我们可以类似于返回图片的方法,直接将Excel的二进制流返回给浏览器。这就需要修改一下Workbook的代码,加入返回二进制流的方法,我给他取的名字是savestream,在savestream中再次调用CompoundDoc.XlsDoc的savestream方法,也是自己增加的。代码如下:

Workbook的savestream:

  1. def savestream(self):
  2.         import CompoundDoc
  3.         doc = CompoundDoc.XlsDoc()
  4.         return doc.savestream(self.get_biff_data())

CompoundDoc.XlsDoc的savestream方法:

  1. def savestream(self, stream):
  2.         # 1. Align stream on 0x1000 boundary (and therefore on sector boundary)
  3.         padding = '/x00' * (0x1000 - (len(stream) % 0x1000))
  4.         self.book_stream_len = len(stream) + len(padding)
  5.         self.__build_directory()
  6.         self.__build_sat()
  7.         self.__build_header()
  8.         s = ""
  9.         s = s + str(self.header)
  10.         s = s + str(self.packed_MSAT_1st)
  11.         s = s + str(stream)
  12.         s = s + str(padding)
  13.         s = s + str(self.packed_MSAT_2nd)
  14.         s = s + str(self.packed_SAT)
  15.         s = s + str(self.dir_stream)
  16.         return s

这样就可以返回Excel文件的二进制流了,下面就是如何在用户请求的时候将Excel文件返回,我借鉴了PHP的实现方法,代码如下:

  
  
  1. class Main(webapp.RequestHandler):
  2.     def get(self):
  3.         self.sess = session.Session()
  4.         t_values['user_id'] = self.sess['userid']
  5.         if self.request.get('export') == 'excel':
  6.             wb = Workbook()
  7.             ws = wb.add_sheet(u'统计报表')
  8.             #表头
  9.             font0 = Font()
  10.             font0.bold = True
  11.             font0.height = 12*20;
  12.             styletitle = XFStyle()
  13.             styletitle.font = font0
  14.     
  15.             ws.write(00, u"日期:"+begintime.strftime('%Y-%m-%d') + " - " + endtime.strftime('%Y-%m-%d'), styletitle)
  16.             
  17.             #返回Excel文件
  18.             self.response.headers['Content-Type'] = "application/vnd.ms-execl"
  19.             self.response.headers['Content-Disposition'] = str("attachment; filename=%s.xls"%t_values['user_id'])
  20.             self.response.headers['Pragma'] = "no-cache"
  21.             self.response.headers['Expires'] = "0"
  22.             self.response.out.write(wb.savestream())
  23.             return
效果可以参见我爱记账网的excel报表。
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值