代码之家  ›  专栏  ›  技术社区  ›  Adrian Mester

德扬戈Excel XLWT

  •  33
  • Adrian Mester  · 技术社区  · 15 年前

    在Django站点上,我想基于数据库中的一些数据生成一个Excel文件。

    我想用 xlwt 但它只有一个方法可以将数据保存到文件中。如何将文件获取到httpresponse对象?或者你知道更好的图书馆吗?

    我也找到了这个 snippet 但它不能满足我的需要。我只需要一种方法,从xlwt对象获取流到响应对象(而不写入临时文件)。

    6 回复  |  直到 12 年前
        1
  •  54
  •   Javier    15 年前

    包装整齐!我不知道这个

    根据医生的说法, save(filename_or_stream) 方法要么使用要保存的文件名,要么使用像流这样的文件进行写入。

    Django响应对象恰好是类似于流的文件!所以就这样 xls.save(response) . 看姜戈医生 generating PDFs 和ReportLab看到类似的情况。

    编辑: (改编自肖恩米洛的评论):

    def xls_to_response(xls, fname):
        response = HttpResponse(mimetype="application/ms-excel")
        response['Content-Disposition'] = 'attachment; filename=%s' % fname
        xls.save(response)
        return response
    

    然后,从视图函数中,创建 xls 目标并完成

    return xls_to_response(xls,'foo.xls')
    
        2
  •  6
  •   brianray    12 年前

    ***更新:不再维护django excel模板,请尝试marmir http://brianray.github.com/mm/

    当我键入这个时还在开发中,但是 http://code.google.com/p/django-excel-templates/ Django Excel模板项目旨在满足您的要求。

    具体看一下测试。下面是一个简单的例子:

    #
    from django_excel_templates import *
    from django_excel_templates.color_converter import *
    from models import *
    from django.http import HttpResponse
    
    def xls_simple(request):
    
        ## Simple ##
        testobj = Book.objects.all()
    
        formatter = ExcelFormatter()
        simpleStyle = ExcelStyle(vert=2,wrap=1)
        formatter.addBodyStyle(simpleStyle)
        formatter.setWidth('name,category,publish_date,bought_on',3000)
        formatter.setWidth('price',600)
        formatter.setWidth('ebook',1200)
        formatter.setWidth('about',20000)
    
        simple_report = ExcelReport()
        simple_report.addSheet("TestSimple")
        filter = ExcelFilter(order='name,category,publish_date,about,bought_on,price,ebook')
        simple_report.addQuerySet(testobj,REPORT_HORZ,formatter, filter)
    
        response = HttpResponse(simple_report.writeReport(),mimetype='application/ms-excel')
        response['Content-Disposition'] = 'attachment; filename=simple_test.xls'
        return response
    
        3
  •  2
  •   S.Lott    15 年前

    您可以将XLS文件保存到 StringIO 对象,类似于文件。

    可以返回Stringio对象的 getvalue() 在回应中。一定要添加标题,将其标记为可下载的电子表格。

        4
  •  2
  •   max    15 年前

    你可能想查一下 huDjango 这是fith函数 serializers.queryset_to_xls() 请将查询集转换为可下载的Excel工作表。

        5
  •  1
  •   satels    13 年前
        6
  •  0
  •   Javier    15 年前

    如果数据结果不需要公式或精确的表示样式,则可以始终使用csv。任何电子表格程序都可以直接读取它。我甚至看到过一些生成csv的webapps,只是为了确保excel打开它而将其命名为.xsl。