본문 바로가기
아래아한글 자동화/pyhwpx 사용법

[pyhwpx] 한/글 자동화 문의 및 요청의 90%는 ㅇㅇ 관련이었어요.

by 일코 2024. 1. 25.

안녕하세요? 일코입니다.

유튜브와 블로그를 운영하면서 받았던 문의 중 90%는
바로 ""에 관한 내용들이었습니다.

표는 비단 행정뿐만 아니라,
한/글을 통해 작성되는 문서에서 가장 많이 쓰이는 컨트롤이죠.
그런데 기존의 한/글 오토메이션 API를 통해 표를 읽어오거나, 표를 작성하는 메서드는
다소 큰 진입장벽이 있었습니다. 

예를 들어 비교적 최근 만든 pyhwpx에서
5행5열의 표를 만들고 "글자처럼 취급"을 적용하는 코드는
아래 세 줄이면 되지만,

from pyhwpx import Hwp

hwp = Hwp()
hwp.create_table(5, 5, treat_as_char=True)

 

 

그런데,
기존 오토메이션API를 통해 동일한 표를 직접 생성하려면
무려 아래의 코드를 작성해야 합니다.
(혹시 관심 있는 분은 아래의 "더보기"를 클릭하시고, 차근차근 읽어보셔도 좋습니다.)

더보기
import win32com.client as win32

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

rows = 5  # 행 갯수
cols = 5  # 열 갯수
width_type = 0  # 너비: 단에 맞춤
height_type = 0  # 높이: 자동
height = 0  # height 기본값 초기화
treat_as_char = True  # 글자처럼 취급

pset = hwp.HParameterSet.HTableCreation
hwp.HAction.GetDefault("TableCreate", pset.HSet)  # 표 생성 시작
pset.Rows = rows  
pset.Cols = cols  
pset.WidthType = width_type  # 너비 지정(0:단에맞춤, 1:문단에맞춤, 2:임의값)
pset.HeightType = height_type  # 높이 지정(0:자동, 1:임의값)

sec_def = hwp.HParameterSet.HSecDef
hwp.HAction.GetDefault("PageSetup", sec_def.HSet)
total_width = (sec_def.PageDef.PaperWidth - sec_def.PageDef.LeftMargin
               - sec_def.PageDef.RightMargin - sec_def.PageDef.GutterLen
               - hwp.MiliToHwpUnit(2))

pset.WidthValue = hwp.MiliToHwpUnit(total_width)  # 표 너비

if height and height_type == 1:  # 표높이가 정의되어 있으면
    total_height = (sec_def.PageDef.PaperHeight - sec_def.PageDef.TopMargin
                    - sec_def.PageDef.BottomMargin - sec_def.PageDef.HeaderLen
                    - sec_def.PageDef.FooterLen - hwp.MiliToHwpUnit(2))
    pset.HeightValue = hwp.MiliToHwpUnit(height)  # 표 높이
    pset.CreateItemArray("RowHeight", rows)  # 행 m개 생성
    each_row_height = total_height - hwp.MiliToHwpUnit(rows)
    for i in range(rows):
        pset.RowHeight.SetItem(i, each_row_height)  # 1열
    pset.TableProperties.Height = total_height

pset.CreateItemArray("ColWidth", cols)  # 열 n개 생성
each_col_width = total_width - hwp.MiliToHwpUnit(3.6 * cols)
for i in range(cols):
    pset.ColWidth.SetItem(i, each_col_width)  # 1열
# pset.TableProperties.TreatAsChar = treat_as_char  # 글자처럼 취급
pset.TableProperties.Width = total_width  # hwp.MiliToHwpUnit(148)  # 표 너비 적용
hwp.HAction.Execute("TableCreate", pset.HSet)  # 코드 실행

# 글자처럼 취급 여부 적용(treat_as_char)
ctrl = hwp.CurSelectedCtrl or hwp.ParentCtrl
pset = hwp.CreateSet("Table")
pset.SetItem("TreatAsChar", treat_as_char)
ctrl.Properties = pset

결과는 위와 동일합니다

 

고작 표 하나를 만들기 위해
질릴만큼 길고 복잡한 저 API코드를 작성해야 한다는 사실을 알게 되면
(특히 회사원들) 어느 누가 한/글 자동화를 시도할까 싶었습니다.

전부 언급할 수도 없는 상당한 분량의 백그라운드 지식을 알려주는 것도 큰 부담이었습니다.
아래아한글 API의 구조와 실행방법, 파라미터셋 사용법,
파라미터셋의 서브아이템셋을 정의해야 하는 경우와 정의방법,
암호같은 API 문서를 읽는 방법..ㅜ

하여튼 pyhwpx가 나름의 버전업을 거듭해서
0.8 근처까지 왔는데요. 아직 갈 길이 멉니다.

그럼에도 create_table, table_to_df나,
table_from_data, get_into_nth_table, 특히 put_field_text는
한/글 보고서 취합 및 작성 자동화나 엑셀연동에 진심인 분들에게는
정말 파워풀한 메서드일 거라고 자부합니다.

개발기간도 아직 짧은 편이고, 다소 조악해 보일 수 있습니다.
하지만, 정말 수백 건의 문의와 의뢰를 받고 일일이 회신을 드렸던 모든 경험을
pyhwpx 모듈에 하나씩 녹여내고 있습니다.

 

pyhwpx 사용법도 알려주세요! - 인프런

한/글 오토메이션 API는 너무 복잡하고 어렵습니다.최근 제작하신 pyhwpx라는 툴에 대해서도 본 강의에서 풀어주시면 감사하겠습니다. - 질문 & 답변 | 인프런

www.inflearn.com

현재는 블로그에만 pyhwpx 짧은 메서드 사용법 위주로 포스팅하고 있지만,
오는 2024년 2월부터는 작은 프로젝트나, 의뢰/문의내용을 토대로
pyhwpx의 활용방법을 차근차근 영상과 포스팅으로 풀어볼 예정입니다.

많은 관심 부탁드립니다.

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

 

 

댓글