事件导出excel part1

This commit is contained in:
caoqianming 2023-02-08 17:33:55 +08:00
parent afdd7a67ca
commit 73b0ce7cb7
3 changed files with 100 additions and 3 deletions

View File

@ -4,13 +4,14 @@ from threading import Thread
from django.db import transaction from django.db import transaction
from django.db.models import Count, F from django.db.models import Count, F
from django.utils import timezone from django.utils import timezone
from rest_framework import serializers
from rest_framework.decorators import action from rest_framework.decorators import action
from rest_framework.exceptions import PermissionDenied from rest_framework.exceptions import PermissionDenied
from rest_framework.mixins import (CreateModelMixin, DestroyModelMixin, from rest_framework.mixins import (CreateModelMixin, DestroyModelMixin,
ListModelMixin, RetrieveModelMixin, ListModelMixin, RetrieveModelMixin,
UpdateModelMixin) UpdateModelMixin)
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.exceptions import ParseError
from apps.ecm.filters import EventFilterSet from apps.ecm.filters import EventFilterSet
from apps.ecm.models import (AlgoChannel, Event, EventCate, Eventdo, from apps.ecm.models import (AlgoChannel, Event, EventCate, Eventdo,
NotifySetting, Remind) NotifySetting, Remind)
@ -23,7 +24,10 @@ from apps.ecm.serializers import (AlgoChannelCreateSerializer,
NotifySettingsSerializer, RemindSerializer) NotifySettingsSerializer, RemindSerializer)
from apps.ecm.service import update_remind_read from apps.ecm.service import update_remind_read
from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet
from apps.utils.export import export_excel_img
obj_cate_dict = {'people': '人员', 'operation': '作业', 'other': '其他'}
mark_dict = {10: '正常', 20: '误报'}
# Create your views here. # Create your views here.
class EventCateViewSet(CreateModelMixin, UpdateModelMixin, ListModelMixin, CustomGenericViewSet): class EventCateViewSet(CreateModelMixin, UpdateModelMixin, ListModelMixin, CustomGenericViewSet):
@ -138,6 +142,49 @@ class EventViewSet(ListModelMixin, RetrieveModelMixin, DestroyModelMixin, Custom
'cate', 'cate__name', 'cate__trigger').annotate(count=Count('cate'))) 'cate', 'cate__name', 'cate__trigger').annotate(count=Count('cate')))
return Response(ret) return Response(ret)
@action(methods=['get'], detail=False, perms_map={'get': '*'},
serializer_class=serializers.Serializer)
def export_excel(self, request, pk=None):
"""导出excel
导出excel
"""
field_data = [
{"name": "事件种类", "type": "str"},
{"name": "发生区域", "type": "str"},
{"name": "事件类型", "type": "str"},
{"name": "事件对象", "type": "str"},
{"name": "发生时间", "type": "str"},
{"name": "处理人", "type": "str"},
{"name": "事件标记", "type": "str"},
{"name": "抓拍图", "type": "img"},
{"name": "人脸图", "type": "img"},
]
queryset = self.filter_queryset(self.get_queryset())
if queryset.count() > 200:
raise ParseError('数量超过200,请筛选后导出')
odata = EventSerializer(queryset, many=True).data
# 处理数据
data = []
for i in odata:
cates_str = ''
for m in i['cates_']:
cates_str = cates_str + '/' + m['name']
data.append(
[
cates_str,
i['area_'].get('name', ''),
obj_cate_dict[i['obj_cate']],
'test',
i['create_time'],
i['handle_user_name'],
mark_dict[i['mark']],
i['global_img'],
i['face_img']
]
)
return Response({'path': export_excel_img(field_data, data, '事件记录')})
class RemindViewSet(ListModelMixin, CustomGenericViewSet): class RemindViewSet(ListModelMixin, CustomGenericViewSet):
perms_map = {'get': '*'} perms_map = {'get': '*'}

View File

@ -3,7 +3,9 @@ import time
import os import os
from django.conf import settings from django.conf import settings
from datetime import datetime from datetime import datetime
from openpyxl import Workbook, styles
from openpyxl.drawing.image import Image
from openpyxl.utils import get_column_letter, column_index_from_string
def len_byte(value): def len_byte(value):
# 获取字符串长度一个中文的长度为2 # 获取字符串长度一个中文的长度为2
@ -16,7 +18,6 @@ def len_byte(value):
def export_excel(field_data: list, data: list, FileName: str): def export_excel(field_data: list, data: list, FileName: str):
""" """
Excel导出 Excel导出
:param request: 请求request
:param data: 数据源 :param data: 数据源
:param field_data: 首行数据源表头 :param field_data: 首行数据源表头
:param file_path: 文件保存路径默认保存在media路径 :param file_path: 文件保存路径默认保存在media路径
@ -109,3 +110,51 @@ def export_excel(field_data: list, data: list, FileName: str):
path_name = os.path.join(pathRoot, FileNameF) path_name = os.path.join(pathRoot, FileNameF)
wbk.save(path_name) wbk.save(path_name)
return path + FileNameF return path + FileNameF
def export_excel_img(field_data: list, data: list, FileName: str):
"""
带有image的Excel导出
:param data: 数据源
:param field_data: 首行数据源表头{'name':'', 'type':''}
:param img_field_indexs: 图片字段名index列表
:param file_path: 文件保存路径默认保存在media路径
:param FileName: 文件保存名字
:return:返回文件的下载url完整路径
"""
wb = Workbook()
ws = wb.active
imgs = []
for index, value in enumerate(field_data):
cell = ws.cell(column=index, row=0)
cell.value = value['name']
cell.font = styles.Font(bold=True)
letter = get_column_letter(index+1)
value['letter'] = letter
ws.column_dimensions[letter].width = 10 #修改列宽
if value['type'] == 'img':
ws.column_dimensions[letter].width = 15 #修改列宽
for i1, v1 in enumerate(data):
for i2, v2 in enumerate(v1):
cell = ws.cell(column=i2, row=i1+1)
if v2 and field_data[i2]['type'] == 'img':
ws.row_dimensions[i1+1].height = 70
img = Image(settings.BASE_DIR + v2, width=90, height=90)
imgs.append((img, field_data[i2]['letter'] +str(i1+1)))
else:
cell.value = v2
for i in imgs:
ws.add_image(i[0], i[1])
FileNameF = FileName + datetime.now().strftime('%Y%m%d%H%M%S') + '.xlsx'
path = '/media/temp/'
pathRoot = settings.BASE_DIR + path
if not os.path.exists(pathRoot):
os.makedirs(pathRoot)
path_name = os.path.join(pathRoot, FileNameF)
wb.save(path_name)
return path + FileNameF

View File

@ -29,4 +29,5 @@ protobuf==3.20.1
pycryptodome==3.15.0 pycryptodome==3.15.0
aliyun-python-sdk-core==2.13.36 aliyun-python-sdk-core==2.13.36
xlwt==1.3.0 xlwt==1.3.0
openpyxl==3.1.0