Python/Django

Django Rest Framework Excel Renderer 클래스

DevelopC 2017. 8. 2. 10:35
728x90

Django Rest Framework Excel Renderer 클래스

Django Rest Framework에서 엑셀다운로드 방법을 설명합니다.
우선 openpyxl 엑셀 핸들링할 수 있는 패키지를 설치해야합니다.
$ pip install openpyxl

 

그리고 아래의 Renderer클래스를 작성해주세요. 아래의 코드는 스트리밍으로 엑셀을 다운로드 받는 형식입니다.

Django Rest Framework에는 여러가지 개념이 있는데 아래의 코드는 Renderer를 이용한 예제입니다.

from io import BytesIO
from openpyxl import Workbook
from rest_framework.renderers import BaseRenderer


class ExcelRenderer(BaseRenderer):
    """
    Excel Renderer
    """
    media_type = 'application/ms-excel'
    format = 'xlsx'
    level_sep = '.'

    def render(self, data, media_type=None, renderer_context=None):
        """
        Renders serialized *data* into Excel. For a dictionary:
        """
        if data is None:
           return False

        stream = BytesIO()
        wb = Workbook(write_only=True)
        ws = wb.create_sheet()

        if 'header' in data:
            headers = data['header']
            ws.append(headers)
        
        if 'rows' in data: 
            for item in data['rows']:
                ws.append([item.get(key, None) for key in headers])

        wb.save(stream)
        value = stream.getvalue()
        stream.close()

        return value

 

이제 Viewset을 작성하여 실제 엑셀데이터를 선언해야합니다.

from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework.decorators import list_route


class ExcelViewSet(viewsets.GenericViewSet):
    queryset = Model.objects.all()
    serializer_class = ModelSerializer
    renderer_classes = (ExcelRenderer,)

    @list_route(methods=['GET'], url_path='download')
    def download(self, request):
        data = {
            'header': ['name', 'no'],
            'rows': [
                {
                    'name': 'name',
                    'no': 'no'
                }
            ]
        }
        
        headers = {}
        headers['Content-Disposition'] = 'attachment; filename=excel.xlsx'
        return Response(data=data, headers=headers)

 

renderer에 대한 내용은 링크에 자세히나와있으니 참고하시기바랍니다.

 

728x90

'Python > Django' 카테고리의 다른 글

Django Rest Framework Filter  (0) 2022.10.05
Django Rest Framework ViewSet  (0) 2022.09.28
Django ORM  (2) 2022.09.23
Django ORM기반 ERD 생성  (0) 2017.07.06