2025. 2. 2. 20:30ㆍIT
파워포인트에서 편지지 모양을 만듭니다.
아래와 같이 만들어진 파워포인트 파일에서 받는 사람 영역에 출력을 하기 위해서는 파이썬이 어디가 받는 사람을 출력할 곳이고, 어디가 주소를 입력할 곳이고 어디가 우편번호를 출력할 곳인지 알 수 있어야 합니다.
파이썬에서는 변수라는 것을 이용해서 값들을 저장하듯이 파워포인트에 우리가 추가한 각각의 텍스트 박스들도 이름을 가지고 있어야 접근을 할 수 있습니다. 각 텍스트 박스나 문자를 출력할 도형에 이름을 부여해야 합니다. 이름을 부여하기 위해서는 홈 → 선택 → 선택 창을 선택하면 다음의 그림과 같이 파워포인트 우측에 도형, 텍스트 박스 등이 나타납니다. 여기서 우리는 이름을 입력할 텍스트 박스에 name이란 이름을 주소를 출력할 텍스트 박스에 address라는 이름을 부여했습니다. 마지막으로 우편번호는 작은 박스 5개로 이루어져 있으므로 숫자를 각각 출력해야 합니다. 그래서 우편번호 박스의 이름을 좌측부터 각각 pCode1에서 pCode5까지 지정을 해 줬습니다.
편지봉투에 주소록을 이용해 받는 사람과 주소, 우편번호를 출력하기 이전에 선언해 놓은 name, address 그리고 pCode1에서 pCode5까지 어떻게 파이썬으로 접근을 할 수 있는지를 보는 것이 중요합니다. 그래야 새로운 값으로 출력을 할 수 있으니까요.
034_printPPTX.py
import collections
import collections.abc
from pptx import Presentation
collections와 collections.abc는 Presentation에서 사용하는 패키지로 파이썬에 내장된 기본 패키지입니다. 그리고 파워포인트를 파이썬에서 사용하기 위한 패키지 pptx에서 Presentation을 import 하고 있습니다. 이 패키지를 설치하기 위해서는 다음과 같이 터미널 창에 입력해 주시면 됩니다.
pip install python-pptx
python-pptx의 자세한 내용은 python-pptx에서 제공하는 공식 웹 페이지를 통해서 볼 수 있습니다.
https://python-pptx.readthedocs.io/en/latest/user/quickstart.html
prs = Presentation(r".\files\mail.pptx")
slide = prs.slides[0]
Presentation 클래스에 만들어 놓은 파워포인트 파일의 경로를 입력해서 초기화를 해 줍니다. 따라서 prs는 파워포인트 파일 자체를 가리키게 됩니다. 두번째 줄에서는 slide 변수에 첫번째 슬라이드를 가리키도록 해 줍니다. 프로그래밍에서는 0부터 시작하므로 slides[0]은 첫번째 슬라이드를 가리키는 것입니다. 여러분께서는 슬라이드가 여러장 있는 파일을 이용해서 slides에 다른 번호를 넣어 테스트를 할 수 있습니다.
shape_list = slide.shapes
shape_idx = {}
slide는 우리가 만든 파워포인트 파일의 첫번째 슬라이드의 모든 콘텐츠들을 shapes라는 Presentation의 변수를 통해서 모두 읽어 옵니다. 해당 페이지에 있는 모든 요소들의 값을 읽어옵니다. 읽어온 파워포인트 슬라이드에는 다양한 구성요소가 들어 있습니다. 각각의 구성요소는 폰트 종류, 크기, 텍스트, 색상 등 다양한 정보를 가지고 있을 것입니다. 이 정보들을 모두 shape_list라는 변수에 저장을 하였습니다.
다음은 shape_idx가 정의되어 있습니다. [ ]로 정의가 될 때는 리스트라는 것으로 여러 개의 정보를 콤마로 분리해서 저장을 하고 있었습니다. 이번에는 { }, 중괄호 입니다. 중괄호를 통해서 선언이 되는 변수타입은 ‘딕셔너리’입니다. 말 그대로 사전이라는 의미죠. 사전이 어떻게 사용이 되는지 보겠습니다. 다음은 딕셔너리의 예입니다.
dic = {“홍길동” : “010-1234-8657”, “김갑동” : “02-9384-2922”, “박문수” : “010-3432-9405”}
딕셔너리 내의 값들은 콤마로 구분이 됩니다. 따라서 위의 dic이라는 딕셔너리에 들어 있는 요소의 개수는 총 3개 입니다. 그리고 각 딕셔너리의 요소는 “키 : 값” 형태로 되어 있습니다. 첫번째 요소의 키는 “홍길동”이고 값은 “010-1234-8657”이 되는 것입니다. “홍길동”, “김갑동”, “박문수”가 키이며, 그에 대응되는 값들이 각각의 전화번호입니다. 딕셔너리라는 이름과 같이 키를 가지고 해당 요소를 찾을 수 있으며 키를 가지고 값을 찾는 방법은 다음과 같습니다.
value = dic[“박문수”]
없는 키 값으로 위와 같이 코딩을 하면 어떻게 될까요? 실행할 때 에러가 발생하고 맙니다. 따라서 찾으려는 키가 딕셔너리에 있는지 먼저 확인이 필요합니다. 키를 찾아보기 위해서는 in 이라는 것으로 먼저 확인을 할 수 있습니다.
“박문수” in dic
위와 같이 입력을 하면 True라는 값을 반환합니다. 다음과 같이 값을 변수로 받아서 코딩에서 사용을 할 수 있습니다. 다음의 경우는 True를 반환하게 됩니다. 만약에 “박문수” 대신 “소혜민”을 입력한다면 어떻게 될까요? 그럴 경우엔 False를 반환합니다.
val = “박문수” in dic
다시 우리의 코드로 돌아와서 두 번째 줄을 보면 shape_list를 딕셔너리 형태로 변수를 만들었습니다.
for idx, value in enumerate(shape_list):
print(idx, value.name)
shape_idx[value.name] = idx
print(shape_idx)
이 코드는 for문을 이용해서 앞에서 만든 딕셔너리 shape_idx에 데이터를 넣는 부분입니다.
먼저 처음보는 enumerate() 함수가 보입니다. 이 함수는 순서와 값들을 하나씩 꺼내주는 역할을 합니다. 코드를 간단하게 사용하기 위해서 이 함수를 사용합니다. 이 for문에서 idx는 0부터 1씩 증가를 하게 되고 shape_list의 구성요소가 처음부터 순서대로 value에 담기게 됩니다.
파워포인트에서 가지고 온 모든 구성요소를 담고 있는 shape_list에서 구성요소의 이름과 순서(idx)를 조합해서 딕셔너리를 만드는 것입니다. 실행을 시켜보면 idx와 value.name을 출력하는 print() 함수가 출력하는 내용을 보면 이해가 될 것입니다. 그리고 다음 부분은 딕셔너리에 정보를 넣는 과정입니다. 키를 [ ]안에 넣고 값, idx를 넣어주면 됩니다.
shape_idx[value.name] = idx
마지막에 있는 print() 함수에서 출력을 한 shape_idx를 보면 어떻게 딕셔너리가 만들어졌는지를 알 수 있습니다.
{'사각형: 둥근 모서리 1': 0, '직사각형 5': 1, 'TextBox 12': 2, 'TextBox 13': 3, 'TextBox 14': 4, '직사각형 15': 5, '직사각형 16': 6, '직사각형 17': 7, '직사각형 18': 8, '직사각형 19': 9, 'name': 10, 'address': 11, 'pCode1': 12, 'pCode2': 13, 'pCode3': 14, 'pCode4': 15, 'pCode5': 16}
값이 10번에서 16번까지가 우리가 이름을 부여한 name, address, pCode1에서 pCode5까지가 모두 담겨 있는 것을 볼 수 있습니다. 이렇게 딕셔너리를 만든 이유는 무엇일까요?
편지지가 담겨있는 파워포인트 파일에는 여러가지가 들어 있습니다. 앞서 출력해 본 shape_idx와 같이 ‘사각형: 둥근 모서리’, ‘직사각형 5’ 등이 우리가 만든 순서대로 들어 있습니다. 즉, 굴비를 엮듯이 우리가 마우스로 클릭해서 사각형을 하나 만들면 첫 굴비를 엮을 때 사각형을 넣고, 다시 마우스로 원을 클릭해서 파워포인트에 추가를 하면 처음 엮은 사각형 다음에 원을 넣는 식으로 파워포인트에 여러가지 정보를 추가하는 것입니다. 여기서 중요한 것이 순서입니다.
파워포인트 파일을 만들고 주소나 이름이 들어갈 곳에 이름을 정해준 바 있습니다. 하지만 파이썬에서 이 이름을 가지고서는 제어를 할 수 없고 파워포인트 한 페이지 내에서 몇 번째 요소인지가 중요합니다. 그 몇 번째인지를 파악하기 위해서 딕셔너리에 순서를 저장해 둔 것입니다. 한번 확인해 보겠습니다. 터미널 창에 출력된 shape_idx에서 키 ‘name’의 값은 10입니다. 이 10이라는 값이 중요한데 파워포인트의 페이지에서 10번째의 요소가 이름을 출력하기 위해서 파워포인트에서 이름을 준 ‘name’이라는 것을 알 수 있습니다.
추가로 enumerate()에 대해서 살펴보도록 하겠습니다. 가끔은 왜 이렇게 어렵게 사용하나 싶지만 배워 놓고 나면 다른 방식을 잘 쓰지 않게되죠. 다음을 보면 enumerate() 함수를 사용한 것과 사용하지 않고 구현한 두 가지 방식을 볼 수 있습니다. 어느 것을 써도 결과는 똑같습니다.
for idx, value in enumerate(shape_list):
shape_idx[value.name] = idx
print(shape_idx)
idx = 0
for value in shape_list:
shape_idx[value.name] = idx
idx += 1
print(shape_idx)
먼저 끝에서 두번째 줄의 idx += 1은 idx = idx + 1과 같다는 의미입니다. 첫번째는 앞서 본 내용으로 세 줄로 구현이 되어 있고, 풀어쓴 두 번째 방법은 3줄이 5줄로 늘어나 있습니다. 하지만 이해 하기는 좀 더 쉬워 보입니다.
이와 같이 쉬운 것을 어렵게 쓴 파이썬 코드들이 꽤 있습니다. 하지만 한번 알고 나면 짧은 것을 사용하게 되는게 인지상정인지도 모르겠습니다.
'IT' 카테고리의 다른 글
파이썬 - 엑셀 주소록 읽기 (0) | 2025.02.02 |
---|---|
파이썬 - 편지봉투 받는사람 바꿔보기 (0) | 2025.02.02 |
파이썬 - 파워포인트와 엑셀을 이용한 편지봉투 출력 - 프로젝트 소개 (0) | 2025.02.02 |
파이썬 - 데이터베이스 - 데이터 수정 및 삭제 (0) | 2025.01.31 |
파이썬 - 데이터베이스 - 데이터 검색하기 (0) | 2025.01.31 |