지난 포스팅은...
이번 포스팅의 내용은 지난 포스팅에서 언급한 것처럼, 교육생 정보가 담긴 엑셀파일 등에서 각 행의 값들을 해당하는 누름틀(필드)에 차례로 삽입하는 과정을 자세히 설명하고자 한다.
1. 파이썬을 통해 한/글을 실행해보자.
이 부분은 솔직하게 먼저 한 가지 말씀드리고 넘어가야겠다.
필자는 기존에 열려 있는 한글창을 파이썬으로 연결하는 방법을 모른다.
pywinauto를 통해 기존에 열린 창의 GUI를 제어하는 방법은 있지만,
그렇게 접근하면 API 명령어는 사용할 수 없더라..
혹시 방법을 아시는 독자분께서는 댓글로 알려주시면 사례드리고 싶다.
위의 이유로, 자동화작업을 할 한/글 파일은 직접 열지 않고 파이썬으로 열어준다.
파이썬으로 한/글 파일을 여는 방법은 간단하다.
파이참을 열어서, 코드로 한/글을 열고, hwp.Open(파일명) 메서드로 HWP파일을 불러오면 된다.
파이참이나 서브라임텍스트, IDLE든 커맨드프롬프트든, 파이썬 코드를 실행할 수 있는 프로그램을 실행하고
아래 코드를 입력하고 실행하면 된다.
import win32com.client as win32
hwp = win32.Dispatch("HWPFrame.HwpObject")
hwp.Open(파일경로)
코드 실행방법은 프로그램마다 다르며, 필자는 불친절하게 파이참 기준으로만 설명할 예정이니 양해 바란다.
Shift-Alt-E는 파이썬콘솔창을 생성하고, 해당 라인의 코드만 실행하는 단축키이다. 한 줄만 딸랑 실행할 수 있다.
여러 줄을 한 번에 실행하고 싶으면 실행하고 싶은 라인을 전부 선택하고, Shift-Alt-E를 누르면 된다.
파일 안의 모든 코드를 다 실행하고 싶으면
1. Ctrl-A를 누르고 Shift-Alt-E를 눌러도 되지만,
2. Shift-Alt-F10을 눌러서 파일 자체를 실행하는 방법도 있다. (한 번 실행하고 난 후엔 Shift-F10으로 빠른실행)
하여튼,
우리처럼 매크로 스크립트를 실행하는 경우라면 한 줄씩 실행해보고 결과를 관찰하는 것이 편하므로
필자는 대부분의 경우, Run(Shift-Alt-F10) 대신, Execute Line in Python Console(Shift-Alt-E)을 사용한다.
그런데 한/글 창이 나타나지 않는다?
뭔가 한/글 팝업은 떴던 것 같은데, 정작 한/글 창이 보이지 않는다.
당황하지 말자. 한/글은 정상적으로 실행되었다.
다만, 기본적으로 자동화 실행시 백그라운드에서 실행된다.
Ctrl-Shift-Esc를 눌러 작업관리자를 실행해보면?
이걸 화면에 보이게 하려면 아래의 코드 한 줄만 추가로 실행하면 된다.
hwp.XHwpWindows.Item(0).Visible = True
이제 한/글 창이 나타났다.
이렇게 한/글 창을 띄웠다.
참고로 한글2018 출시 때까지는, 화면에 나타나는 게 기본값이어서
백그라운드로 숨기기 위해 별도의 코드를 입력해야 했다. (hwp.XHwpWindows.Item(1).Visible = False)
필자도 유튜브채널 개설하고 얼마 안 있어 "한/글이 화면에 나타나지 않는다"는 문의댓글에 어리둥절한 적이 있었다.
하여튼, 여기까지 파이썬으로 한/글을 여는 방법을 알아보았다.
참고로, Open 메서드로 파일 불러오기를 할 때 팝업이 하나 떴다.
"모두 허용" 클릭 한 번이면 넘어갈 수 있지만, 이것마저 자동화하고 싶은(귀찮은) 분들은
아래 포스팅을 참고하기 바란다.
2. 문서 내의 누름틀 필드 목록을 가져와보자.
여기까지 잘 따라오셨다면, 여러분의 모니터에도 아래처럼 파이참과 한/글이 열려 있을 것이다.
지난 포스팅에서 입력했던 한/글 파일 누름틀 이름들을 기억하는가?
기억나지 않는다면, hwp.GetFieldList() 메서드를 실행해보자.
아래 콘솔창에 hwp.GetFieldList()를 입력하고 엔터를 치면,
생소한 글자(\x02)들이 껴들어가 있지만, 간단히 "구분문자"의 한 종류라고 생각하면 된다.
파이썬을 다뤄본 적 있는 초보 분들이라면 문자열 자료의 split 메서드를 떠올릴 것이다.
맞다. split을 사용해 위의 문자열을 리스트로 만들어보자.
문자열.split(구분자) 메서드는 괄호 안의 구분자가 일종의 "칼"이 되어 문자열을 쪼개주는 함수라고 생각하면 편하다.
field_list에다가 필드명 6개를 담았다.
이제 필드명을 통해 누름틀에 값을 입력해보자.
이 멍청해 보이는 짓을 왜 하나 싶겠지만, 곧 엑셀과 연동해서 수십수백장의 문서도 몇초만에 작성할 수 있으니
인내심을 조금만 가지고 따라와주기 바란다.
3. 파이썬으로 문서 누름틀에 값을 넣어보자.
좌측상단 "금액한글" 필드에 "일백만",
그 옆의 "금액숫자" 필드에 "1,000,000"을 넣어보겠다.
누름틀에 값을 넣는 메서드는 hwp.PutFieldText이다.
PutFieldText메서드는 두 개의 인자가 필요하다. 바로 "Field(어디에)"와, "Text(무엇을)" 넣느냐이다.
hwp.PutFieldText(Field="금액한글", Text="일백만")
위처럼 입력해도 되고, 간단히
hwp.PutFieldText("금액한글", "일백만")
라고 입력해도 된다.
연습삼아 (귀찮지만) 다른 필드에도 값을 직접 완성해보자. 다섯개만 더 입력하면
그러면 한/글 문서도 아래와 같이 완성되었다.
4. 리스트와 for문, 그리고 enumerate를 사용해서 간단히 입력해보자.
파이썬 문법에 익숙하거나 enumerate를 다룰 줄 아신다면 이번챕터는 읽지 않으셔도 된다.
파이썬 문법에 익숙해지는 만큼 앞으로 자동화할 때, 보다 간편한 입력방법들을 생각해낼 수 있을 것이다.
이번엔 for문과 리스트, enumerate를 사용하는 방법을 소개해드리는데,
우선 한/글창에서 Ctrl-Z로 원래상태로 되돌리고, 아래처럼 작성해서 실행해보자.
반복을 위한 파이썬 문법 중 하나인 for문이다.
필드가 한두 개면 하나씩 입력해도 괜찮은데,
열 개, 백 개, 많아질수록 일일이 입력하기 힘들어지기 때문이다.
위의 코드대로 입력하고 실행해보면,
for문 한 번에 한 페이지가 간단히 완성되었다. 오예!
5. 엑셀 연동해서 페이지별 text_list를 뽑아내기만 하면?
여기까지 잘 따라와 주었다면, text_list만 바뀌면, 새로운 문서를 만들어낼 수 있다는 걸 이해했을 것이다.
다행히 제목이 모든 걸 설명해준다. 엑셀파일에서 한 행을 복사해서 파이썬에 text_list로 가져오면?
그 후엔 위의 for문만 N번 반복실행해도 문서 하나가 완성될 것이다.
여기서 N은 엑셀파일의 데이터행 수 정도 되겠다.
포스팅이 생각보다 길어져서, 여기서 한 번 자르고 다음 포스팅에서 엑셀연동 파트를 진행해야겠다.
오늘 포스팅은 여기까지.
TMI) 위 과정은 pd.DataFrame을 통해 더 간편하게 진행할 수도 있다.
파이썬을 조금이라도 다뤄본 분들은 대부분 df를 사용할 것으로 생각한다.
다만, 필자의 업무용PC는 모든 문서파일에 FasooDRM이 걸려 있어,
엑셀이 아닌 파이썬 모듈을 통해 엑셀파일을 열 수 없다. (이거 하자고 일일이 부서장의 승인을 받기란ㅜ)
한 가지 꼼수로 엑셀파일을 엑셀로 열고 전체선택 후 클립보드에 복사를 하면
pd.read_clipboard 를 통해 df로 불러올 수는 있다.
언젠가 한 번은 df와 한/글 파일을 연동하는 방법을 포스팅으로 소개하겠다.
다음 포스팅은...
국내 유일의 파이썬+한컴오피스 업무자동화 입문강의
'아래아한글 자동화 > python+hwp 중급' 카테고리의 다른 글
hwp.GetFieldList() # 필드를 다룰 때 꼭 알아야 하는 메서드 (0) | 2021.01.22 |
---|---|
한/글 2020 최신 업데이트로도 고쳐지지 않은 API버그 (0) | 2021.01.14 |
문서 안의 컨트롤을 차례대로 선택하는 가장 간편한 방법 (0) | 2021.01.13 |
댓글