码迷,mamicode.com
首页 > 其他好文 > 详细

从零开始搭建django前后端分离项目 系列五(实战之excel流式导出)

时间:2018-09-22 18:30:45      阅读:652      评论:0      收藏:0      [点我收藏+]

标签:form   djang   char   coding   alt   mys   客户端   传递   .sh   

项目中有一处功能需求是:需要在历史数据查询页面进行查询字段的选择,然后由后台数据库动态生成对应的excel表格并下载到本地。

技术分享图片

 

如果文件较小,解决办法是先将要传送的内容全生成在内存中,然后再一次性传入Response对象中;

如果文件较大时,我们可以考虑向HttpResponse传递一个迭代器,流式的向客户端传递数据。

view.py视图

@csrf_exempt
def exportData(request):
    format = request.GET.get(format)
    pk = request.GET.get(pk)
    export_sql=SqlModel.objects.get(pk=pk).export_sql
    if format==csv:
        response = StreamingHttpResponse((row for row in FileHandle.csv_stream_response_generator(export_sql)),content_type="text/csv;charset=utf-8")
        response[Content-Disposition] = attachment; filename="query_result.csv"
        return response

迭代生成器

def csv_stream_response_generator(export_sql):
    db = MySQLdb.connect("10.39.211.198", "root", "password", "busycell", charset=utf8)
    chunk_size = 30000
    offset = 0
    yield codecs.BOM_UTF8
    while True:
        isHeader = False
        print(offset)
        if offset == 0:
            isHeader = True
        sql=export_sql + " limit {1} offset {0}".format(offset, chunk_size)
        df = pd.read_sql(sql, db)
        f = StringIO()
        df.to_csv(f, index=False, header=isHeader, encoding="utf_8_sig")
        yield f.getvalue()
        offset += chunk_size
        if df.shape[0] < chunk_size:
            break

最终实现分块向前端传递数据

 

从零开始搭建django前后端分离项目 系列五(实战之excel流式导出)

标签:form   djang   char   coding   alt   mys   客户端   传递   .sh   

原文地址:https://www.cnblogs.com/dotafeiying/p/9675412.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!