회사 주최 세미나가 열린다.
참석자는 20명이며 리스트는 엑셀 데이터로 가지고 있다.
참석자 명찰을 파워포인트로 만들어 출력해야한다.
Power Automate Desktop 버전은 아래 링크에서 확인 가능합니다.
https://ggondae.tistory.com/105
1. 참석자 엑셀 데이터 만들기
전산팀에 요청하여 온라인으로 받은 참석자 정보를 엑셀로 받았다. (주소록.xlsx)
2. 파워포인트 기본폼 만들기 (명찰.pptx)
- 텍스트 상자 이름 설정
2021.05.08 - [Python/RPA] - [python-pptx] 텍스트 박스에 글자 입력
이름 (텍스트 상자) : name
회사명 (텍스트 상자) : comp
3. 소스 구현
- 엑셀에서 참석자 정보를 읽어 리스트로 저장
- loop 돌며 슬라이드 생성
write_slide.py
from pptx import Presentation
from pptx.enum.text import PP_ALIGN
from pptx.util import Pt
import copy
# 빈칸 슬라이드 (layout 6번)를 추가하고 source_slide에 있는 shape를 복사한다.
def add_slide(idx, prs):
source_slide = prs.slides[idx]
slide_layout = prs.slide_layouts[6]
copy_slide = prs.slides.add_slide(slide_layout)
for shape in source_slide.shapes:
el = shape.element
newel = copy.deepcopy(el)
copy_slide.shapes._spTree.insert_element_before(newel, 'p:extLst')
return prs
# 지정된 슬라이드에 있는 shape 중 category와 동일한 shape를 가져와
# input_text를 입력한다.
def set_Shape_Textbox(idx, prs, input_text, category):
slide = prs.slides[idx]
shape_list = slide.shapes
shape_idx = {}
for idx, value in enumerate(shape_list):
shape_idx[value.name] = idx
shape = shape_list[shape_idx[category]]
tf = shape.text_frame
tf.clear()
if category == 'name':
para = tf.paragraphs[0]
para.alignment = PP_ALIGN.CENTER
run = para.add_run()
run.text = input_text
font = run.font
font.size = Pt(44)
font.bold = True
font.name = 'Malgun Gothic'
elif category == 'comp':
para = tf.paragraphs[0]
para.alignment = PP_ALIGN.CENTER
run = para.add_run()
run.text = input_text
font = run.font
font.size = Pt(18)
font.name = 'Malgun Gothic'
else:
print('None')
return prs
main.py
from openpyxl import load_workbook
from pptx import Presentation
from write_slide import add_slide, set_Shape_Textbox
# 파일명 저장
XLSX_FILE_PATH = '주소록.xlsx'
PPTX_FILE_PATH = '명찰.pptx'
COMPLET_FILE = '명찰_완료.pptx'
# 엑셀 파일 불러오기
wb = load_workbook(XLSX_FILE_PATH)
ws = wb.active
# 엑셀파일 읽어 dict에 넣기
# member_dict[no] = ['comp', 'name']
member_dict = {}
# 타이틀 1행은 빼고 2행부터 마지막 행까지
rows = ws[2:ws.max_row]
for row in rows:
# 파워포인트에서 이쁘게 하기 위해 이름에 한글자씩 공백 적용
member_dict[row[0].value] = [row[1].value, ' '.join(row[2].value)]
# 마스터가 있는 파워포인트 파일 불러오기
prs = Presentation(PPTX_FILE_PATH)
for idx, value in member_dict.items():
# 회사명
comp = value[0]
# 이름
name = value[1]
# 첫번째 슬라이드의 텍스트 상자 값 수정
if idx == 1:
prs = set_Shape_Textbox(idx-1, prs, comp, 'comp')
prs = set_Shape_Textbox(idx-1, prs, name, 'name')
# 두번째 슬라이드부터는 슬라이드를 추가하고 마지막 슬라이드 복사
# 텍스트 상자 값 수정
else:
# 0번째 첫 슬라이드를 복사해도 되는데 시험삼아 마지막 이전 슬라이드를 복사
prs = add_slide(idx-2, prs)
prs = set_Shape_Textbox(idx-1, prs, comp, 'comp')
prs = set_Shape_Textbox(idx-1, prs, name, 'name')
prs.save(COMPLET_FILE)
4. 결과
'RPA > Python' 카테고리의 다른 글
[BeautifulSoup] 기업 시가총액 순위, 엑셀/CSV로 저장 (0) | 2021.05.13 |
---|---|
[BeautifulSoup] 웹 스크래핑 (WEB Scraping) 환경 설정 및 기초 (0) | 2021.05.12 |
[python-pptx] 특정 슬라이드를 하나의 파일로 만들기 (0) | 2021.05.09 |
[python-pptx] 슬라이드 삭제 (0) | 2021.05.09 |
[python-pptx] 슬라이드 복사 (0) | 2021.05.09 |