프로그램 코드를 통해서 파워포인트 파일을 수정해야할 일이 생겨서 자료를 찾아보니 python에서는 python-pptx라는 모듈을 활용하는 것을 찾았다.
늘 마찬가지로 내용을 잊어먹기 전에 포스팅으로 정리해두도록 한다.
이번에 할 일은 2장 짜리 pptx 파일에서 2번째 슬라이드에 막대 그래프의 값을 변경하는 것이다.
슬라이드는 다음과 같이 생겼다.
여기서에서 연도별 수익으로 표기된 부분의 y-axis 인덱스 이름과 각 표기된 값을 수정하는 코드를 작성할 것이다.
먼저 pptx라는 모듈을 설치하도록 한다.
% pip install python-pptx
설치할 때 모듈의 이름은 python-pptx이다.
이제 코드를 작성하도록 한다. 파일 이름은 test.pptx로 하였다. 우선 파일을 읽어들이는 부분을 작성한다.
from pptx import Presentation
# pptx 파일 열기
ppt = Presentation('test.pptx')
모듈을 로딩하고 수정할 파일을 읽어들이는 작업을 한다. 위의 코드에서 Presentation을 선언할 때 파일 이름을 주지 않으면 새 파일을 생성하게 된다.
여기서는 기존 파일을 수정하는 것을 목적으로 하고 있기 때문에 파일 이름을 지정하였다.
이제 로딩한 파일에서 수정할 슬라이드를 찾는다.
그리고 테스트로 해당 슬라이드의 제목 줄의 내용을 수정해보았다.
# 두 번째 슬라이드의 제목 변경
slide = ppt.slides[1]
title = slide.shapes.title
title.text = '슬라이드 제목 변경'
아주 기초적인 내용이지만 슬라이드를 찾을 때도 1부터 찾는 것이 아니고 0부터 찾는다. python에서는 이것을 리스트로 지정한다.
따라서 첫 슬라이드 인덱스 값은 0이다. 여기서는 두 번째 슬라이드를 찾는 것이기 때문에 1로 지정하였다.
슬라이드에서 포함되어있는 제목을 찾아서 "슬라이드 제목 변경"으로 텍스트를 수정하였다.
아마도 제목 줄은 특별한 객체여서 이렇게 지정할 수 있는듯 하다.
이제 코드로 해당 슬라이드에 포함된 shapes 객체를 순차적으로 검색해서 차트가 어떤 것이 찾아보도록 한다.
# 슬라이드에서 차트를 찾기 위해 모든 Shape 객체를 확인
for shape in slide.shapes:
print(shape)
이 파일에서 이렇게 순차적으로 돌려보면 아래 그림과 같이 실행 결과가 나온다.
여기서 우리는 Chart를 찾으면 된다. 검색을 통해서 찾아보니 각 shape에는 shape_type이라는 속성을 가지고 있고 여기서 수정할 chart라는 shape_type은 3이라는 것을 알 수 있었다. 이건 위 코드에서 print(shape, shape.shape_type) 이렇게 해서 찍어보면 알 수 있다.
그럼 코드를 이렇게 수정할 수 있다.
# 슬라이드에서 차트를 찾기 위해 모든 Shape 객체를 확인
for shape in slide.shapes:
print(shape)
if shape.shape_type == 3: # 차트는 shape_type 11에 해당
print(shape.chart)
chart = shape.chart
슬라이드 안에서 수정할 shape를 찾아서 해당 shape가 가지고 있는 chart 속성을 chart라는 변수에 담아두었다.
여기서 코드로 chart 안에 있는 값을 직접 수정하려고 하였더니 해당 변수들은 tuple로 되어있어서 직접 수정할 수 없다.
새로운 데이터 변수를 선언하고 해당 값으로 대체해주는 코드로 작성하여야 한다.
그럼 코드는 아래와 같이 작성할 수 있다.
from pptx.chart.data import ChartData
# 슬라이드에서 차트를 찾기 위해 모든 Shape 객체를 확인
for shape in slide.shapes:
if shape.shape_type == 3: # 차트는 shape_type 3에 해당
chart = shape.chart
# 새로운 차트 데이터 생성
chart_data = ChartData()
chart_data.categories = ['2020년', '2021년', '2022년', '2023년']
chart_data.add_series('Series 1', (10000.0, 23000.0, 34000.0, 23000.0))
# 새로 정의한 chart_data로 대체
chart.replace_data(chart_data)
categories를 새로 선언해서 y-axis에 표기될 값을 수정하였고 차트에 포함될 데이터를 수정하였다.
그리고 마지막으로 chart 데이터를 교체해주었다.
이제 수정한 내용을 저장하여야 한다.
저장하는 코드는 다음과 같다.
# pptx 파일 저장
ppt.save('example_edited.pptx')
이제 새로운 파일 이름으로 저장하였다.
해당 파일에 실행하고 나면 다음 그림에서 해당 내용이 수정된 것을 확인할 수 있다.
다음의 위 코드를 정리한 전체 python 코드이다.
from pptx import Presentation
from pptx.chart.data import ChartData
# pptx 파일 열기
ppt = Presentation('test.pptx')
# 두 번째 슬라이드의 제목 변경
slide = ppt.slides[1]
title = slide.shapes.title
title.text = '슬라이드 제목 변경'
# 슬라이드에서 차트를 찾기 위해 모든 Shape 객체를 확인
for shape in slide.shapes:
if shape.shape_type == 3: # 차트는 shape_type 3에 해당
chart = shape.chart
# 새로운 차트 데이터 생성
chart_data = ChartData()
chart_data.categories = ['2020년', '2021년', '2022년', '2023년']
chart_data.add_series('Series 1', (10000.0, 23000.0, 34000.0, 23000.0))
# 새로 정의한 chart_data로 대체
chart.replace_data(chart_data)
# pptx 파일 저장
ppt.save('example_edited.pptx')
앞으로 파워포인트 파일을 수정할 일이 계속 있을 예정이다.
해당 내용을 계속 추가적으로 정리해보도록 하겠다.
'Programming > Python' 카테고리의 다른 글
Sqlalchemy를 통한 postgresql timezone 설정 (0) | 2023.05.08 |
---|---|
[python] Dictionary (0) | 2023.03.29 |
[sqlalchemy] Postgresql Query ORM 변환 (0) | 2023.03.22 |
[Python] Mac에서 개발 환경 구축 (0) | 2023.02.03 |
[fastapi] Pydantic Model을 Request Form 데이터로 받기 (0) | 2023.01.31 |