https://youtu.be/1pC_UXhiJH8

안녕하세요? 유튜브에서 회사원생존코딩 채널을 운영하고 있는 신명진입니다.

주로 다루고 있는 분야는 파이썬으로 아래아한글2018 을 다루는 내용이며,

나아가 코딩기초나 엑셀 자동화, 웹크롤링, 매크로 등 자동화에 필요한 제반 분야의 튜토리얼을 제작할 계획입니다.

강의에 쓰인 소스코드 및 문서파일 등은 노션을 통해 공유하려고 합니다.

아직 여러모로 부족한 점이 많습니다. 유튜브댓글이나 노션코멘트 등으로 건의해주시면 적극 반영 개선하겠습니다.

감사합니다. 행복한 하루 되세요!

위 영상에 사용된 코드 및 리소스파일

1_award.py

수상자명단.xlsx

award(원본).hwp

award(field).hwp

아래는 소스코드입니다. 문의는 코멘트나 댓글, 이메일 등으로 자유롭게 주시기 바랍니다.

"""
상장을 대량으로 생성하는 코드입니다.

<대략의 작업순서>
1. 엑셀파일(수상자명단.xlsx)을 pandas로 열어서 데이터프레임으로 변환한 후
2. 한/글파일(award.hwp)을 열어서 상장 개수만큼 페이지를 복사하고
3. 각 페이지의 누름틀(필드)에 해당하는 값을 데이터프레임에서 불러와서 차례대로 삽입.

<참고사항>
작업이 진행되는 과정을 보여주기 위해,
한/글 창을 백그라운드로 숨기는 코드와
작업완료된 한/글 파일을 저장하고 한/글 창을 닫는 등의 코드는
모두 주석으로 처리해 두었습니다.

pandas, pywin32 모듈을 사용하기 위해 pip를 통해 설치해야 합니다.
커맨드창에서, "pip install pandas pywin32" 입력 후 엔터

한/글파일 출처 : 네이버 한글한글아름답게(<https://hangeul.naver.com>)
"""

import shutil  # 파일복사용 모듈
import win32com.client as win32  # 한/글 열기 위한 모듈
import pandas as pd  # 그 유명한 판다스. 엑셀파일을 다루기 위함
from datetime import datetime as dt  # 작업시간을 측정하기 위함. 지워도 됨.
# import win32gui  # 한/글 창을 백그라운드로 숨기기 위한 모듈

excel = pd.read_excel(r"C:\\Users\\User\\Desktop\\수상자명단.xlsx")  # 엑셀로 데이터프레임 생성
hwp = win32.gencache.EnsureDispatch("HWPFrame.HwpObject")  # 한/글 열기
# hwnd = win32gui.FindWindow(None, '빈 문서 1 - 한글')  # 한/글 창의 윈도우핸들값을 알아내서
# win32gui.ShowWindow(hwnd, 0)  # 한/글 창을 백그라운드로 숨김
hwp.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule")  # 보안모듈 적용(파일 열고닫을 때 팝업이 안나타남)

shutil.copyfile(r"C:\\Users\\User\\Desktop\\award(field).hwp",  # 원본은 그대로 두고,
                r"C:\\Users\\User\\Desktop\\award_result.hwp")  # 복사한 파일을 수정하려고 함.

hwp.Open(r"C:\\Users\\User\\Desktop\\award_result.hwp")  # 수정할 한/글 파일 열기

start_time = dt.now()  # 작업시간을 측정하기 위해 현재 시각을 start_time 변수에 저장. 없어도 됨...
field_list = [i for i in hwp.GetFieldList().split("\\x02")]  # 한/글 안의 누름틀 목록 불러오기
hwp.Run('SelectAll')  # Ctrl-A (전체선택)
hwp.Run('Copy')  # Ctrl-C (복사)
hwp.MovePos(3)  # 문서 끝으로 이동

print('페이지 복사를 시작합니다.')

for i in range(len(excel) - 1):  # 엑셀파일 행갯수-1 만큼 한/글 페이지를 복사(기존에 한쪽이 있으니까)
    hwp.Run('Paste')  # Ctrl-V (붙여넣기)
    hwp.MovePos(3)  # 문서 끝으로 이동

print(f'{len(excel)}페이지 복사를 완료하였습니다.')

for page in range(len(excel)):  # 한/글 모든 페이지를 전부 순회하면서,
    for field in field_list:  # 모든 누름틀에 각각,
        hwp.MoveToField(f'{field}{{{{{page}}}}}')  # 커서를 해당 누름틀로 이동(작성과정을 지켜보기 위함. 없어도 무관)
        hwp.PutFieldText(f'{field}{{{{{page}}}}}',  # f"{{{{{page}}}}}"는 "{{1}}"로 입력된다. {를 출력하려면 {{를 입력.
                         excel[field].iloc[page])  # hwp.PutFieldText("index{{1}}") 식으로 실행될 것.
    print(f'{page + 1}:{excel.name[page]}')  # 현재 입력이 진행되고 있는 한/글문서 페이지번호를 콘솔창에 출력
# hwp.Save()  # 한/글 파일(award_result.hwp)을 저장하고,
# hwp.Quit()  # 한/글 종료. (저장하지 않고 종료하는 방법은 7강에서~)

end_time = dt.now()  # 작업종료 시각. 없어도 무관.
소요시간 = end_time - start_time  # 전체 작업시간을 기록. 없어도 무관.

print(f'작업을 완료하였습니다. 약 {소요시간.seconds}초 소요되었습니다.')  # 작업완료된 후 출력. 끝.