본문 바로가기
  • Hope for the best, plan for the worst
Python

#파이썬 openpyxl 이용하여 엑셀 자료 취합하기

by Qzin 2020. 5. 27.

재택근무가 끝나간다. 이번 주가 마지막이다. 재택근무도 근무인지라 당연히 놀고 먹은 것은 아니고 근무 시간 중에 열심히 일했다. 다만 일어나자마자 출근하고 랩탑 덮고 퇴근하자마 집인 이 상황을 이제 다시는 경험할 수 없다는게 조금은 안타깝다. 

 

오늘은 할 일을 어느 정도 정리 다 하고, 퇴근 후 남아서(?) 한 가지 해봐야겠다는 생각이 들었음. 매주 월요일 해야 하는 일 중에 어렵지 않지만 짜치는 일을 좀 없애보면 어떨까 하는 생각... 고객사에서 내가 만들어 준 템플릿에 숫자를 집어 넣어 주면 그걸 하나의 파일에 Copy & Paste 하고, 그 데이터를 다시 카피해서 다른 사람과 같이 만드는 리포트에 박아 넣어줘야 하는게 있는데 openpyxl 이용해서 그냥 원클릭으로 정리하는 것을 한 번 도전해봤고 결과는 성공. 

 

 

먼저 openpyxl 설치

 

pip install openpyxl

 

설치 하는건 이제 좀 알겠다. 뭐 이것도 조금 들어가면 복잡복잡하드라. 

근데 일단 설치하고 작동하면 나같은 초보는 장땡. 더 복잡한 내용은 나중에 필요할 때 배우자. 

 

그리고는 설치한걸 불러오고, 어떤 엑셀 파일에 있는 어떤 시트를 가져 올 것인지 설정해준다. 대/소문자 구별은 잘 하자. 이거 그냥 무심코 지나쳤는데 자꾸 에러나서 뭐지, 왜 안 되지? 계속 찾아보고 고민해봤는데 이유는... 

 

from openpyxl import load_workbook
from openpyxl import Workbook

load_wb = load_workbook(path, data_only=True)
load_ws = load_wb['Sheet1']

 

나도 구글 검색해가면서 필요한 부분들 위주로 가져다 쓰고 하다 보니 편협하게만 알고 또 그걸 이렇게 응용해보고 저렇게 응용해보고 있는지라 많이 부족. "data_only=True"라고 되어 있는 부분은 불러오는 시트에서 수식 말고 값만 가져 오기 위해서 저렇게 설정하는거라고 한다. "path"는 경로가 길고 주별로 폴더 이름이 바뀌다보니 그냥 제일 상단에 경로를 따로 할당을 했는데, 이 부분은 뭐 그냥 경로를 직접 붙여 넣든 나처럼 하든 편한대로 하면 될 것 같다. 

 

그리고 이제 취합할 엑셀 파일에다가 위에서 읽어온 데이터 값을 붙여 넣어 보자. 

 

load_wb_report = load_workbook(Path_consol)
Report_sheet = load_wb_report['consolidation']

 

Path_consol은 위에 언급한 것처럼 취합할 리포트가 있는 경로를 설정한 것. 그 파일에 있는 시트명 'consolidation'에 읽어온 엑셀값들을 가져다 붙이는게 나의 목표. 

 

일단 고객사에서 보내온 파일에 있는 셀들의 값들을 취합하는 파일에 있는 셀들에 붙여넣는건데 여기서 시간을 되게 많이 잡아 먹었다. 뭐 이렇게도 해보고 저렇게도 해보는데 'tuple은 그런 attribute를 가지고 있지 않다' 뭐 이런 메세지가 참 많이 떠서 이래서 기초가 중요한건가... 싶었는데 그렇다고 기초 강의를 유튜브에서 찾아 듣는건 무리이니 그건 나중에 하더라도 지금 이건 어떻게든 해보자 했는데 그게 성공했다...

 

rows = range(3, 30)
for row in rows:
    if row in range(3, 16):
        Report_sheet['D'+str(row)] = load_ws['D'+str(row)].value

 

위에서 범위를 지정해준건 사실 위에 코드는 밑에 일부가 잘린건데 거기 들어갈 내용인데 뭐 그래봐야 위에 있는 내용을 카피하고 if 구문에서 범위만 조정한 것 뿐이라.. 여튼 D3에서 D15까지 있는 값을 그대로 가져다 붙이는거를 해야 하는 상황이었는데 문득 예전에 인터넷 강의로 들었던 반복문이 생각나서 또 구글링해서 꾸역꾸역 해봤더니 잘 된다. 

 

여기서 좀 고생했고 다시는 까먹지 말아야 하는건

  • 사소하지만 for, if 마지막에 ":" 이거 꼭 붙여야 한다는거... 저기서 invalid syntax 에러 떠서 시간을 좀 잡아 먹었는데 저거 하나 안 넣었던거...
  • 그리고 row에서 범위를 숫자(int)로 지정해줘서 그랬는지 [ ] 안에 'D'+row 이렇게 했더니 또 에러가 떴다. 'D'는 string이어서 int를 str로 변환하는 함수 str( ) 먹여 봤더니 잘 되었다. 

일단 저기까지 해서 하나의 자료를 취합하는건 성공. 이거는 돌이켜보면 조금 단순한 것 같다. 그냥 D1부터 Dxx까지 값을 쭉 복사하면 되었으니. 

 

안타깝게도 취합해야 하는 자료는 회사 다녀본 분들은 알겠지만... 생각보다 많다... 나 역시 그랬고 이제는 동일한 엑셀 파일에 또 다른 값을 붙여 넣어야 하는데 이번에는 1개의 열이 아닌 복수의 열에 값을 가져다 붙여야 했다. 근데 뭐 이것도 반복문 검색하니 나오길래 조금 만져 봤더니 잘 되더라. 처음에 한 번 헤딩할 때가 어려웠지 그 다음에 조금 비슷한거는 어떻게든 응용이 되드만. 

 

rows = range(2, 158)
row_list = ['E', 'F', 'H']
for row in rows:
    for j in row_list:
        Report_sheet_2[j+str(row)] = load_ws_2[j+str(row)].value
        Report_sheet_2["j"+str(row)] = Date

 

복수의 열에 값을 집어 넣을 수 있게 어느 어느 열에 들어갈지를 지정해줬다.

  • _2 번 시트들은 위에서 적은 것처럼 설정해서 쓰면 된다. 굳이 거기까진 적지 않았다.
  • 위에 1개의 열에만 값을 입력하는 것에 더해서 마지막 열에 날짜값을 넣어야 하는게 있어서 Date 설정한걸 가져다 넣었다 (오늘 기준으로 지난 주 금요일 날짜를 넣도록 하려고 했는데 시간이 은근 빠듯하고 크리티컬 하지 않아서 일단 그거는 나중에 좀 만져볼까 함). 
  • 5번째 줄에 j는 변수이고, 그 다음 줄에 "j"는 그냥 string... 급하게 따라한다고 하다보니 이렇게 적었는데 나중에는 헷갈릴 수도 있으니 이 부분도 좀 신경을 써야 할 것 같다. 

그렇게 정리를 다 하고 나서 돌려봤는데 뭐가 안 되더라. 

이유는 모든 회사원들이 엑셀할 때 잊어서는 안 되고 자주자주 해줘야 하는 저장...에 대한 내용을 적지 않았기 때문... 백날 위와 같이 코딩해서 값 가져와봐야 저장 안 하면 당연히 남는게 없지. 

 

load_wb_report.save(Path_consol)

 

저장을 하고 돌려 보니 모든 값들이 정상적으로 입력이 된 것을 확인할 수 있었다. 

다음 주에 취합할 때는 꿀을 빨 수 있을 것 같아 기쁘다...

댓글