우연히 생활코딩 페이스북 페이지를 둘러 보다가 지원 부서 실무자가 쉽게 마주칠법 한 질문을 보게 되었습니다.
엑셀 파일이 여러개 있습니다. 이 엑셀파일들에는 공통적으로 A1셀들에 A1들의 총합을 구해야하는 숫자가, B2셀들에 B2들의 총합을 구해야하는 숫자가 있습니다. 이 각 엑셀파일들의 A1셀들, B1셀들의 합을 새로운 엑셀파일에 입력해놓고 싶습니다. 엑셀 파일이 많아서 한꺼번에 하고 싶은데... 가장 효율적으로 하는 방법은 무엇일까요?
댓글에는 vba, python openpyxl 라이브러리, Uipath등을 이용하는 방법들이 소개되었는데, 지금까지의 제 경험으로는 python Pandas 라이브러리를 이용하는 것이 유사한 여러 시나리오들에 가장 효율적일 것이라는 생각이 듭니다.
openpyxl을 이용하는 방법과 유사하지만(실제로 Pandas를 사용하면 openpyxl 설치를 요구할 것입니다.), Pandas의 경우 막강한 데이터프레임 지원 메소드들을 사용할 수 있기 때문인데요. 아래의 간단한 코드를 통해 이를 살짝 엿보도록 하겠습니다.
from os import walk
import Pandas as pd
xlsx_files = []
for (dir_path, dir_names, file_names) in walk('C:/...'):
xlsx_files.extend(file_names)
# Row 0, Col 0~1만 특정하고 싶다면 pd.read_excel(xlsx_file).iloc[0, :1]
sum([pd.read_excel(xlsx_file) for xlsx_file in xlsx_files]).to_excel('Result.xlsx')
2
3
4
5
6
7
8
9
만약 전체 템플릿에 노이즈가 많아 특정 범위를 잘라내야 한다면 주석 처리된 부분처럼 사용하면 될 것 같습니다. 실제로 여러 사람들에 의해 작성된 단일 템플릿들을 취합하다 보면 임의의 셀에 간단한 메모나 계산 등을 작성해놓은 경우가 많습니다.
또한 임의의 위치의 특정 한두개 셀만 필요하다면 굳이 Pandas 사용으로 인한 오버헤드 코스트 없이 openpyxl로만 코드를 작성하는 것이 더 나을 수도 있을 것입니다.
참고로 데이터가 너무 커서 메모리 오류가 나거나 클러스터 자원을 활용해서 병렬처리의 이점을 사용하시고 싶으시다면 Pandas와 궁합이 아주 좋은 Dask 라이브러리를 추천드립니다. 저는 실무에서 자주 사용하는데 매우 만족합니다.
다음 번에 기회가 되면 dask 라이브러리 뿐만 아니라 Uipath, Automation Anywhere와 같은 RPA 툴에 대해서도 관련 글을 꼭 작성해보도록 하겠습니다.