회사에서 일하면서 엑셀에서 차트를 하나씩 그리고(일종의 대시보드를 만들어서) 이걸 일일이 pdf로 저장할 때가 있었다. 이걸 언제 손으로 해. 그래서 이번에도 역시 파이썬을 이용해서 자동화 해보았다. 그리고 코드 짜놓은 게 아까워서 간략히 기록차 남겨 놓는다.
아, 윈도우 기준!
준비
우선 pywin32라는 파이썬 패키지를 설치해야 한다. 이건 윈도우에서 돌아가는 애플리케이션(프로그램)들을 파이썬이 제어할 수 있도록 구현해놓은 거라 생각하면 편하다. 어려우니 너무 깊게 가진 말자. 나도 잘 모른다.
이걸 pip에 인스톨 하려면 pip install pywin32
, 아나콘다 통해서 conda 인스톨 하려면 conda install -c anaconda pywin32
와 같이 적어주면 된다. 자세한 내용은 아래 홈페이지 참고.
- 공식 홈페이지(github) : https://anaconda.org/anaconda/pywin32
- 아나콘다: https://anaconda.org/anaconda/pywin32
준비 끝.
기본 사용법 익히기
pywin32 패키지는 용례가 끝이 없기 때문에 (이걸로 뭐 윈도우 상에서 엑셀 뿐만 아니라 워드나 파워포인트도 다룰 수 있고, 익스플로러 같은 브라우저도 다룰 수 있으므로) 애초에 하기로 한 엑셀 시트 pdf 저장 기능만 익혀보자.
예를 들어 바탕화면에 있는 ex.xlsx라는 엑셀 파일에 각각 data, chart라는 이름을 가진 시트 2개가 있을 때 chart 시트를 선택하고 pdf로 저장하는 작업을 코드로 짜본다면 이렇게 된다.
# 패키지 불러오기 import win32com.client # 엑셀 애플리케이션 준비 excel = win32com.client.Dispatch("Excel.Application") # 윈도우 화면에 띄울지, 아니면 백그라운드에서 돌릴지 선택 # 테스트를 위해 True로 해서 직접 엑셀이 돌아가는 걸 눈으로 확인하자 excel.Visible = True # 엑셀파일(워크북) 열기 # 절대경로 입력! wb = excel.Workbooks.Open("C:\\Users\\사용자명\\desktop\\ex.xlsx") # 각 시트를 변수에 할당 ws_data = wb.Worksheets("data") ws_chart = wb.Worksheets("chart") # chart 시트 선택 ws_chart.Select() # pdf 저장경로, 파일명 pdf_path = "C:\\Users\\사용자명\\desktop\\ex.pdf" # pdf 저장 wb.ActiveSheet.ExportAsFixedFormat(0, pdf_path) # 워크북 종료 (저장하려면 True) wb.Close(False) # 엑셀 애플리케이션 종료 excel.Quit()
스크립트 다 짜놓고 실행하는 것보다는 주피터 노트북 같은 걸로 한 스텝씩 실행해보면서 실제로 이게 잘 동작하는지 보면 한 눈에 이해가 간다. 신기함!
참고로 pdf 저장하기 전에는 엑셀의 [보기] 탭에서 [페이지 나누기 미리보기]를 눌러 pdf로 저장될 영역이 어딘지 미리 확인하고, 원하는 범위로 조정을 해주는 게 좋다.
반복문을 활용해 수많은 pdf 파일 생성하기
예를 들어 아래와 같이 data 시트에는 각 사람들의 데이터가 들어 있고,

chart 시트에서는 한 명씩 데이터를 불러와 차트로 그려 저장한다고 해보자.

2행1열(A2셀)에 번호만 입력해주면 오른 쪽 값들은 vlookup 함수를 사용해서 자동으로 불러오도록 미리 엑셀을 짜놓았다. 아무튼.
이걸 반복문을 돌면서 하려면 아래와 같이 코드를 짜면 되겠다.
import win32com.client import time excel = win32com.client.Dispatch("Excel.Application") excel.Visible = True wb = excel.Workbooks.Open("C:\\Users\\사용자명\\desktop\\ex.xlsx") ws_data = wb.Worksheets("data") ws_chart = wb.Worksheets("chart") # chart 시트 선택 ws_chart.Select() time.sleep(0.5) # 1~4 출력번호 반복문 for n in range(1,5): # 출력 번호 2행1열에 입력 ws_chart.Cells(2, 1).Value = n # 2행2열 값을 name 변수에 저장 name = ws_chart.Cells(2, 2).Value # pdf 저장경로, 파일명 pdf_path = "C:\\Users\\사용자명\\desktop\\{}{}.pdf".format(str(n), name) # pdf 저장 wb.ActiveSheet.ExportAsFixedFormat(0, pdf_path) time.sleep(1) wb.Close(False) excel.Quit()
해당 경로(여기서는 바탕화면)에 1배트맨.pdf
부터 4아이언맨.pdf
까지 네 개의 pdf 파일이 잘 저장되면 성공!
역시 파이썬이 최고야.