经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Django » 查看文章
django admin后台添加导出excel功能示例代码
来源:jb51  时间:2019/5/15 9:57:12  对本文有异议

Django功能强大不单在于他先进的编程理念,很多现有的功能模块更是可以直接拿来使用,比如这个牛掰的admin模块,可以作为一个很好的信息登记管理系统。

admin模块中的actioin是可以自定义添加的,比如这次要介绍的导出excel功能,就可以在action中触发。

本文将详细介绍如何导出admin中录入的数据为excel,可以直接提交给你的leader观看。

首先我们要安装 xlwt 这个工具模块:

  1. pip install xlwt

import的准备 修改admin.py:

  1. #-*-coding:utf-8 -*-
  2. from django.contrib import admin
  3. from .models import *
  4. from django.http import StreamingHttpResponse
  5. from django.shortcuts import render,HttpResponse,redirect
  6. import xlwt
  7. import os
  8. from io import BytesIO

添加action:

  1. class testAdmin(admin.ModelAdmin):
  2. list_display = ('a_name','b_level','...')
  3. actions = ["export_excel",]
  4. ...
  5. export_excel.short_description = "导出Excel文件"

添加后的效果如图:

接下来编写导出excel的功能函数:

  1. def export_excel(self, request, queryset): #三个参数必不可少,queryset是你要导出的文件名
  2. for i in queryset: #这个for循环是为了在多选的时候只导出第一个文件,避免多个被同时导出
  3. filenames = str(i)
  4. break;
  5. response = HttpResponse(content_type='application/vnd.ms-excel')
  6. for i in Case_Study.objects.all().filter(a_name = filenames):
  7. filename = i.a_name
  8. filename = filename.encode('gb2312') #为了能将导出的excel命名为中文,必须转成gb2312
  9. typess = 'attachment;filename='+filename+'.xls' #这一步命名导出的excel,为登记的case名称
  10. response['Content-Disposition'] = typess
  11. #print typess
  12. # 创建一个文件对象
  13. wb = xlwt.Workbook(encoding='utf8')
  14. # 创建一个sheet对象
  15. sheet = wb.add_sheet('casestudy',cell_overwrite_ok=True) #创建的sheet名称为casestudy,注意如果想要开启覆盖写入,必须将overwrite功能开启

接下来是定义字体和表格样式:

  1. # 接下里是定义表格的样式,如果你想对不同的表格定义不同的样式只能采用下面这种方式,否则将会默认成一种格式,即使定义了不同的变量,也会影响全局变量
  2. style_heading = xlwt.easyxf("""
  3. font: # 字体设置
  4. name Microsoft YaHei, # 定义字体为微软雅黑
  5. colour_index black, # 字体颜色为黑色
  6. bold off, # 不加粗
  7. height 200; #字体大小 此处的200实际对应的字号是10号
  8. align: # 对齐方式设置
  9. wrap off, #自动换行 关闭
  10. vert center, #上下居中
  11. horiz center; #左右居中
  12. pattern: #表格样式设置
  13. pattern solid,
  14. fore-colour white; # 表格颜色 白色
  15. borders: # 表格外框设置
  16. left THIN, #THIN 为实线
  17. right THIN,
  18. top THIN,
  19. bottom THIN;
  20. """)
  21. style_playback = xlwt.easyxf("""
  22. font:
  23. name Microsoft YaHei,
  24. colour_index black,
  25. bold off,
  26. height 200;
  27. align:
  28. wrap 1, # 此处设置为1时表示开启自动换行
  29. vert center,
  30. horiz left;
  31. pattern:
  32. pattern solid,
  33. fore-colour white;
  34. borders:
  35. left THIN,
  36. right THIN,
  37. top THIN,
  38. bottom THIN;
  39. """)
  40. style_time_s = xlwt.easyxf("""
  41. font:
  42. name Microsoft YaHei,
  43. colour_index black,
  44. bold off,
  45. height 200;
  46. align:
  47. wrap off,
  48. vert center,
  49. horiz center;
  50. pattern:
  51. pattern solid,
  52. fore-colour white;
  53. borders:
  54. left THIN,
  55. right THIN,
  56. top THIN,
  57. bottom THIN;
  58. """,num_format_str='YYYY-MM-DD') # 设置时间格式样式为 2019-03-01
  59. style_time = style_heading
  60. style_time.num_format_str = 'YYYY-MM-DD hh:mm' # 设置时间格式样式为 2019-03-01 17:30

接下来是合并单元格,这个是一个比较细的工作:

  1. #合并单元格 顺序是从0开始
  2. sheet.write_merge(0, 0, 1, 3,) # 参数说明为 从第0行到第0行的第1列到第3列合并
  3. sheet.write_merge(2, 3, 1, 5,) # 参数说明为 从第2行到第3行的第1列到第5列合并
  4. #多行执行相同的合并可以写个for循环
  5. for i in range(6,12):
  6. sheet.write_merge(i,i,1,3,) #相当于在6到12行的第1列到第3列分别合并 如果这个逻辑绕不明白可以自己实践一下
  7. 接下来是添加边框,因为合并了单元格不等于自动加边框,导致导出的表格里有未加边框的情况,所以只能先行添加好
  8.  
  9. #添加边框,可以用两个for来实现,具体逻辑可自行根据实际情况修改
  10. for i in range(6,12):
  11. for j in range(1,6):
  12. sheet.write(i,j,'',style_heading)
  13.  

接下来是写入表头

  1. # 写入文件标题
  2. sheet.write(0,0,'标题',style_heading)
  3. sheet.write(0,4,'故障等级',style_heading)
  4. sheet.write(1,0,'开始时间',style_heading)
  5. sheet.write(1,2,'结束时间',style_heading)
  6. sheet.write(1,4,'持续时间',style_heading)
  7. sheet.write(2,0,'影响描述',style_heading)
  8. ...

接下来是定义表格的宽度和高度

  1. sheet.col(0).width = 3333
  2. sheet.col(1).width = 6666
  3. ...
  4. sheet.row(0).height_mismatch = True # 高度可不依赖字体大小定义,定义高度时最好开启此选项
  5. sheet.row(0).height = 40*20
  6. ...
  7. for i in range(7,12): # 也可以通过for循环批量定义高度或宽度
  8. sheet.row(i).height_mismatch = True
  9. sheet.row(i).height = 40*20

接下来是写入数据

  1. #写入数据
  2. for i in Case_Study.objects.all().filter(a_name = filenames): # 查询要写入的数据
  3. sheet.write(0,1,i.a_name,style_playback)
  4. sheet.write(0,5,i.b_level,style_heading)
  5. sheet.write(1,1,i.d_starttime,style_time)
  6. sheet.write(1,3,i.e_endttime,style_time)
  7. ...

最后是写出道IO并返回

  1. # 写出到IO
  2. output = BytesIO()
  3. wb.save(output)
  4. # 重新定位到开始
  5. output.seek(0)
  6. response.write(output.getvalue())
  7. return response
  8. export_excel.short_description = "导出Excel文件"
  9.  
  10. admin.site.register(test,testAdmin)
  11.  

以上就是导出excel的全部代码,由于导出的是xls格式,很多excel新的功能比如瀑布图,雷达图等是没有的,需要各位手动复制表格到 xlsx格式中修改,避免采坑。希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号