django中使用openpyxl,将数据库的数据生成excel文件保存
·
1、模型类
#用户表
class User(AbstractUser):
#继承原来的auth表,拓展字段,不要与原来有的字段名重复
telephone = models.CharField(max_length=11,verbose_name='手机号码')
name = models.CharField(max_length=12,verbose_name='用户姓名')
sid = models.CharField(max_length=24,verbose_name='身份证')
sex = models.IntegerField(choices=((1,'男'),(0,'女')),default=1,verbose_name='性别')
role = models.IntegerField(choices=((1,'超级管理员'),(2,'管理员'),(3,'老师'),(4,'学生')),default=4,verbose_name='用户角色')
stuclass = models.ForeignKey(to='stuClass',null=True,on_delete=models.CASCADE,verbose_name='班级外键')
def __str__(self):
return self.username
#返回班级的班号
@property
def class_name(self):
return self.stuclass.classon
#返回性别的中文
@property
def sex_name(self):
return self.get_sex_display()
2、序列化类
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from . import models
class StudentsExcelServializer(serializers.ModelSerializer):
class Meta:
model = models.User
fields =['name','username','telephone','email','sid','class_name','sex_name']
3、视图类
class ExportExcelTableView(ViewSet):
authentication_classes = []
@action(methods=['get'],detail=False)
def outtudents(self,request,*args,**kwargs):
#拿出所有的信息
users = models.User.objects.filter(role=4)
#对学生信息进行序列化
ser = serializer.StudentsExcelServializer(instance=users,many=True)
#新建一个工作簿
wb = Workbook()
#新建一个工作表
ws = wb.create_sheet('students',0)
#表的首行
ws.append(['姓名','学号','手机号码','邮箱','身份证','班级','性别'])
for dic in ser.data:
#将数据库查询到的数据写到excel表格中
ws.append(
[dic.get('name'),dic.get('username'),
dic.get('telephone'),dic.get('email'),
dic.get('sid'),dic.get('class_name'),
dic.get('sex_name')]
)
#文件名
name = f'{stu_class.classon}.xlsx'
# 这个是media文件夹下的students_excels文件夹路径,保存学生消息的excel表
PATH = os.path.join(settings.MEDIA_ROOT,'students_excels',name)
wb.save(PATH)
#ApiResponse是自己封装的
return ApiResponse(msg='生成班级文件成功',data={'文件名':name})
4、路由层:urls.py
from rest_framework import routers
from . import views
rou = routers.SimpleRouter()
#生成excel表格的视图函数
rou.register('',views.ExportExcelTableView,'create_excel')
urlpatterns = [
]
urlpatterns+=rou.urls
更多推荐
所有评论(0)