DoITgrow

파이썬 GUI 패키지를 이용한 Word 문서 자동 생성 프로그램 개발 (feat. tkinter) 본문

새로운 발견의 즐거움

파이썬 GUI 패키지를 이용한 Word 문서 자동 생성 프로그램 개발 (feat. tkinter)

김수성 (Kim SuSung) 2021. 10. 20. 00:14
반응형

태어나서 회사에 들어올 때까지 코딩의 'ㅋ'도 모르던 시절에 프로그래밍을 입문하게 해준 프로젝트가 바로 "계약서 자동 생성 프로그램" 개발이네요. 계약서 안에는 날짜, 금액, 이름 등등 반복적으로 수기 입력해야 하는 내용들이 많았고, 일이 치이는 바쁜 날에는 꼭 놓치게 되는 일이 발생하더라구요. 

그리고 보통 계약서에 금액을 작성할 때에는 한글로도 작성하는데 (숫자가 틀렸을 때의 리스크를 방지하기 위해), 숫자를 읽어가며 작성하는 것도 매우 귀찮더라구요. 그래서 아래와 같은 GUI 프로그램을 개발하여 안귀찮고, 실수가 없도록 프로그램을 만들고자 했었습니다.

프로그래밍에 처음 입문하며 열정도 가득했고, 참 재밌게 진행했던 프로젝트인데 몇 년이 지나서 코드를 다시 열어보니너무나도 초보스럽게 한 파일에 730줄을 작성한 것을 보고 웃음이 났네요. 그 당시에는 코드를 다시 정리하고, 수정할 것은 아예 생각하지도 않고, 어떻게든 프로젝트만 성공시키려고 막 만든 것 같아요. 지금 다시 정리하라고 하면 나중에 유지/보수가 쉽도록 잘 짤 수 있을 것 같네요.

프로그램 작동 원리

위 GUI는 pyinstaller 패키지를 이용하여 exe 파일로 만들어서 배포했구요. 내용을 입력하고 "계약서 생성" 버튼을 클릭하면 계약서 템플릿 word 파일을 읽고, 입력한 정보들이 각자 위치에 맞게 모두 입력되고, 최종적으로는 계약서 word 파일을 새로운 파일로 내보내는 기능을 수행합니다. 

 

입력한 내용을 원하는 위치에 입력하는 로직은 아래와 같이 계약서 템플릿 파일에 정보가 입력될 곳을 특정 key로 작성을 하고, GUI에서 입력한 값이 해당 자리를 찾아서 replace 되게 했네요. 당시 replace 되면 서식들이 모두 다 깨지며 입력되는 등의 문제가 있었어서 이를 해결하는데 아주 많이 애를 먹었던 것 같습니다. 어쨋든 잘 해결하여 정상적으로 수행되게 했었네요. 그래서 GUI에서 "착수년도""완료년도""년월일" 정보를 입력하면 "start_date""2020년 1월 1일", "finish_date""2020년 12월 31일" 이렇게 변경되어 출력이 됩니다. 만약 동일한 입력 값이 다른 페이지에도 필요하다면 동일한 key를 입력해 놓으면 모두 찾아서 값을 바꿔버리는 원리입니다.

요즘 많은 회사들에서는 Digital Transformation 이다 뭐다 하며, 업무를 스마트하게 할 수 있도록 혁신을 고민하고 있는데요. 멋있고, 진짜 혁신적인 아이템을 적용하는 것도 중요하지만 가장 기본적인 업무에서부터 조금씩 변화시켜 나가면 모두들 스마트하게 일할 수 있을 것 같습니다.

tkinter 패키지를 이용한 GUI 만들기 코드 일부

# GUI 창 생성
window = Tk()
window.title('계약서 자동 생성 프로그램 [64bit]')
window.geometry('600x400+200+200')


# 과제명 작성
Label0 = ttk.Label(window, text = '과제명')
Label0.grid(row=0, column=0, padx=5, pady=5)    
title = StringVar()
Entry0 = ttk.Entry(window, width=57, textvariable = title)
Entry0.grid(row=0, column=1, columnspan=8, padx=5, pady=5)

# 확인 버튼 생성
Button2 = ttk.Button(window, text = "계약서 생성", width=18, command = lambda: mkcontract_client())
Button2.grid(row=10, column=5, columnspan=3, padx=5, pady=5, sticky='e')

python-docx 패키지를 이용한 내용 변경 코드

# 계약서 템플릿 내용 변경
def docx_replace_regex(doc_obj, regex , replace):

    for p in doc_obj.paragraphs:
        if regex.search(p.text):
            inline = p.runs
            
            for i in range(len(inline)):
                if regex.search(inline[i].text):
                    text = regex.sub(replace, inline[i].text)
                    inline[i].text = text

    for table in doc_obj.tables:
        for row in table.rows:
            for cell in row.cells:
                docx_replace_regex(cell, regex , replace)

코드를 모두 올리고 싶지만 730줄을 모두 올리면 보기도 힘들뿐더러 부끄러운 시절에 짰던 코드라 눈 버리시지 않도록 일부만 올렸습니다. 모두들 스마트한 업무 환경을 구축하셔서 황금같은 시간을 잘 지키시면 좋겠네요 ^^.

반응형
Comments