当前位置 博文首页 > Python GAE、Django导出Excel的方法

    Python GAE、Django导出Excel的方法

    作者:admin 时间:2021-02-06 12:00

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

    def savestream(self):
    import CompoundDoc
    doc = CompoundDoc.XlsDoc()
    return doc.savestream(self.get_biff_data())

    CompoundDoc.XlsDoc的savestream方法:
    复制代码 代码如下:

    def savestream(self, stream):
    # 1. Align stream on 0x1000 boundary (and therefore on sector boundary)
    padding = '\x00' * (0x1000 - (len(stream) % 0x1000))
    self.book_stream_len = len(stream) + len(padding)
    self.__build_directory()
    self.__build_sat()
    self.__build_header()
    s = ""
    s = s + str(self.header)
    s = s + str(self.packed_MSAT_1st)
    s = s + str(stream)
    s = s + str(padding)
    s = s + str(self.packed_MSAT_2nd)
    s = s + str(self.packed_SAT)
    s = s + str(self.dir_stream)
    return s

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

    class Main(webapp.RequestHandler):
    def get(self):
    self.sess = session.Session()
    t_values['user_id'] = self.sess['userid']
    if self.request.get('export') == 'excel':
    wb = Workbook()
    ws = wb.add_sheet(u'统计报表')
    #表头
    font0 = Font()
    font0.bold = True
    font0.height = 12*20;
    styletitle = XFStyle()
    styletitle.font = font0
    ws.write(0, 0, u"日期:"+begintime.strftime('%Y-%m-%d') + " - " + endtime.strftime('%Y-%m-%d'), styletitle)
    #返回Excel文件
    self.response.headers['Content-Type'] = "application/vnd.ms-execl"
    self.response.headers['Content-Disposition'] = str("attachment; filename=%s.xls"%t_values['user_id'])
    self.response.headers['Pragma'] = "no-cache"
    self.response.headers['Expires'] = "0"
    self.response.out.write(wb.savestream())
    return

    效果可以参见我爱记账网的excel报表。 js