728x90
반응형
xlwt 모듈로 excel export 기능을 구현하려고 했으나 xlsx 확장자가 안되기에 업무용으로 엑셀을 export해서 주고 받기에는 문제가 있어보였음
그래서 급하게 다른 모듈을 찾다가 xlsxwriter 모듈을 사용하게 됨
openpyxl과 xlsxwriter 중 고민했지만 비슷한것 같아 속도가 더 빠른 xlsxwriter 모듈을 선택함
(나는 간단한 파일 작성이여서 사실 속도 차이는 못느낄 듯)
앞으로 절대 xlwt 모듈은 사용안하는 것을 권장함😥
그리고 결정적으로 xlwt 모듈을 행의 height 설정이 불가했음(설정 방법 못 찾음)
👉 xls 확장자는 2003년 이하 버전 확장자인데 xlsx 확장자 선택이 불가함
Xlsxwriter 모듈 설치
# pip 설치
> pip install Xlsxwriter
views.py 엑셀 export 구현
# views.py
def excel_export(request):
# Create an in-memory output file for the new workbook.
output = io.BytesIO()
workbook = xlsxwriter.Workbook(output)
worksheet = workbook.add_worksheet()
tomorrow = datetime.today() + timedelta(days=1)
tomorrowfilter = tomorrow.strftime('%Y-%m-%d')
# 타이틀 생성
title = '스마트 전자도서관시스템, 국회부산도서관 홈페이지 및 국회지〮방의회 의정정보시스템 개발사업 출입 신청'
worksheet.set_column('A:F', 12)
worksheet.set_row(0, 57) # 행 너비 조절
# 타이틀 스타일 설정
merge_format = workbook.add_format({
'bold': 1,
'border': 1,
'align': 'center',
'valign': 'vcenter'})
worksheet.merge_range('A1:F1', title, merge_format) # 행 합치기
# 헤더 생성
row_num = 1
col_names = ['순번', '기간', '업체명', '직급', '성명', '비고']
# 헤더 스타일 설정
header_format = workbook.add_format({
'border': 1,
'align': 'center'})
header_format.set_bg_color('#D9E1F2')
# 헤더 데이터 삽입
for idx, col_name in enumerate(col_names):
worksheet.write(row_num, idx, col_name, header_format)
# 내용 데이터 생성
data = Board.objects.filter(start_date__lte = tomorrowfilter, end_date__gte = tomorrowfilter).values_list('start_date', 'end_date', 'company', 'position', 'guest_name', 'guest_name')
# 날짜 포맷 설정
date_format = workbook.add_format({
'num_format': '~ yyyy-mm-dd (aaa)',
'border': 1,
'align': 'center'})
# 순번 스타일 설정
num_format = workbook.add_format({
'border': 1,
'align': 'right'})
# 비고 스타일 설정
remark_format = workbook.add_format({'border': 1})
# 내용 데이터 삽입
for row_num, columns in enumerate(data):
for col_num, cell_data in enumerate(columns):
worksheet.write(row_num+2, col_num, cell_data, date_format)
worksheet.write(row_num+2, 0, row_num+1, num_format)
worksheet.write(row_num+2, 5, '', remark_format)
worksheet.set_column('A:A', 5.63)
worksheet.set_column('B:B', 16)
worksheet.set_column('C:C', 18.88)
worksheet.set_column('D:D', 11.63)
worksheet.set_column('E:E', 15.25)
worksheet.set_column('F:F', 19.13)
# Close the workbook before sending the data.
workbook.close()
# Rewind the buffer.
output.seek(0)
# Set up the Http response.
today = datetime.today().strftime('%Y%m%d')
filename = '출입신청_'+today+'.xlsx'
response = HttpResponse(
output,
content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
)
response['Content-Disposition'] = "attachment; filename*=UTF-8''{}".format(quote(filename.encode('utf-8'))) # 한글 제목 설정
return response
반응형
'Project > access-control' 카테고리의 다른 글
상세 페이지 연결 (0) | 2021.11.29 |
---|---|
Xlsxwriter 한글파일명 설정 및 행 높이 조절 (0) | 2021.11.26 |
Django home 만들기(index page) (0) | 2021.11.24 |
xlwt excel 스타일 설정 (0) | 2021.11.23 |
Django Filters (objects filter) (0) | 2021.11.22 |