재택근무가 끝나간다. 이번 주가 마지막이다. 재택근무도 근무인지라 당연히 놀고 먹은 것은 아니고 근무 시간 중에 열심히 일했다. 다만 일어나자마자 출근하고 랩탑 덮고 퇴근하자마 집인 이 상황을 이제 다시는 경험할 수 없다는게 조금은 안타깝다.
오늘은 할 일을 어느 정도 정리 다 하고, 퇴근 후 남아서(?) 한 가지 해봐야겠다는 생각이 들었음. 매주 월요일 해야 하는 일 중에 어렵지 않지만 짜치는 일을 좀 없애보면 어떨까 하는 생각... 고객사에서 내가 만들어 준 템플릿에 숫자를 집어 넣어 주면 그걸 하나의 파일에 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)
저장을 하고 돌려 보니 모든 값들이 정상적으로 입력이 된 것을 확인할 수 있었다.
다음 주에 취합할 때는 꿀을 빨 수 있을 것 같아 기쁘다...
'Python' 카테고리의 다른 글
#Python Selenium 이용해서 Sharepoint 글 올리기 도전 (0) | 2020.05.25 |
---|---|
문과 출신 회사원도 코딩 한 번 해보자... (0) | 2020.05.25 |
댓글