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

[추천] 파이썬 런타임에서도 엄청나게 빠른 누름틀 값 입력방법

by 일코 2022. 1. 27.

안녕하세요?

이번 포스팅에서는 누름틀(필드)에 텍스트 삽입시

작업시간을 단축하는 노하우를 알려드리겠습니다.

 

아래아한글 자동화를 통해

가장 흔하고 손쉽게 자동화할 수 있는 업무라면

역시 "보고서 자동화" 아닐까 생각이 됩니다.

특히 엑셀파일이나, 이미지 파일, 혹은 폴더이름 등으로

입력할 자료를 정리해놓고

최종 순서로 hwp 보고서를 완성하는 일이 될 텐데요.

 

한 번이라도 실무 사이즈로 작업을 해 보신 분이라면

누름틀이나 셀 필드의 갯수가 굉장히 많을 것이라고 생각해요.

(적당히 작은 갯수라면 이런 스킬을 찾지 않으셨겠죠.)

 

어떻게 삽입시간을 좀 단축할 수 없을까?

 

저도 자동화를 공부하던 초반에는 나름 고민했던 부분입니다.

필드에 값이 채워지는 과정을 하나부터 열까지 다 지켜보면서

나름 카타르시스를 느끼는 것도 하루이틀이지

나중엔 "이거 후딱 되게 할 수 없나?" 하고 생각하게 됩니다.

 

그리고 여러분이 느끼시는 바와 같이

파이썬 단에서 병목이 걸리면 굉장히 답답하다는 느낌도 들고요.

어떤 방법으로든

여러분이 짠 코드의 성능을 끌어올린다는 건

굉장한 즐거움이 있지요.

(그래봤자 몇 초 차이일 수도 있지만요...)

 

그런 노하우가 몇 개 있는데,

이번 시간에는 누름틀이 여러 개일 때

작업시간을 단축할 수 있는 방법을

세 가지 보여드리려고 합니다.

 

예제는 "0" ~ "999"라는 필드명을 가진

1,000개의 누름틀을 임의로 생성해둔 후에

해당 누름틀에 동일한 0~999라는 값을 넣는 예제입니다.

혹시 여러분의 PC에서 테스트해 보고 싶으신 분은

아래의 코드를 실행하시면

저와 동일한 문서가 생성됩니다.

from time import time
import win32com.client as win32


hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject")
hwp.XHwpWindows.Item(0).Visible = True


before = time()
for i in range(1000):
    hwp.CreateField(Direction=f"{i}", memo=f"{i}", name=f"{i}")
    hwp.Run("MoveLineEnd")
    hwp.Run("BreakPara")
after = time()
print(f"문서 생성에 소요된 시간은 {after-before:0.2f}초입니다.")
#  약 10초 소요(최소화해놓으면 2초 소요)

 

화면을 열어놓고 약 10초 정도 소요되네요.

#1. 문서 최상단에 포커스를 두고 실행한다.

재미있는 것은,

문서 최하단에서 누름틀 삽입작업을 하는 경우에 비해

문서 최상단에서 작업할 경우

10배 정도까지 차이가 난다는 것입니다.

문서 최하단에서 작업을 해보면 약 4초 소요됩니다.

 

동일한 코드를 문서 최상단에서 실행해보면 어떨까요?

보시다시피 0.30초가 소요되었습니다. 열 배 이상이네요.

이유를 추정해보자면,

아마 누름틀 텍스트가 길어질 경우

최하단 페이지의 형태가 바뀔 것을 대비한

어떤 캐시작업이 수행되는 게 아닌가 싶습니다.

 

#2. 백그라운드에서 실행한다.

이전 포스팅인 "이미지 빠르게 삽입하는 방법"에서도 보여드린 바 있지만

한/글 창을 최소화해놓거나 백그라운드로 숨겨놓고 코드를 실행하면

확연하게 속도가 빨라지는 걸 느끼실 수 있습니다.

위와 동일한 코드로 한 번 테스트해볼까요?

문서 최하단에서 창만 최소화한 경우입니다.

1,000개의 누름틀을 삽입하는 데 0.16초 소요되었습니다.

 

Visible = False로 숨기면 몇 초나 소요될까요?

최소화한 경우와 유의미한 차이가 나지는 않지만, 하여튼 조금 줄어들었네요. 0.12초입니다.

 

 

이번에는 캐럿을 문서 최상단으로 올려놓은 상태에서

백그라운드로 숨긴 후 실행해보면 어떨까요?

매번 속도차이가 나는데, 0.01초 정도 밖에 차이가 안 나네요.

현재까지는 "백그라운드로 숨긴 경우"가 가장 빠릅니다.

 

#3. 한/글에서 제공하는 복수삽입 기능을 활용하는 경우

이런저런 노하우를 활용하면

파이썬의 for문만 활용해도

속도에 불편함이 없을 수 있지만,

아무래도 한/글에서 제공하는 자체기능을 활용해보면 어떨까요?

공식문서를 보시면 필드 문자열과 텍스트 문자열에 "\x02"라는 특수문자를

구분자로 활용해서

두 개 이상의 필드에 동시삽입이 가능하다고 합니다.

 

먼저 아래와 같은 코드를 실행해 둡니다.

field_text = ""
value_text = ""
for i in range(1000):
    field_text += str(i) + "\x02"
    value_text += str(i) + "\x02"

필드명과 문자열이 완성되었습니다.

필드명은 대략 아래와 같은 형식입니다.
"필드1\x02필드2\x02필드3\x02..."
물론 문자열값도 아래와 같습니다.
"값1\x02값2\x02값3\x02..."

이제 아래의 코드를 사용해 필드에 텍스트를 넣습니다.

hwp.PutFieldText(Field=field_text, Text=value_text)

결과는 어떨까요?

 

먼저 숨기지 않은 상태로 삽입해보겠습니다.

현 시점에서는 최고 신기록이네요.

무려 0.03초 밖에 소요되지 않았습니다.

 

제가 가장 추천하는 방법바로 이 세 번째 방법인

"\x02"를 활용한 동시삽입입니다.

가장 큰 이유는, (물론 가장 빠른 속도도 있지만)

백그라운드로 숨기지 않고도

그리고 캐럿을 어디 놓든지(최상단이든 최하단이든)

속도가 보장된다는 점입니다.

(제 PC의 경우는 모든 경우에 0.03초 정도로 수렴하네요.)

 

물론 파이썬 단에서 

모든 필드명과 값을 "\x02"라는 구분자로 합쳐야 한다는 게

번거로운 선행작업일 수 있지만,

만약 여러분의 작업물이

수회의 시행착오를 거쳐야 한다든지,

실시간 수준의 빠른 속도를 요한다든지,

하는 (일반적이지 않은) 경우라면

이 방법을 꼭 시도해보실 것을 추천드립니다.

 

 

특히 파이썬 자동화가 엄청나게 느리다고 불평하신 분들이

부디 이 포스팅을 읽어주셨으면 좋겠습니다.

이번 포스팅은 여기서 마치겠습니다.

행복한 하루 되세요!!

 

댓글