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
복사했습니다!