본문 바로가기
아래아한글 자동화/python+hwp 중급

파이썬으로 hwp파일 안에 메일머지 필드 삽입하고 실행하기

by 일코 2022. 1. 30.

안녕하세요?

일상의 코딩 일코입니다.

 

아래아한글 보고서 작업을 자동화하는 기술은

1~2년 정도가 아니라,

20년 가까운 긴 전통이 있는 기술입니다.

 

그 덕분에

역사있는 Daum카페나

선생님들 커뮤니티 등의

십여년 전 글에서도 인사이트를 발견하곤 합니다.

그 중 하나가, 메일머지를 굉장히 다양하게 활용하는 분께서 남겨주신

꿀팁이었어요.

(다음 포스팅에서 다루겠습니다.)

 

근데,

한 가지 먼저 고백하자면

제가 파이썬-한/글 자동화 관련한

유튜브채널과 블로그를 운영하면서

"메일머지" 노이로제에 걸리는 줄 알았습니다.

 

그 이유가 뭐냐면요.

가장 많이 받는 (부정적) 질문이 바로

"아니, 메일머지라는 멋진 기능이 있는데 왜 파이썬 (따위로) 자동화가 필요하죠?"

였거든요.

 

하여튼 메일머지 정도의 기능까지만 필요하신 분들에게는

굳이 파이썬을 권하지 않아도 되겠다는 다짐을 하게 된 계기가 되었습니다.

 

 

메일머지는 누름틀과 굉장히 유사합니다.

하지만 프로그래머 입장에서는

메일머지 필드를 거의 활용할 수가 없습니다.

제약이 많다...기보다는 관련기능이 거의 없기 때문이죠.

그래서 당연히 누름틀이 훨씬 더 유용한 도구로 느껴지지만,

한/글 기본기능만 사용하시는 일반사용자 입장에서는

자동으로 빈 필드를 레코드별로 채워서 쪽 복사나 라벨링을 해주는 기능 자체가

더욱 편안하게 느껴지실 수도 있겠다는 생각이 들기도 하네요.

 


 

하여튼

이번 시간에는 한 술 더 떠서

 메일머지 기능 자체를 파이썬 코드로 자동화

해보겠습니다.

아쉽지만, 이번 코드는 굉장히 길기도 하고,

배배 꼬인 듯한 느낌이 드실 수도 있습니다.

 

어느 정도 메일머지를 자유롭게 다루시는 분,

메일머지를 이리저리 활용해 보고 싶은 분에게만

도움이 될 만한 포스팅 시리즈라고 생각합니다.

 


 

메일머지 필드를 삽입하는 코드는 딱 세 줄입니다.

그리고 입력되는 정보도 딱 하나, "필드명"입니다.

그런데, "완전한 자동화"를 위해서는

엑셀파일이 아닌 한/글 파일을 메일머지 소스로 사용해야 합니다.

왜냐면 엑셀파일을 소스로 사용해버리면

무조건 한 번 이상의 팝업이 나타나고,

그 말인즉슨 마우스 클릭이 불가피하다는 뜻입니다.

엑셀파일을 선택할 수 없다고

엄청난 문제가 발생하는 것은 아닙니다.

엑셀 서식파일을 한/글 서식파일로 변환하는 과정 또한

상당히 간단한 문제이기 때문입니다.

 

1. 메일머지필드 삽입 함수

아래의 코드는 메일머지 필드를 삽입하는 함수입니다.

def 메일머지_필드삽입(필드명):
    hwp.HAction.GetDefault("MailMergeInsert", hwp.HParameterSet.HFieldCtrl.HSet)
    hwp.HParameterSet.HFieldCtrl.Command = 필드명
    hwp.HAction.Execute("MailMergeInsert", hwp.HParameterSet.HFieldCtrl.HSet)

문자열 뿐만 아니라 보시다시피 정수, 실수형 자료형도 필드명으로 삽입 가능합니다.

 

다만, 메일머지를 만드는 코드를 설명드리기 전에

중요한 점을 한 가지 더 짚고 가야 합니다.

(엑셀파일이 아닌) 한/글 문서를 메일머지 소스로 사용하기 위해서는

서식이 되는 한/글 파일의 메일머지 필드명이 전부 1 이상의 정수로 시작해야 합니다.

문자로 시작하는 필드명, "0" 또는 음수로 시작하는 필드에는 레코드가 채워지지 않습니다.

그리고 필드명은 데이터 연결과 아무 상관이 없습니다.

오직 삽입된 필드 순서만!!! 중요합니다.

 

예를 들면,

사용 가능한 필드명 : 1, 1_이름, 1이름, 1#이름, ...

오류가 나는 필드명 : #1, 이름_1, (1)이름...

입니다. 아시겠죠?

 

2. 데이터[레코드]용 한/글 파일 작성

한글파일은 표나 어떤 특별한 서식이 필요한 게 아닙니다.

일반 한/글 파일로 최상단에는 필드의 갯수(정수)

그 아래로는 그냥 엔터로 구분된 모든 필드값이 들어가면 됩니다.

(필드명은 들어가지 않습니다. 유의바람)

저는 아래(우측)와 같이 작성하였습니다.

왼쪽이 서식, 오른쪽이 데이터 문서입니다.

두 개의 필드, 다섯 개의 레코드입니다. 레코드를 구분하는 별도의 문자가 없습니다.

 

 

3. 메일머지 실행

메일머지를 실행하는 코드는 다소 긴 편입니다.

하지만 어차피 직접 작성한 게 아니라 스크립트매크로 녹화를 활용했고,

함수로 만들어서 사용시에는 한 줄로 호출할 예정이기는 합니다.

def 메일머지_실행(소스파일, 결과파일):
    hwp.HAction.GetDefault("MailMergeGenerate", hwp.HParameterSet.HMailMergeGenerate.HSet)
    hwp.HParameterSet.HMailMergeGenerate.Input = 1
    hwp.HParameterSet.HMailMergeGenerate.Output = 2
    hwp.HParameterSet.HMailMergeGenerate.Continue = 1
    hwp.HParameterSet.HMailMergeGenerate.HwpPath = 소스파일
    hwp.HParameterSet.HMailMergeGenerate.filename = 결과파일
    hwp.HParameterSet.HMailMergeGenerate.PrintSet.Collate = 1
    hwp.HParameterSet.HMailMergeGenerate.PrintSet.UsingPagenum = 1
    hwp.HParameterSet.HMailMergeGenerate.PrintSet.PrintImage = 1
    hwp.HParameterSet.HMailMergeGenerate.PrintSet.PrintDrawObj = 1
    hwp.HParameterSet.HMailMergeGenerate.PrintSet.PrintFormObj = 1
    hwp.HParameterSet.HMailMergeGenerate.PrintSet.PrintRevision = 1
    hwp.HParameterSet.HMailMergeGenerate.PrintSet.PrintBarcode = 1
    hwp.HAction.Execute("MailMergeGenerate", hwp.HParameterSet.HMailMergeGenerate.HSet)

 

이 함수를 테스트해보겠습니다.

다시 한 번 말씀드리지만, 필드명("1_팀명", "2_이름")은 데이터 연결과 아무 연관이 없습니다.
오직 순서만 인식합니다.

 

오예! 제 코드의 의도대로 잘 작성되어 있네요.

끝.


 

마치며

 

이제 우리 파이썬 프로젝트에는

"메일머지_필드삽입(필드명)" 함수와 

"메일머지_실행(소스파일, 결과파일)" 함수가 작성되었습니다.

이걸 활용해서 어떤 귀찮고 번거로운 작업을 자동화해볼 수 있을지

다음 포스팅에서 본격적으로 한 번 알아보겠습니다.

 

댓글