Django后台导出Excel数据并下载

肯定有很多人都有这样的需求,“小x,把这个数据给我整理成表格”,Django作为常用的搭建公司内部数据展示的框架很多时候也需要一个一键导出到excel功能。

 

注册Action


 

在Django自带的后台里,选定后,选项往往只有删除一个功能,Django的Admin模块允许我们自己注册功能到该选项框里。

  1. @admin.register(Debit)
  2. class DebitAdmin(admin.ModelAdmin):
  3.     # other statements
  4.     actions = ["SaveExecl",]

actions就是自定义的动作的名称列表。( 功能代码写好千万别忘了注册)

 

编写Action函数


 

在注册之后,需要自己编写对应的函数,注意函数名要和action这个列表里的某一个字符串一致。

 

修改函数显示名称

  1. def SaveExecl(self, request, queryset):
  2.     pass
  3. SaveExecl.short_description = "以表格形式下载"

(注意以上缩进没错,它两的相对缩进就是如此 !)

这个函数在后台显示为 short_description 的内容,然而如果你不自己写 short_description 它就会显示原本的函数名称 ( 英文对那些英语不好的中国人太不友好

 

编写储存表格部分

注意到上面函数定义的时候有三个参数,第一个和第二个暂且不管,在这里我们只需要知道第三个参数是被选中的数据。根据这一点可以遍历获取每一条数据

  1. for each in queryset:
  2.     pass
  3.     '''
  4.     一个each就是一条数据
  5.     访问每一条数据的内容只需要执行类似于 each.Name 的语句即可
  6.     因为每个人使用的编写模块和需求不一定一样,所以在这里不放代码只解释怎么获取数据
  7.     '''

 

编写下载表格部分

这里采取的是一个流的方法,基本能适用于大部分情况。

直接塞进 HttpResponse 里这种只适用小文件的方法就不放出来了。

 

在以上函数里增加如下代码,filename 需要是一个存在的文件路径,在这里也就是上面储存的表格文件名称。倒数第二行最右边的Result.xls根据想要的下载的时候显示的文件名称来改名。( 我试了,不知道为啥中文不行。)

  1. def file_iterator(filename, chunk_size=512):
  2.     with open(filename,'rb') as f:
  3.         while True:
  4.             c = f.read(chunk_size)
  5.             if c:
  6.                 yield c
  7.             else:
  8.                 break
  9. response = StreamingHttpResponse(file_iterator(filename))
  10. response['Content-Type'] = 'application/octet-stream'
  11. response['Content-Disposition'] = 'attachment; filename="{}" '.format("Result.xls")
  12. return response

啊,这段代码是我写的时候抄别人的,但是网上到处是这同一段代码,不知道来源就不贴原帖了。


最后还是贴一下整体代码

  1. from django.contrib import admin
  2. from .models import Debit
  3. from django.http import StreamingHttpResponse
  4. import xlwt
  5. import os
  6. @admin.register(Debit)
  7. class DebitAdmin(admin.ModelAdmin):
  8.     # other statements
  9.     actions = ["SaveExecl",]
  10.     def SaveExecl(self, request, queryset):
  11.         Begin = xlwt.Workbook()
  12.         # some sentences
  13.         Begin.save("%s"%(filename))
  14.         def file_iterator(filename, chunk_size=512):
  15.             with open(filename,'rb') as f:
  16.                 while True:
  17.                     c = f.read(chunk_size)
  18.                     if c:
  19.                         yield c
  20.                     else:
  21.                         break
  22.         response = StreamingHttpResponse(file_iterator(filename))
  23.         response['Content-Type'] = 'application/octet-stream'
  24.         response['Content-Disposition'] = 'attachment; filename="{}" '.format("Result.xls")
  25.         return response
  26.     SaveExecl.short_description = "以表格形式下载"

 

Django的Admin还有其他的有趣用法,以后用到了再写

 

本文转载于:http://blog.cathaysian.cn/2017/10/djangoexcel.html

 

李金龙

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: