RPA/Python

[openpyxl, python-pptx] 엑셀 주소록 읽어 파워포인트로 명찰 만들기

꼰대 2021. 5. 9. 15:18

회사 주최 세미나가 열린다.

참석자는 20명이며 리스트는 엑셀 데이터로 가지고 있다.

참석자 명찰을 파워포인트로 만들어 출력해야한다.

 

Power Automate Desktop 버전은 아래 링크에서 확인 가능합니다.

https://ggondae.tistory.com/105

 

[Power Automate Desktop] 엑셀 주소록 읽어 파워포인트로 명찰 만들기

엑셀에 있는 주소록 데이터를 읽어 명찰 폼이 있는 파워포인트 슬라이드를 추가하면서 넣는 플로어를 만들어보겠습니다. python으로 구현한 내용은 아래 링크에서 확인하세요. https://ggondae.tistory.

ggondae.tistory.com

 

1. 참석자 엑셀 데이터 만들기

전산팀에 요청하여 온라인으로 받은 참석자 정보를 엑셀로 받았다. (주소록.xlsx)

 

 

 

2. 파워포인트 기본폼 만들기 (명찰.pptx)

 

 

- 텍스트 상자 이름 설정

2021.05.08 - [Python/RPA] - [python-pptx] 텍스트 박스에 글자 입력

 

[python-pptx] 텍스트 박스에 글자 입력

전시회 참석자의 명찰을 파워포인트를 이용해서 만들려고 한다. 아래 구문은 기본 내용이고 확장은 텍스트 상자 입력 부분을 함수로 만들고 회사명/이름 부분을 for문 등을 활용해서 추가 구현

ggondae.tistory.com

 

이름 (텍스트 상자) : 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(idxprs):

    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(idxprsinput_textcategory):

    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. 결과

 

반응형