基本实现导出功能
在admin.py定义导出函数
# 实现数据导出功能
exportable_fields = ('username', 'city', 'phone', 'bachelor_school', 'master_school', 'degree', 'first_result', 'first_interviewer_user',
'second_result', 'second_interviewer_user', 'hr_result', 'hr_score', 'hr_remark', 'hr_interviewer_user')
# request是用户发起的请求,queryset是用户在界面上选择的结果列表里面的数据集合
def export_model_as_csv(modeladmin,request,queryset): # request是用户发起的请求,queryset用户在列表选择的结果列表里的数据集合
response = HttpResponse(content_type='text/csv')
field_list = exportable_fields # 导出的字段
# 指定导出文件的格式
response['Content-Disposition'] = 'attachment; filename=%s-list-%s.csv' %(
'name',
datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
)
#写入表头
writer = csv.writer(response)
writer.writerow(
# 把每一个字段对应的页面显示的中文名,作为我们导出文件里面的表头,
[queryset.model._meta.get_field(f).verbose_name.title() for f in field_list]
)
# 把数据的每一行写进去
for obj in queryset:
#单行记录(各个字段的值)写入到csv文件
csv_line_values = []
for field in field_list:
field_object = queryset.model._meta.get_field(field)
field_value = field_object.value_from_object(obj)
csv_line_values.append(field_value)
writer.writerow(csv_line_values)
logging.info('%s exported %s candidate records' % (request.user, len(queryset)))
return response
# 定义这个函数的属性
export_model_as_csv.short_description = u'导出为CSV文件'
# 导出按钮的权限,如果用户有export的权限,则运行调用allowed_permissions这个方法,则菜单会展示出来
export_model_as_csv.allowed_permissions = ('export', )
class CandidateAdmin(admin.ModelAdmin):
# 定义actions,将函数注册到actions里面
actions = [export_model_as_csv, ]
# 当前用户是否有导出权限:
def has_export_permission(self, request):
opts = self.opts
return request.user.has_perm('%s.%s' % (opts.app_label, "export"))
#用户有无权限用user.has_perm判断,opts.app_label取得candidate,看的是candidate.export
pass
用pandas实现导出功能
def export_model_as_csv(modeladmin,request,queryset): # request是用户发起的请求,queryset用户在列表选择的结果列表里的数据集合
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename=%s-list-%s.csv' % (
'name',
datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
)
data = pd.DataFrame(list(queryset.values()))
id_list = list(data['app_username'].unique())
name_list = []
for i in id_list:
name = str(data[data['app_username'] == i]['name'].unique()[0])
name_list.append(name)
new_data = pd.DataFrame(columns=pd.MultiIndex.from_product([data['sign_date'].unique(), ['早', '中', '晚']]), index=pd.MultiIndex.from_arrays([id_list, name_list],names=['学号','姓名']))
for i in range(len(data)):
obj = data.iloc[i]
new_data.loc[obj['app_username'],obj['name']][obj['sign_date'].strftime('%Y-%m-%d')]=[JudgeTem(obj['morning_temperature']), JudgeTem(obj['afternoon_temperature']), JudgeTem(obj['evening_temperature'])]
new_data = new_data.style.applymap(color, subset=new_data.columns)
output = io.BytesIO() # 配置一个BytesIO 这个是为了转二进制流
new_data.to_excel(output)
output.seek(0) # 把游标归0
response.write(output.getvalue()) # 写入数据
output.close() # 关闭
return response # 返回
参考:
https://www.cnblogs.com/konghepeng/p/14708752.html
https://my.oschina.net/u/4311876/blog/3425145
设置导出的Excel表格风格