인프런 커뮤니티 질문&답변

jinsick님의 프로필 이미지
jinsick

작성한 질문수

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

장고로 엑셀파일 편집 홈페이지 만들기 질문입니다

작성

·

476

0

안녕하세요 장고로 홈페이지를 만들고 있는데 궁금한 것이 있어서 질문남겨봅니다

여러 엑셀파일을 업로드 해서 각 엑셀파일별로 편집 후 파일들을 하나로 합쳐서 다운로드 받게하려는 기능을 구현하려고 하고 있습니다

각 파일별 업로드 후 편집하는 것 까진 구현했는데 그 파일들을 하나로 합쳐서 다운로드 하는 것이 구현이 안되는 상황입니다

이럴때 함수로 그 파일들을 합쳐서 다운로드도 가능하게 할 수 있을까요?

  • 별도의 데이터베이스는 사용하지 않으려고 합니다

  • 장고쪽인지 또는 html쪽 문제인지 궁금합니다

해당 코드의 주소입니다

how to merge excel file with python django - Stack Overflow

감사합니다


 

답변 1

0

이진석님의 프로필 이미지
이진석
지식공유자

안녕하세요.

StackOverflow 쪽에 질문이 명확히 정리가 된 건 아니라서, 정확한 답변을 드리긴 어려운데요. // 에러를 공유하실 때에는 에러메세지 일부만 보여주시면 현상을 파악하기 무척 어렵습니다. 에러가 발생하면 에러가 발생한 소스코드의 Line 까지 출력해주니, 스크린캡처로 공유하시는 것이 더 효율적일 수 있구요. 에러메세지를 일부 편집하지 않으시는 것이 좋습니다. 디버깅에 필요한 중요한 단서가 누락될 수도 있으니깐요.


request 객체에서 FILES는 사전(dict)을 상속받은 MultiValueDict 타입입니다. 사전과 유사하다고 보시면 되구요. 사전에서는 사전["키"] 를 통해 조회하실 수도 있고, 사전.get("키")를 통해서 조회하실 수도 있습니다.

사전. get("키") 로 조회하실 때에는 사전에 지정 "키"의 값이 없을 때에는 None을 반환하며,
사전["키"] 로 조회하실 때에는 사전에 지정 "키" 의 값이 없을 때에는 KeyError가 발생합니다.

지금 발생하신 오류가 MultiValueDictKeyError 입니다. 업로드된 파일 내역에서 "건강기본" 이라는 name을 가진 업로드 내역이 없다는 뜻입니다. 즉 html form에서 input type="file" 필드 중에 name="건강기본"이 없기도 하고, 이를 사전["키"] 처럼 접근하셔서 발생하는 오류입니다.


그리고, DataFrame을 하나로 이미 합치신 상황에서 엑셀 파일 생성하실 때에는, 생성하실 엑셀파일의 시트가 1개 뿐이니까 굳이 pd.ExcelWriter를 쓰실 필요가 없습니다. DataFrame의 to_excel만 쓰셔도 충분합니다.

아래 공식문서를 보시면, pd.ExcelWriter처럼 to_excel 함수의 첫번째 인자에는 path-like, file-like, or ExcelWriter object 를 지정하실 수 있습니다.

  • path-like : 문자열로 파일시스템에 저장할 경로

  • file-like : 파일 인터페이스를 지원하는 객체 (예: BytesIO, HttpResponse 등)

  • ExcelWriter 객체

관련 공식문서 : https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_excel.html

to_excel 함수의 첫번째 인자로 BytesIO 객체를 지정하셨는 데, 이는 file-like 성격이구요. 장고 View에서는 HttpResponse 객체도 file-like 인터페이스를 지원하니

관련 공식문서 : https://docs.djangoproject.com/en/4.2/ref/request-response/#django.http.HttpResponse.write

아래와 같이 간결하게 저장을 해보실 수 있으실 듯 합니다.

response = HttpResponse(content_type="원하는 타입")
df.to_excel(response)
return response


차근차근 살펴보세요. 화이팅입니다. :-)

jinsick님의 프로필 이미지
jinsick
질문자

그러면 엑셀 편집한 상태로 업로드를 하면 그 상태가 웹 상에 남아있어서 그 데이터들을 합치는게 가능할까요? 각 함수처리 후에 institute_combine 함수를 통해 합친 후 다운로드 받게 하려고 하거든요..

이진석님의 프로필 이미지
이진석
지식공유자

말씀하신 "그 상태가 웹 상에 남아있어서"가 무엇을 의미하는 지 모르겠습니다.

지역변수는 그 함수의 실행이 끝나면 메모리에서 해제되듯이, 엑셀 파일을 합치신 내역은 pd.DataFrame 객체로 있구요. View 함수가 끝나면 해당 변수도 메모리에서 해제될 것입니다.

하나의 View 함수에서 업로드된 엑셀파일 내역을 합쳐서, View 함수 응답으로 엑셀파일 다운로드 응답이 가능합니다.

jinsick님의 프로필 이미지
jinsick

작성한 질문수

질문하기