[Django] Excel Export

GreenBean·2022년 3월 11일
0
post-thumbnail

Excel Export

Django: How to Export Data to XLS File

  • django 관련해서 admin에서나 일반 응답으로 csvexport하는 글은 많지만 csv 파일에 접근하는 사람마다 excel 설정이 달라 한국어과 관련된 인코딩으로 인해 파일이 깨져서 보이거나 하는 문제가 발생
    • 그 때문에 파일을 열고 excel 설정을 바꿔야 정상적으로 읽히는 경우가 많음
  • djnago에서 .xls 파일export 하는 방법

엑셀 내보내기

xlwt 설치

pip install xlwt

excel file download 구현

import datetime
import xlwt

from django.http import HttpResponse


def excel_export(request):
    # 사용할 자료
    data = request.data.get('data')
    
	response = HttpResponse(content_type="application/vnd.ms-excel")
    # 다운로드 받을 때 생성될 파일명 설정
    response["Content-Disposition"] = 'attachment; filename=' \
                                + str(datetime.date.today()) + '.xls'
	
    # 인코딩 설정
    wb = xlwt.Workbook(encoding='utf-8')
    # 생성될 시트명 설정
    ws = wb.add_sheet('Core User Information')
    
    # 엑셀 스타일: 첫번째 열(=title)과 나머지 열(=data) 구분 위한 설정
    title_style = xlwt.easyxf('pattern: pattern solid, fore_color indigo; align: horizontal center; font: color_index white;')
    data_style = xlwt.easyxf('align: horizontal right')
    
    # 첫번째 열에 들어갈 컬럼명 설정
    col_names = ['ID', '가입한 날짜', '이메일', '이름']
	
    # 엑셀에 쓸 데이터 리스트화
    rows = []
    for datum in data:
        rows.append([datum['id'], datum['date_joined'].split("T")[0], datum['email'], datum['full_name']])
    
    # 첫번째 열: 설정한 컬럼명 순서대로 스타일 적용하여 생성
    row_num = 0
    for idx, col_name in enumerate(col_names):
        ws.write(row_num, idx, col_name, title_style)
    
    # 두번째 이후 열: 설정한 컬럼명에 맞춘 데이터 순서대로 스타일 적용하여 생성
    for row in rows:
        row_num +=1
        for col_num, attr in enumerate(row):
            ws.write(row_num, col_num, attr, data_style)
            
    wb.save(response)
        
    return response

Tip! xlwt 스타일 설정을 위한 색깔 코드 모음
Python xlwt Colors: Sheet

결과

  • 다운로드 받기 위한 페이지 template으로 간단하게 생성하여 확인

  • 짜잔! 🙌
    • 위 예시와 다른 코드로 생성한 결과
    • 합산 표와 상세 결과가 함께 있어야 해서 row_num 설정을 통해 영역 구분

profile
🌱 Backend-Dev | hwaya2828@gmail.com

0개의 댓글