一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python django導出excel詳解

Python django導出excel詳解

2022-02-22 00:25時光茶居 Python

這篇文章主要介紹了Python django導出excel的方法 ,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下

django restframework 導入excel內容,可以查看另外一篇文章

一、基礎環境

web架構:前后端分離,前端使用vue,后端使用django 的rest framework

django版本3.2

django-excel 版本0.0.10

djangorestframework版本3.12.4

二、需求

界面導出excel數據內容

導入model包含外鍵類型

三、功能實現

1.不使用序列化類:需要手動實現外鍵對象轉換為外鍵值

2.使用序化類:

四、源碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#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固產"

一、序化類實現

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#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

二、手動轉換外鍵實現

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人免费网站视频ww | 国产综合亚洲欧美日韩一区二区 | 国产一区二区三区在线 | jm漫天堂破解版 | 息与子中文字幕在线 | 亚洲好骚综合 | 美女扒开屁股让男人进去 | 动态图啪啪120秒免费看 | 日韩毛片免费线上观看 | 天天排行网 | 精品成人在线 | 调教校花浣肠开菊 | 欧美在线一二三区 | 波多野结衣久久国产精品 | 日本性生活免费看 | 18岁的老处女 | 国产精品毛片无码 | 99热色 | 国产3344视频在线观看免费 | a黄毛片 | 三级午夜宅宅伦不卡在线 | 精品推荐国产麻豆剧传媒 | 高黄h文各种play | 日韩激情视频在线观看 | 日韩视频在线免费观看 | 日本韩国推理片免费观看网站 | 痴mu动漫成年动漫在线观看 | 魔兽官方小说 | 精品午夜久久福利大片免费 | 亚洲va精品中文字幕 | 乌克兰少妇大胆大BBW | a级成人毛片免费图片 | 网红思瑞一区二区三区 | 色啊色| 99热精品在线观看 | 欧美成人日韩 | 午夜DV内射一区区 | 第一福利在线视频 | 亚洲色图150p| 国产99青草全福视在线 | 欧美日韩va |