Python django導出excel詳解
更新時間:2021年11月01日 14:33:42 作者:時光茶居
這篇文章主要介紹了Python django導出excel的方法 ,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
django restframework 導入excel內(nèi)容,可以查看另外一篇文章
一、基礎(chǔ)環(huán)境
web架構(gòu):前后端分離,前端使用vue,后端使用django 的rest framework
django版本3.2
django-excel 版本0.0.10
djangorestframework版本3.12.4
二、需求
界面導出excel數(shù)據(jù)內(nèi)容
導入model包含外鍵類型
三、功能實現(xiàn)
1.不使用序列化類:需要手動實現(xiàn)外鍵對象轉(zhuǎn)換為外鍵值
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資產(chǎn)類型"
class MyAsset(models.Model):
ittype = models.ForeignKey(MyITtype, on_delete=models.SET_NULL, verbose_name="產(chǎn)品類型", null=True)
code = models.CharField(verbose_name="資產(chǎn)編碼", 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="規(guī)格說明", blank=True, default="")
user = models.CharField(verbose_name="使用人", max_length=128, blank=True, default="")
status = models.IntegerField(verbose_name="狀態(tài)")
def __str__(self):
return self.code
class Meta:
db_table = "opGTITAsset"
verbose_name = "it固產(chǎn)"
一、序化類實現(xiàn)
#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": "導出數(shù)據(jù)出錯"
}
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: 內(nèi)容列表
: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
二、手動轉(zhuǎn)換外鍵實現(xiàn)
#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": "導出數(shù)據(jù)出錯"
}
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: 內(nèi)容列表
: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),即獲取該對象某個字段內(nèi)容
if isinstance(value, Model):
value = eval("".join(["obj." + name + "_id"])) # 等價于obj.name_id,即獲取該對象中外鍵對象數(shù)值
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
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
python中Scikit-learn庫的高級特性和實踐分享
Scikit-learn是一個廣受歡迎的Python庫,它用于解決許多機器學習的問題,在本篇文章中,我們將進一步探索Scikit-learn的高級特性和最佳實踐,需要的朋友可以參考下2023-07-07
Python登錄QQ郵箱發(fā)送郵件的實現(xiàn)示例
本文主要介紹了Python登錄QQ郵箱發(fā)送郵件的實現(xiàn)示例,主要就是三步,登錄郵件、寫郵件內(nèi)容、發(fā)送,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧<BR>2023-08-08

