오히려 좋아..

상황이 나쁘게만 흘러가는 것 같을 때 외쳐보자.. .

궁금한 마음으로 포트폴리오 보기

Web Programming/Django

[Django] Django에서 DB 엑셀 파일 생성하는 방법

junha6316 2021. 2. 17. 14:04

 

장고 관련해서 admin에서나 일반 응답으로 csv로 export하는 글은 많지만 csv 파일에 접근하는 사람마다 엑셀 설정이 달라

 

한국어과 관련된 인코딩으로 인해 파일이 깨져서 보이거나 하는 문제가 발생한다.

 

그 때문에 파일을 열고 일일이 엑셀 설정을 바꿔야 정상적으로 읽히는 경우가 많다.

 

이번 글에서는 장고에서 .xls 파일로 export 하는 방법에 대해서 알아보도록 하겠다.

1. xlwt 받기

먼저 아래의 모듈을 받아줘야 한다.

pypi.org/project/xlwt/

 

xlwt

Library to create spreadsheet files compatible with MS Excel 97/2000/XP/2003 XLS files, on any platform, with Python 2.6, 2.7, 3.3+

pypi.org

각자의 가상환경에 맞게 받아주면 된다.

pip install xlwt

 

2. 엑셀 다운로드 구현

다음은 엑셀 export 기능을 구현할 app의 views.py에 들어가 아래처럼 구현하면 된다.

import xlwt


#유저의 이름과 이메일을 엑셀 파일로 추출한다고 가정해보자

def excel_export(request):
	
    response = HttpResponse(content_type="application/vnd.ms-excel")
    response["Content-Disposition"] = 'attachment;filename*=UTF-8\'\'example.xls' 
    wb = xlwt.Workbook(encoding='ansi') #encoding은 ansi로 해준다.
    ws = wb.add_sheet('참가자') #시트 추가
    
    row_num = 0
    col_names = ['email', 'name']
    
    #열이름을 첫번째 행에 추가 시켜준다.
    for idx, col_name in enumerate(col_names):
    	ws.write(row_num, idx, col_name)
        
    
    #데이터 베이스에서 유저 정보를 불러온다.
    rows = User.objects.all().values_list('name', 'email') 
    
    #유저정보를 한줄씩 작성한다.
    for row in rows:
    	row_num +=1
        for col_num, attr in enumerate(row):
        	ws.write(row_num, col_num, attr)
            
    wb.save(response)
    
    return reponse
    
 	
	

 

위 코드를 응용해서 필요한 데이터를 데이터 베이스에서 읽어서 엑셀로 생성하면 된다.

참고로 중요한건 문자열 밖에 작성이 안되니 datetime와 같은 객체는 string으로 바꿔서 ws.write를 적용해주면 된다.

 

 

아래 동영상을 참고 해도 좋다

tutorial101.blogspot.com/2020/04/django-how-to-export-data-to-xls-file.html

 

Django How to Export Data to XLS File

tutorial101 is the one place for high quality web development, Web Design and software development tutorials and Resources programming

tutorial101.blogspot.com