基本实现导出功能

在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表格风格

最后编辑:2022年05月19日 ©著作权归作者所有