지난시간에 이어, django로 엑셀파일을 올려 계산 및 정리해주는 사이트를 완성시켜보자.
이번에는 엑셀파일을 올리고 계산을 하는 기능을 구현해보자.
0. 프로젝트 알고리즘
1. 파일 업로드 & 계산 기능 구현하기
ExcelCalculate > calculate > views.py
from django.shortcuts import redirect
import pandas as pd
# Create your views here.
def calculate(request):
# ExcelCalculate > calculate > views.py
file = request.FILES['fileInput']
print("# 사용자가 등록한 파일의 이름: ", file)
df = pd.read_excel(file, sheet_name="Sheet1", header=0)
print(df.head())
# grade별 value 딕셔너리 만들기
grade_df = df.groupby('grade')['value'].agg(["min", "max", "mean"]).reset_index().rename(columns = {"mean" : "avg"})
grade_df = grade_df.astype({"min": "int", "max": "int", "avg": "float"})
grade_df = grade_df.style.hide(axis='index').set_table_attributes('class="table table-dark"')
grade_calculate_dic_to_session = {'grade_df' : grade_df.to_html(justify="center")}
request.session['grade_calculate_dic'] = grade_calculate_dic_to_session
# 이메일 주소 도메인별 인원 구하기
df['domain'] = df['email'].apply(lambda x : x.split("@")[1])
email_df = df.groupby('domain')['value'].agg("count").sort_values(ascending=False).reset_index()
email_df = email_df.style.hide(axis='index').set_table_attributes('class="table table-dark"')
email_calculate_to_session = {'email_df' : email_df.to_html(justify='center')}
request.session['email_domain_dic'] = email_calculate_to_session
return redirect("/result")
위와 같이 코드 수정
[ calculate 함수의 역할 ]
- 사용자가 등록한 파일 객체에 저장 및 파일이름 터미널 창에서 보여주기
- Pandas 데이터프레임 생성 및 터미널 창에서 위 5줄 보여주기
- grade별 value값의 min, max, mean 계산후 표로정리
- 이메일 도메인을 가져오기 위해 @을 기준으로 문자열 split후 도메인별로 count
- 데이터프레임을 html 방식으로 변환 및 딕셔너리 생성
- result로 보여주기 위해 계산결과를 세션으로 보냄
- 사용자를 result 페이지로 보냄
2. 엑셀 파일 업로드 및 계산 결과 확인
$ python manage.py runserver
서버 실행
로그인 후 파일 업로드 화면에서 ‘data.xlsx’ 파일 업로드
(샘플 data.xlsx)
엑셀 정보가 정리되어 출력되는 것을 확인할 수 있다.
'# Coding > Django' 카테고리의 다른 글
Django의 MTV 패턴 (MVC 패턴과 비교) (0) | 2023.08.21 |
---|---|
Django로 엑셀파일 계산 페이지 만들기 (로그인 기능 구현) (0) | 2023.08.12 |
Django로 Gmail 보내기 (0) | 2023.07.29 |
Django To-do List 사이트 생성 (2) (0) | 2023.07.27 |
Django To-do List 사이트 생성 (1) (0) | 2023.07.26 |