Programming/Python

[python-pptx] 파이썬을 이용한 파워포인트 차트 수정

minarae7 2023. 4. 17. 23:09
728x90
반응형

프로그램 코드를 통해서 파워포인트 파일을 수정해야할 일이 생겨서 자료를 찾아보니 python에서는 python-pptx라는 모듈을 활용하는 것을 찾았다.

늘 마찬가지로 내용을 잊어먹기 전에 포스팅으로 정리해두도록 한다.

이번에 할 일은 2장 짜리 pptx 파일에서 2번째 슬라이드에 막대 그래프의 값을 변경하는 것이다.

슬라이드는 다음과 같이 생겼다.

수정할 슬라이드

여기서에서 연도별 수익으로 표기된 부분의 y-axis 인덱스 이름과 각 표기된 값을 수정하는 코드를 작성할 것이다.

먼저 pptx라는 모듈을 설치하도록 한다.

728x90
% pip install python-pptx

설치할 때 모듈의 이름은 python-pptx이다.

이제 코드를 작성하도록 한다. 파일 이름은 test.pptx로 하였다. 우선 파일을 읽어들이는 부분을 작성한다.

from pptx import Presentation

# pptx 파일 열기
ppt = Presentation('test.pptx')

모듈을 로딩하고 수정할 파일을 읽어들이는 작업을 한다. 위의 코드에서 Presentation을 선언할 때 파일 이름을 주지 않으면 새 파일을 생성하게 된다.

여기서는 기존 파일을 수정하는 것을 목적으로 하고 있기 때문에 파일 이름을 지정하였다.

이제 로딩한 파일에서 수정할 슬라이드를 찾는다.

그리고 테스트로 해당 슬라이드의 제목 줄의 내용을 수정해보았다.

728x90
# 두 번째 슬라이드의 제목 변경
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로 되어있어서 직접 수정할 수 없다.

새로운 데이터 변수를 선언하고 해당 값으로 대체해주는 코드로 작성하여야 한다.

그럼 코드는 아래와 같이 작성할 수 있다.

728x90
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 코드이다.

728x90
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')

앞으로 파워포인트 파일을 수정할 일이 계속 있을 예정이다.

해당 내용을 계속 추가적으로 정리해보도록 하겠다.

728x90
반응형