Python django导出excel详解
作者:时光茶居 时间:2021-06-15 17:12:19
django restframework 导入excel内容,可以查看另外一篇文章
一、基础环境
web架构:前后端分离,前端使用vue,后端使用django 的rest framework
django版本3.2
django-excel 版本0.0.10
djangorestframework版本3.12.4
二、需求
界面导出excel数据内容
导入model包含外键类型
三、功能实现
1.不使用序列化类:需要手动实现外键对象转换为外键值
2.使用序化类:
四、源码
#models.py
from django.db import models
from django.utils import timezone
class MyITtype(models.Model):
name = models.CharField(verbose_name="名称", max_length=128, unique=True)
ittype = models.SmallIntegerField(verbose_name="类型")
comment = models.TextField(verbose_name="备注", blank=True, default="")
def __str__(self):
return self.name
class Meta:
db_table = "MyITtype"
verbose_name = "it资产类型"
class MyAsset(models.Model):
ittype = models.ForeignKey(MyITtype, on_delete=models.SET_NULL, verbose_name="产品类型", null=True)
code = models.CharField(verbose_name="资产编码", max_length=128, unique=True)
buytime = models.DateField(verbose_name="入仓时间", default=timezone.now)
usetime = models.DateField(verbose_name="分配时间", default=timezone.now)
comment = models.TextField(verbose_name="规格说明", blank=True, default="")
user = models.CharField(verbose_name="使用人", max_length=128, blank=True, default="")
status = models.IntegerField(verbose_name="状态")
def __str__(self):
return self.code
class Meta:
db_table = "opGTITAsset"
verbose_name = "it固产"
一、序化类实现
#asset-export.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.serializers import ModelSerializer
from .models import MyAsset
import django_excel as excel
class ITAssetSer(ModelSerializer):
class Meta:
model = MyAsset
fields = '__all__'
class ITAssetExport(APIView):
""""""
use_model = MyAsset
queryset = use_model.objects.all()
serializer_class = ITAssetSer
def post(self, request, *args, **kwargs):
try:
data = request.data
id_list = data.get("data")
obj_list = self.queryset.all()
# 如果有值,表示导出部分,否则导出全部
if id_list:
obj_list = obj_list.filter(id__in=id_list)
ser = self.serializer_class(instance=obj_list, many=True)
return MakeExcel(obj_list=ser.data, class_name=self.use_model, filename="itasset")
except:
ret = {
"code": 599,
"message": "导出数据出错"
}
return Response(ret)
def get(self, request, *args, **kwargs):
self.http_method_not_allowed(request, *args, **kwargs)
def MakeExcel(obj_list, class_name, filename):
"""
制作excel表
:param ser_list: 内容列表
:param class_name: 类名
:param filename: 文件名
:return:
"""
meta_fields = class_name._meta.fields
name_list = [field.name for field in meta_fields]
header_list = [field.verbose_name for field in meta_fields]
wdata = [header_list]
for obj in obj_list:
data = [obj[name] for name in name_list]
wdata.append(data)
sheet = excel.pe.Sheet(wdata)
response = excel.make_response(pyexcel_instance=sheet, file_name=filename, file_type="xlsx")
return response
二、手动转换外键实现
#asset-export.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.objializers import ModelSerializer
from .models import MyAsset
import django_excel as excel
class ITAssetSer(ModelSerializer):
class Meta:
model = MyAsset
fields = '__all__'
class ITAssetExport(APIView):
""""""
use_model = MyAsset
queryset = use_model.objects.all()
objializer_class = ITAssetSer
def post(self, request, *args, **kwargs):
try:
obj_list = self.use_model.objects.all()
return MakeExcel(obj_list=obj_list, class_name=self.use_model, filename="itasset")
except:
ret = {
"code": 599,
"message": "导出数据出错"
}
return Response(ret)
def get(self, request, *args, **kwargs):
self.http_method_not_allowed(request, *args, **kwargs)
def MakeExcel(obj_list, class_name, filename):
"""
制作excel表
:param obj_list: 内容列表
:param class_name: 类名
:param filename: 文件名
:return:
"""
meta_fields = class_name._meta.fields
name_list = [field.name for field in meta_fields]
header_list = [field.verbose_name for field in meta_fields]
wdata = [header_list]
for obj in obj_list:
data = []
for name in name_list:
value = eval("obj." + name) # 等价于getattr(obj,name),即获取该对象某个字段内容
if isinstance(value, Model):
value = eval("".join(["obj." + name + "_id"])) # 等价于obj.name_id,即获取该对象中外键对象数值
data.append(value)
# 参考例子
# data = [getattr(obj, name) if name != "ittype" else obj.ittype_id for name in name_list]
wdata.append(data)
sheet = excel.pe.Sheet(wdata)
response = excel.make_response(pyexcel_instance=sheet, file_name=filename, file_type="xlsx")
return response
来源:https://blog.csdn.net/u014113686/article/details/121035842
标签:Python,django,导出,excel
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
小谈用户身体语言的阅读经验
2009-10-19 20:52:00
![](https://img.aspxhome.com/file/UploadPic/200910/19/bodylanguage-banner-72s.jpg)
Python+Pyecharts实现散点图的绘制
2023-09-02 05:01:29
![](https://img.aspxhome.com/file/2023/1/92211_0s.png)
python3实现域名查询和whois查询功能
2023-09-19 19:35:12
一个取图片尺寸的类,支持jpg,gif,png
2007-10-18 10:25:00
对python读取zip压缩文件里面的csv数据实例详解
2022-04-14 10:48:57
![](https://img.aspxhome.com/file/2023/7/103617_0s.jpg)
Oracle9i 动态SGA,PGA特性探索
2009-04-24 12:39:00
详解Python实现多进程异步事件驱动引擎
2023-02-27 21:43:12
![](https://img.aspxhome.com/file/2023/7/124907_0s.jpg)
浏览器针对单服务器连接数问题
2008-05-12 22:27:00
Python 连连看连接算法
2023-10-28 09:12:35
使用python的turtle绘画滑稽脸实例
2022-04-18 02:24:49
![](https://img.aspxhome.com/file/2023/1/66301_0s.jpg)
Python实现各种邮件发送
2021-09-01 17:35:47
![](https://img.aspxhome.com/file/2023/8/123808_0s.png)
全面了解django的缓存机制及使用方法
2023-07-22 09:51:58
![](https://img.aspxhome.com/file/2023/2/85352_0s.png)
树莓派4B安装Tensorflow的方法步骤
2023-09-05 17:28:06
![](https://img.aspxhome.com/file/2023/7/120267_0s.png)
编写python程序的90条建议
2022-04-30 00:36:22
django框架F&Q 聚合与分组操作示例
2021-05-21 02:13:56
跟老齐学Python之总结参数的传递
2021-12-16 18:17:24
Django前端BootCSS实现分页的方法
2023-12-21 01:45:34
![](https://img.aspxhome.com/file/2023/8/103348_0s.gif)
python可视化大屏库big_screen示例详解
2021-10-16 14:32:39
![](https://img.aspxhome.com/file/2023/7/87487_0s.jpg)
Python表达式的优先级详解
2021-09-21 14:24:59
关于 Web,你可能不知道的
2008-09-18 12:09:00
![](https://img.aspxhome.com/file/UploadPic/20089/18/2008918121258407s.jpg)