728x90
win32com
은 Microsoft Windows OS가 제공하는 API이다. 이를 사용해 MS word, Power Point, Excel, Outlook 등 microsoft office의 제품들 다룰 수 있다. excel, ppt 파일을 더 쉽게 다룰 수 있도록 만들어진 여러 라이브러리들이 있지만, 환경에 따라 사용할 수 없는 라이브러리들이 있는 것 같다. python-pptx
를 이용해 사내에서 업무 자동화 프로그램을 개발하려고 했으나 저장되어있는 pptx 파일을 불러오지 못하는 오류가 있어 win32com
를 사용하게 되었다.
PPT에 있는 데이터에 접근하기
지금까지 필요한 기능들은 pptx 파일에 저장된 데이터를 읽어 활용하는 것이라 원하는 데이터를 어떻게 받아올 수 있을지에 대한 고민을 정리한다. excel은 table 형태로 정형화 되어 있기 때문에 행과 열의 정보로 원하는 데이터에 접근할 수 있지만 ppt는 데이터를 슬라이드 영역 내에 자유롭게 배치할 수 있고 text box, table, 이미지, 도형 등 여러 가지 객체가 존재한다. 이 때문에 원하는 데이터에 접근하는 것 부터 어려움이 있었다.
PPT 파일의 구조
- pptx 파일은 하나의
presentation
안에 여러 개의 slide를 가지고 있다. 그리고 각 slide에 존재하는 text box, 이미지, table 등의 객체는 shape이라고 부른다. - pptx 파일에서 어떤 작업을 수행하고자 할 때는 1) pptx 파일 열기 2) target slide에 접근 3) target shape에 접근 순으로 진행한다.
- 이 때, 1) 원하는 파일에 접근은 파일명으로 접근할 수 있고, 2) target slide는 slide 번호로 접근할 수 있지만 3) target shape에 접근하는 것이 문제이다. 각각의 shape마다 데이터에 접근하는 과정이 다르기 때문에 target shape의 종류를 아는 것까지 필요하다.
예제 코드
- slide 마다 무질서하게 존재하는 것 처럼 보이는 shape이지만, 생성될 때 일정한 규칙에 의해 정의되는
Name
attribute를 가지고 있다. - Name은 shape의 종류 + 생성된 순서로 구성되어 python 스크립트에서 접근한 shape의 종류를 확인할 수 있다. 만약 동일한 template를 만들어 활용한다면 template 내의 각 shape에 접근할 수 있는 이름을 부여해 쉽게 접근할 수 있도록 할 수 있다.
- 아래 예시는 pptx 파일을 열어 프리젠테이션 내에 존재하는 모든 shape의 정보를 출력하는 예시이다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import win32com.client | |
# 1. ppt file 열기 | |
ppt = win32com.client.Dispatch′PowerPoint.Application′ | |
ppt.Visible = True | |
presentation = ppt.Presentations.Open′pptxdirectiory′ | |
# 2. ppt slide를 순회하며 shape에 접근 | |
print′\nAs−is−−−′ | |
for slide in presentation.Slides: # presentation.Slides는 presentation 내에 장표들 | |
for shape in slide.Shapes: # slide.Shapes는 slide 내 shape들 | |
printslide.Name,shape.Name | |
print″ | |
# 3. ppt 요소의 이름 설정 | |
## Slides, Shapes는 순서나 Name attribute로 접근한다. | |
presentation.Slides1.Name = 'Cover' # 첫 번째 slide의 Name을 Cover로 지정 | |
presentation.Slides′Cover′.Shapes1.Name = 'Cover title' # Cover side의 첫번째 shape의 Name을 Cover title로 지정 | |
presentation.Slides′Cover′.Shapes2.Name = 'Cover subtitle' # Cover side의 첫번째 shape의 Name을 Cover subtitle로 지정 | |
# 4. ppt slide를 순회하며 수정 사항 확인 | |
print′\nRevised−−−′ | |
for slide in presentation.Slides: # presentation.Slides는 presentation 내에 장표들 | |
for shape in slide.Shapes: # slide.Shapes는 slide 내 shape들 | |
printslide.Name,shape.Name | |

'프로그래밍 언어 > python' 카테고리의 다른 글
[python의 쓸모] 5가지 유명한 Application: Web 개발부터 AI까지 0 | 2023.02.27 |
---|---|
[win32com] python으로 pptx 파일 다루기2 - PPT 요소에 있는 데이터 접근하기 0 | 2022.10.23 |
[xlwings] 파이썬으로 excel 파일 다루기 2 여러 개의 파일과 시트 다루기 0 | 2022.10.04 |
[xlwings] 파이썬으로 excel 파일 다루기 1 quick start 0 | 2022.09.28 |
[python] 객체 지향 프로그래밍 1 - Object oriented python 0 | 2022.08.08 |