6_Project/소소한 플젝

파이썬으로 자동화한 액셀과 PPT

Mi:sAng 2024. 1. 4. 06:53

영단어 2000개를 PPT에 치려고 하니까 답이 없다고 느꼈다. 

한 60개 치다가 그만 두었다. 

나름 공대생인데 파이썬으로 자동화에 도전해보았다.

C나 C#을 주로 쓰다 보니 파이썬 문법 하나도 모르겠다.

그래서 구글링하면서 코드 긁어 모으고 코드 한줄씩 전부 출력해보면서 계속 수정하였다 .

 

*기본 상태

PPT 탬플릿 - Num은 number(텍스트 박스), Meaning은 meaning(텍스트 박스), Word는 (Title) 로 설정하였다.

 

액셀 파일은 이런식으로 되어있다.

 

결과적으로 원하는 방식은 템플릿 슬라이드 복사해서 액셀에서 값을 읽어서 단어번호, 영단어, 한국어 뜻을 바꾸는 것이다. 

 

코드는 아래와 같다 . 

찾아보니 파워포인트는 placeholder라는 게 있다. 내용을 담아두는 틀이라고 보면된다. 

그런데 Title은 문제가 없지만 Subtitle에서 글머리 기호를 없애는 방법을 찾아내지 못해서 

시간을 상당히 소모했다. 또한 원했던 디자인도 아니었기에 텍스트 박스로 전부 바꾸었다.

텍스트 박스의 값을 바꾸는 방식은 조금 다르다.

이해를 하고 코드를 작성했다기 보다는 다른 분들이 작성한 코드 참조해서 코드 완성하였다.

일단 잘만 돌아가면 장땡아닌가.

그나저나 파이썬은 너무 낯설다...ㅎㅎ

 vscode도 설치하는 거 잘 모르겠고, 파이썬 패키지 설치는 한참 찾았다. pip부터 막히기는 했지만...

어찌되었건 나중에 다시 쓸때를 대비해서 자료 정리해둔다.

from pptx import Presentation  
from pptx.util import Pt
from pptx.enum.text import PP_ALIGN
import copy
from openpyxl import load_workbook
#import pandas as pd


wb=load_workbook('wordMaster.xlsx')
data=wb.active
prs=Presentation('Templete.pptx')


def slide_add (index,prss):
    source_slide=prss.slides[index]
    slide_layout=prss.slide_layouts[6]# 빈 화면 레이 아웃이다.
    copy_slide=prss.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 copy_slide

#####영단어 개수 설정 : numOfWord
numOfWord =2000 #영단어 번호 넣는 부분

for x in range(1,numOfWord+1,1): 
    num_str="A" + str(x)
    word_str="B"+ str(x)
    meaning_str="C" + str(x)
    #print(str(data[num_str].value))
    #print(str(data[word_str].value))
    #print(str(data[meaning_str].value))

#영단어 - 뜻없는 버전
    copy_slide = slide_add(0,prs)

    
    #placeholders 보는 법 
    for shape in copy_slide.placeholders:
        print('%d %s' % (shape.placeholder_format.idx, shape.name))
    
    
    #1. textbox 바꾸기 (number, meaning)
    shape_list =copy_slide.shapes
    shape_idx={}
    for idx, value in enumerate(shape_list):
        shape_idx[value.name]=idx
    #name : 텍스트 박스
    number = shape_list[shape_idx['number']]
    number.text_frame.clear()
    number.text_frame.paragraphs[0].font.name = '맑은 고딕 (제목)'
    number.text_frame.paragraphs[0].font.size = Pt(20) 
    number.text_frame.paragraphs[0].font.bold =True 
    number.text_frame.paragraphs[0].alignment=PP_ALIGN.LEFT
    number.text_frame.paragraphs[0].add_run().text=str(data[num_str].value)  #텍스트 박스 문자 바꾸는 곳

    meaning = shape_list[shape_idx['meaning']]
    meaning.text_frame.clear()
    meaning.text_frame.paragraphs[0].font.name = '맑은 고딕 (제목)'
    meaning.text_frame.paragraphs[0].font.size = Pt(29) 
    meaning.text_frame.paragraphs[0].font.bold =True 
    meaning.text_frame.paragraphs[0].alignment=PP_ALIGN.CENTER
    #meaning.text_frame.paragraphs[0].add_run().text=str(data[meaning_str].value)  #텍스트 박스 문자 바꾸는 곳

    #2. 제목에 글자 입력
    title = copy_slide.placeholders[0]     # title = slide.shapes.title와 동일
    #subtitle = copy_slide.placeholders[3]  #textbox는 placeholder로 잡히지 않는다. 레이아웃에 있는 틀만 인정

    #3. 제목에 글자 입력
    #title.text_frame.clear()
    title.text = title.text.replace("Word",str(data[word_str].value))  #영단어 바꾸는 부분
    title.text_frame.paragraphs[0].font.name = '맑은 고딕 (제목)'
    title.text_frame.paragraphs[0].font.size = Pt(60) 
    title.text_frame.paragraphs[0].font.bold =True 
    title.text_frame.paragraphs[0].alignment=PP_ALIGN.CENTER


    '''
    subtitle.text_frame.clear()
    subtitle.text_frame.paragraphs[0].font.name = '맑은 고딕 (제목)'
    subtitle.text_frame.paragraphs[0].font.size = Pt(29) 
    subtitle.text_frame.paragraphs[0].font.bold =True 
    subtitle.text_frame.paragraphs[0].alignment=PP_ALIGN.CENTER
    subtitle.text = subtitle.text.replace("Meaning"," ")   #단어 뜻 바꾸는 부분
    '''


#영단어 - 뜻있는 버전
    copy_slide = slide_add(0,prs)

    #1. textbox 바꾸기 (number, meaning)
    shape_list =copy_slide.shapes
    shape_idx={}
    for idx, value in enumerate(shape_list):
        shape_idx[value.name]=idx
    #name : 텍스트 박스
    number = shape_list[shape_idx['number']]
    number.text_frame.clear()
    number.text_frame.paragraphs[0].font.name = '맑은 고딕 (제목)'
    number.text_frame.paragraphs[0].font.size = Pt(20) 
    number.text_frame.paragraphs[0].font.bold =True 
    number.text_frame.paragraphs[0].alignment=PP_ALIGN.LEFT
    number.text_frame.paragraphs[0].add_run().text=str(data[num_str].value)  #텍스트 박스 문자 바꾸는 곳

    meaning = shape_list[shape_idx['meaning']]
    meaning.text_frame.clear()
    meaning.text_frame.paragraphs[0].font.name = '맑은 고딕 (제목)'
    meaning.text_frame.paragraphs[0].font.size = Pt(29) 
    meaning.text_frame.paragraphs[0].font.bold =True 
    meaning.text_frame.paragraphs[0].alignment=PP_ALIGN.CENTER
    meaning.text_frame.paragraphs[0].add_run().text=str(data[meaning_str].value)  #텍스트 박스 문자 바꾸는 곳

    #2. 제목에 글자 입력
    title = copy_slide.placeholders[0]     # title = slide.shapes.title와 동일
    #subtitle = copy_slide.placeholders[3]  #textbox는 placeholder로 잡히지 않는다. 레이아웃에 있는 틀만 인정

    #3. 제목에 글자 입력
    #title.text_frame.clear()
    title.text = title.text.replace("Word",str(data[word_str].value))  #영단어 바꾸는 부분
    title.text_frame.paragraphs[0].font.name = '맑은 고딕 (제목)'
    title.text_frame.paragraphs[0].font.size = Pt(60) 
    title.text_frame.paragraphs[0].font.bold =True 
    title.text_frame.paragraphs[0].alignment=PP_ALIGN.CENTER


    '''
    subtitle.text_frame.clear()
    subtitle.text_frame.paragraphs[0].font.name = '맑은 고딕 (제목)'
    subtitle.text_frame.paragraphs[0].font.size = Pt(29) 
    subtitle.text_frame.paragraphs[0].font.bold =True 
    subtitle.text_frame.paragraphs[0].alignment=PP_ALIGN.CENTER
    subtitle.text = subtitle.text.replace("Meaning"," ")   #단어 뜻 바꾸는 부분
    '''
    


prs.save('wordPPT.pptx')    

#참조
#https://ggondae.tistory.com/44
#https://coding-kindergarten.tistory.com/222
#https://ggondae.tistory.com/39
#https://ggondae.tistory.com/44

 

'6_Project > 소소한 플젝' 카테고리의 다른 글

Apple1 레플리카  (1) 2023.11.23
SCK - 230917 단축키 키보드 제작  (0) 2023.09.10