django
관련해서 admin
에서나 일반 응답으로 csv
로 export
하는 글은 많지만 csv
파일에 접근하는 사람마다 excel
설정이 달라 한국어과 관련된 인코딩으로 인해 파일이 깨져서 보이거나 하는 문제가 발생excel
설정을 바꿔야 정상적으로 읽히는 경우가 많음djnago
에서 .xls
파일로 export
하는 방법pip install xlwt
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
설정을 통해 영역 구분