본문 바로가기
아래아한글 자동화

[이벤트핸들러] 문서저장시 첫 번째 표를 엑셀로 자동저장하는 이벤트

by 일코 2023. 11. 28.

hwp automation에서는 꽤 다양한 이벤트핸들러를 제공하고 있는데요.

대략의 목록은 아래와 같습니다.

OnQuit
OnCreateXHwpWindow
OnCloseXHwpWindow
OnNewDocument
OnDocumentBeforeClose
OnDocumentBeforeOpen
OnDocumentAfterOpen
OnDocumentBeforeSave
OnDocumentAfterSave
OnDocumentAfterClose
OnDocumentChange
OnDocumentBeforePrint
OnDocumentAfterPrint
OnDocumentClickedHyperlink
OnDocumentModifiedHyperlink
OnBeforeQuit

대략의 사용법을 예시코드로 보여드려보면,

"""
아래아한글 이벤트핸들러 예제

OnQuit(리턴 없음) : 한/글을 종료할 때 발생
OnCreateXHwpWindow(리턴 없음) : 한/글에서 새 문서 창을 열었을 때 발생
OnCloseXHwpWindow(리턴 없음) : 한/글에서 문서 창을 닫았을 때 발생
OnNewDocument(long) : 새 문서를 생성할 경우 발생(Document ID를 반환)
OnDocumentBeforeClose(long) : 문서를 닫기 직전에 발생(Document ID를 반환)
OnDocumentBeforeOpen(long) : 문서를 열기 직전에 발생(Document ID를 반환)
OnDocumentAfterOpen(long) : 문서를 열고 난 후에 발생(Document ID를 반환)
OnDocumentBeforeSave(long) : 문서를 저장하기 직전에 발생(Document ID를 반환)
OnDocumentAfterSave(long) : 문서를 저장한 후에 발생(Document ID를 반환)
"""


import win32com.client as win32
import pythoncom


class HwpEvents:  # 클래스 이름은 마음대로~
    def OnQuit(self):  # 메서드 이름은 제공하는 이벤트명과 정확히 일치해야 함!
        print("OnQuit")
        
    def OnCreateXHwpWindow(self):
        print("OnCreateXHwpWindow")
        
    def OnCloseXHwpWindow(self):
        print("OnCloseXHwpWindow")
        
    def OnNewDocument(self, newVal):
        print("OnNewDocument", newVal)
        
    def OnDocumentBeforeClose(self, newVal):
        print("OnDocumentBeforeClose", newVal)
        
    def OnDocumentBeforeOpen(self, newVal):
        print("OnDocumentBeforeOpen", newVal)
        
    def OnDocumentAfterOpen(self, newVal):
        print("OnDocumentAfterOpen", newVal)
        
    def OnDocumentBeforeSave(self, newVal):
        print("OnDocumentBeforeSave", newVal)
        msgbox = hwp.XHwpMessageBox
        msgbox.string = "확인을 누르면 저장을 완료합니다."
        msgbox.DoModal()
        
    def OnDocumentAfterSave(self, newVal):
        print("OnDocumentAfterSave", newVal)
        msgbox = hwp.XHwpMessageBox
        msgbox.string = "저장이 완료되었습니다. 한/글을 종료합니다."
        msgbox.DoModal()
        hwp.Quit()  # hwp 종료
        
    def OnDocumentAfterClose(self, newVal):
        print("OnDocumentAfterClose", newVal)
        
    def OnDocumentChange(self, newVal):
        print("OnDocumentChange", newVal)
        
    def OnDocumentBeforePrint(self, newVal):
        print("OnDocumentBeforePrint", newVal)
        
    def OnDocumentAfterPrint(self, newVal):
        print("OnDocumentAfterPrint", newVal)
        
    def OnDocumentClickedHyperlink(self, linkType, szAddress, szShowText):
        print("OnDocumentClickedHyperlink", linkType, szAddress, szShowText)
        
    def OnDocumentModifiedHyperlink(self, linkType, szAddress, szShowText):
        print("OnDocumentModifiedHyperlink", linkType, szAddress, szShowText)
        
    def OnBeforeQuit(self, newVal):
        print("OnBeforeQuit", newVal)


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

keepOpen = True

while keepOpen:
    pythoncom.PumpWaitingMessages()
    try:
        if hwp.XHwpDocuments.Count != 0:
            keepOpen = True
        else:
            keepOpen = False
            hwp = None
            break  # sys.exit()
    except:
        keepOpen = False
        hwp = None
        break  # sys.exit()

위 코드는 문서 저장 전후로 팝업을 띄워줍니다.

이 이벤트핸들러들을 통해서 다양하게 활용할 수 있는데요.

예를 들면 문서를 저장할 때 특정 표의 내용을 DB에 INSERT 한다든지,
특정 하이퍼링크 클릭시에 API 서버로 전송해서 외부 이벤트를 실행하는 등
다양한 외부기능을 통합할 수 있습니다.

예를 들어 아래 코드는 문서 저장시 첫 번째 표의 내용을 동일폴더에 엑셀로 저장해줍니다.
(내부적으로 pandas를 활용합니다.)

"""
table_to_excel.py

이 스크립트로 한/글을 실행하고
표 내용 작성 후 저장하면
한/글 파일의 첫 번째 표 내용을
저장경로에 엑셀로 자동저장하는 프로그램
"""


import os
import sys
from hwpx import Hwp
import win32com.client as win32
import pythoncom


class HwpEvent:
    def OnDocumentAfterSave(self, newVal):
        msgbox = hwp.XHwpMessageBox
        msgbox.string = "확인을 누르면 엑셀로 저장합니다."
        msgbox.DoModal()
        df = hwp.table_to_df()
        df.to_excel(os.path.join(os.path.dirname(hwp.hwp.Path), "hwp_table.xlsx"),
                    index=False)
        print(hwp.hwp.Path)


hwp = Hwp()
hwp_events = win32.WithEvents(hwp.hwp, HwpEvent)


keepOpen = True

while keepOpen:
    pythoncom.PumpWaitingMessages()
    try:
        if hwp.XHwpDocuments.Count != 0:
            keepOpen = True
        else:
            keepOpen = False
            hwp = None
            sys.exit()
    except:
        keepOpen = False
        hwp = None
        sys.exit()

시연화면은 아래와 같습니다.

오토메이션의 API에 국한되지 않고
다양한 메서드를 제작해볼 수 있겠네요.

사실, 개인적으로는 쥬피터노트북을 사용해서
간단한 자동화 코드를 후다닥 작성하고 실행하는 방식을
가장 많이 사용하고 있는데요.

특정 애플리케이션을 작성하면서는 데이터베이스의 내용을 한/글로 가져온 후에
한/글 문서를 수정 후 저장하면 db 내용도 업데이트된다든지
이런 식으로 활용해볼 수도 있을 것 같아요.

한컴 개발자포럼에 이벤트 관련 질문이 올라와서
답변을 간략히 적은 후, 블로그에도 옮겨보았습니다.

행복한 하루 되세요!ㅋ

댓글