记录重写过程中遇到的问题和最后解决的方法。
需求
重写django中admin自带的管理后台,筛选仿真任务列表,添加一个按钮,可以将筛选出的仿真任务列表以Excel的形式导出。
用到的第三方库
# 1.导出Excel的库
import xlwt
# 2.在内存中读写bytes的库
from io import BytesIO
xlwt库安装方式
- 用pip安装
pip install xlwt
- 源码安装(不联网的机器上)
在 https://pypi.org/project/xlwt/ 中下载 xlwt-1.3.0.tar.gz(我下载时的最新版本)。
上传压缩包到机器,解压,进入目录,执行命令安装
python setup.py install
记录筛选条件
用session记录用户点击的筛选条件,重写changelist_view方法:
def changelist_view(self, request, extra_context=None):
request.session['excel_params'] = json.dumps(request.GET.dict())
写导出Excel方法
取参数
# 导出Excel
def export_excel(self, request):
# 取参数
try:
excel_params = json.loads(request.session.get('excel_params'))
except:
excel_params = {}
按筛选条件查询作业列表后,创建文件对象,准备写入Excel。
文件操作
# 设置HTTPResponse的类型
response = HttpResponse(content_type='application/vnd.ms-excel')
current_time = datetime.datetime.today().strftime("%Y-%m-%d")
response['Content-Disposition'] = 'attachment;filename=jobs_list.xls' #导出文件名
# 创建一个文件对象
wb = xlwt.Workbook(encoding='utf8')
# 创建一个sheet对象
sheet = wb.add_sheet('order-sheet')
# 设置文件头的样式,可以根据自己的需求进行更改
style_heading = xlwt.easyxf("""
font:
name Arial,
colour_index white,
bold on,
height 0xA0;
align:
wrap off,
vert center,
horiz center;
pattern:
pattern solid,
fore-colour 0x19;
borders:
left THIN,
right THIN,
top THIN,
bottom THIN;
""")
# 写入文件标题(行,列,内容,样式)
sheet.write(0, 0, '任务名', style_heading)
sheet.write(0, 1, '节点列表', style_heading)
sheet.write(0, 2, 'CPU核数', style_heading)
sheet.write(0, 3, '开始时间', style_heading)
sheet.write(0, 4, '结束时间', style_heading)
sheet.write(0, 5, '运行时间', style_heading)
sheet.write(0, 6, '状态', style_heading)
sheet.write(0, 7, '核小时数', style_heading)
# 逐行写Excel.表头是第0行,内容从第1行写起
data_row = 1
for job in slurm_jobstatus_list:
# 格式化datetime
sheet.write(data_row, 0, job['JobName'])
sheet.write(data_row, 1, job['NodeList'])
sheet.write(data_row, 2, job['ReqCPUS'])
sheet.write(data_row, 3, job['Start'].replace('T',' '))
sheet.write(data_row, 4, job['End'].replace('T',' '))
sheet.write(data_row, 5, job['Elapsed'])
sheet.write(data_row, 6, job['State'])
sheet.write(data_row, 7, job['job_cpu_time'])
data_row = data_row + 1
# 写出到IO
output = BytesIO()
wb.save(output)
# 重新定位到开始
output.seek(0)
response.write(output.getvalue())
return response
设置接口url
完成接口后,设置接口url方法:
def get_urls(self):
urls = super(CaeJoblistAdmin, self).get_urls()
my_urls = [
url('export_excel/', self.export_excel)
]
return my_urls + urls
在前端加入按钮
在change_list.html中加入按钮
{% extends 'admin/change_list.html' %}
{% load static %}
{% block object-tools-items %}
<div>
<form action="export_excel/" method="POST">
{% csrf_token %}
<button type="submit">导出excel</button>
</form>
</div>
{% endblock %}
完成。
参考文献: