엑셀을 자동화하고나니 이제 파워포인트도 손쉽게 만들고 싶어져 찾아봤더니 python-pptx라는 라이브러리가 있었다.
엑셀만큼 모든 기능을 다 만들기는 무리가 있어보이지만 반복적인 파일을 만들어내는데는 유용해서나중에 써먹을 일이 많을 것 같아 사용법을 정리해두었다.
공식 레퍼런스: https://python-pptx.readthedocs.io/en/latest/#
python-pptx 라이브러리는 open office xml 로 파이썬 코드를 번역해주는 형태기 때문에 OOXML을 조금 이해한다면 더 잘 사용할 수 있다.
OOXML 레퍼런스: http://officeopenxml.com/
기본 사용법
from pptx import Presentation
from pptx.util import Cm
prs=Presentation()
layout=prs.slide_layouts[6] # 빈 슬라이드 레이아웃
slide=prs.slides.add_slide(layout) # 빈 슬라이드 레이아웃을 가진 슬라이드 1장 추가
# A4 크기로 조정
prs.slide_width=Cm(27.51)
prs.slide_height=Cm(19.05)
prs.save('test.pptx')
먼저 Presentation()
객체를 만들고 나면 하나의 파워포인트 파일이 만들어진다고 생각하면 된다.
Prs 객체는 SlideMasters
를 가지고 있는데 ppt에서 보기-슬라이드마스터를 누르면 보이는 그 화면을 떠올리면 쉽게 이해할 수 있다.
한 파일에 여러 개의 슬라이드마스터를 만들 수 있고 슬라이드마스터별로 레이아웃을 다르게 할 수 있는 것처럼 Presentation()
으로 생성된 객체도 그렇다고 생각하면 된다.
아무런 서식없이 처음 ppt를 켜면 기본 슬라이드 마스터와 기본 레이아웃들이 있는데 그게 prs.slide_master
와 prs.slide_layouts
이다.
각각의 레이아웃은 빈 파워포인트를 만들었을 때 보이는 순서와 같다.
주의할 점은 openpyxl과 다르게 첫 인덱스가 0이다. [빈 화면 레이아웃]은 7번째 레이아웃이므로 prs.slide_layouts[6]
으로 지정했다.
크기 조정은 prs.slide_height
, prs.slide_width
로 가능하다.
도형 및 텍스트 상자 추가하기
from pptx import Presentation
from pptx.util import Cm, Pt
from pptx.enum.shapes import MSO_SHAPE
from pptx.dml.color. import RGBColor
# presentation객체와 slide 추가 후
shapes=slide.shapes
# 사각형 추가하기
rec=shapes.add_shape(MSO_SHAPE.RECTANGLE, CM(1), Cm(1), Cm(20), CM(10))
# 채우기
rec.fill.solid()
# 채우기 색상
rec.fill.fore_color.rgb=RGBColor(255,0,0)
# 그림자 제거
rec.shadow.inherit=False
# 텍스트 상자
text_box=shapes.add_textbox(Cm(1), Cm(2.5), Cm(20), Cm(1))
text_box.text='test'
# 폰트 설정
text_box.text_frame.paragraphs[0].font.name='궁서체'
text_box.text_frame.paragraphs[0].font.bold=True
text_box.text_frame.paragraphs[0].font.size=Pt(11)
MSO_SHAPE
을 이용하면 ppt 도형들을 삽입할 수 있다.
add_shape()
함수를 사용하여 도형의 가로 위치, 세로 위치, 너비, 높이 를 정할 수 있다.
색상은 RGB값을 사용하므로 그림판이든 ppt에서든 원하는 색상의 RGB값을 입력해주면 된다.
처음 도형을 삽입하면 그림자가 포함되어 있을 수 있으므로 그림자가 필요없다면 shadow.inherit=False
로 설정할 수 있다.
텍스트 상자도 일반 도형과 유사하지만 문단 단위로 폰트 설정을 바꿀 수 있다.
(그래서 paragraphs[0]
로 접근)
테이블 다루기
테이블도 다른 객체와 마찬가지로 slide
의 shapes
에 추가해주면 된다.
ppt에서 기본 테이블을 삽입하게 되면 테이블 스타일이 적용되어 있는데 이 스타일을 바꿔주는 게 상당히 귀찮다. 먼저 기본으로 적용되어 있는 테이블 스타일을 제거하고 다시 원하는 스타일을 달아줘야 하는데 이걸 전부 OOXML로 바꿔야 한다. (라이브러리 지원함수 없음)
익숙하지 않은 XML 형태로 표현하자면 삽입한 테이블의 tbrPr
이라는 태그를 전부 지우고 원하는 스타일의 태그를 새로 만들어서 tbrPr
아래에 붙이면 된다.
from pptx import Presentation
from pptx.util import Cm, Pt
from pptx.enum.shapes import MSO_SHAPE
from pptx.enum.text import MSO_AUTO_SIZE, PP_ALIGN, MSO_ANCHOR
from pptx.oxml.xmlchemy import OxmlElement
# 새로운 태그 만드는 함수 (OOXML 하위 태그 만들기)
def SubElement(parent, tagname, **kwargs):
element=OxmlElement(tagname)
element.attrib.update(kwargs)
parent.append(element)
return element
# table cell별 폰트, 색상 등등 적용하는 함수
def cell_text(cell, content, font, size, color, bold):
cell.text=content
# 셀 여백 설정
cell.margin_left=0
cell.margin_right=0
cell.margin_top=0
cell.margin_bottom=0
cell.vertical_anchor=MSO_ANCHOR.MIDDLE # 세로 가운데 정렬
# 셀 안의 텍스트가 줄바꿈 등이 되어있을 수 있으므로 반복문
for i in range(len(cell.text_frame.paragraphs)):
cell.text_frame.paragraphs[i].font.name=font
cell.text_frame.paragraphs[i].font.size=Pt(size)
cell.text_frame.paragraphs[i].alignment=PP_ALIGN.CENTER # 가운데 정렬
# 셀 크기에 맞게 자동조정
cell.text_frame.paragraphs[i].auto_size=MSO_AUTO_SIZE.TEXT_TO_FIT_SHAPE
# 폰트 색상
cell.text_frame.paragraphs[i].font.color.rgb=color
# 볼드체 설정
cell.text_frame.paragraphs[i].font.bold=bold
return cell
# 셀 색상 채우기
def cell_fill(cell, color):
cell.fill.solid()
cell.fill.fore_color.rgb=color
return cell
위의 함수들은 테이블 속성이나 셀 속성을 조절하기 위한 함수들이다.
아래 코드로 실제 테이블을 만들고 적용할 수 있다.
from pptx import Presentation
from pptx.util import Cm, Pt
from pptx.enum.shapes import MSO_SHAPE
from pptx.enum.text import MSO_AUTO_SIZE, PP_ALIGN, MSO_ANCHOR
from pptx.oxml.xmlchemy import OxmlElement
# presentation객체와 slide 추가 후
shapes=slide.shapes
# 테이블 생성 (5X5 짜리 테이블 생성)
table=shapes.add_table(5, 5, Cm(1), Cm(1), Cm(20), Cm(10))
table=table.table
# 테이블 스타일 설정 ("스타일 없음, 표 눈금" 으로 설정)
tbl=table._tbl
tblpr=tbl.get_or_add_tblPr()
tblpr.remove_all('a:tableStyleId')
tblstyle=SubElement(tblpr, 'a:tblStyle', styleid='{5940675A-B579-460E-94D1-54222C63F5DA}', styleName='No Style, Table Grid')
add_table
함수는 (행길이, 열길이, 가로위치, 세로위치, 너비, 높이)를 입력해주면 된다.
테이블 스타일은 ppt에서 디자인-표 스타일 에서 보이는 스타일들인데 코드에 있는 스타일 외에 다른 스타일을 적용하고 싶다면…열심히 검색을 해보자
셀 병합
cell=table.cell(0,0) # 기준이 되는 셀
cell.merge(table.cell(1,1)) # 병합할 셀 범위
위 코드는 (0,0), (0,1), (1,0), (1,1) 네 개의 셀을 병합하는 코드이다.
더 많은 셀을 병합하고 싶다면 merge
내에 원하는 끝 셀을 입력해주면 된다.
행, 열 높이나 너비를 변경하기
엑셀이나 파워포인트의 표의 높이나 너비는 하나만 변경해도 해당 행(높이), 해당 열(너비)에 모두 적용되므로 행단위, 열단위로 변경할 수 있다.
# 행높이 설정
for i in range(5): # range 안에 삽입한 테이블 행길이
table.rows[i].height=Cm(0.7)
# 열너비 설정
for i in range(5): # 테이블 열길이 입력
table.columns[i].width=Cm(1.2)
이제 앞서 만든 함수를 활용하여 셀 별로 내용을 넣고 셀 스타일을 적용해보자.
for i in range(5):
for j in range(5):
cell=table.cell(i, j)
# 셀 내용 입력 (cell, content, font, size, color, bold)
cell=cell_text(cell, content=f'({i}, {j})', font='궁서체', size=7,
color=RGBColor(255,255,255), bold=False)
# 셀 채우기 (노란색)
cell=table.cell(2,2)
cell=cell_fill(cell, RGBColor(255,255,0))
마무리
만들어진 파일의 저장은 prs.save(file_name.pptx)
로 할 수 있다.
슬라이드 마스터에서 도형을 삽입하고 싶어서 별의별 짓을 다해봤는데 결국 실패했다.
XML에 대한 이해가 부족하거나 지원하지 않거나 둘 중 하나인 듯하다.
만약 회사에서 쓰는 양식 테마에 도형이 들어가있다면 그걸 만들 생각은 안하는게 좋을 듯.
Uploaded by N2T
'기타' 카테고리의 다른 글
Bigquery 에서 반복문 사용법 (0) | 2024.10.08 |
---|---|
Bigquery PK 지정 방법 (2) | 2024.09.25 |
openpyxl 사용법 정리 (0) | 2023.04.27 |