인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

김재영님의 프로필 이미지
김재영

작성한 질문수

직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피

날짜 뒤에 요일 붙이기

날짜 뒤에 요일 붙이기가 작동이 안되네요

해결된 질문

작성

·

24

1

안녕하세요. 날짜 뒤에 요일 붙이기 코드가 작동이 되지 않아서 문의 드립니다. 제가 손코딩 한게 뭔가 오류가 있나 싶어서 강의에 있는 코드를 복붙해서 실행해봐도 아무런 변화가 없네요.

한글 파일은 자료다운에서 받은 실작업공정표를 사용했고 한글 2022, 한글 2024 두가지 버전 모두 아무런 변화가 없습니다ㅠㅠ

 

import os
import datetime as dt

import win32com.client as win32

def init_hwp():
    hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject")
    hwp.XHwpWindows.Item(0).Visible = True
    hwp.RegisterModule("FilePathCheckDLL", "FileCheckerModule")
    return hwp

hwp = init_hwp()
hwp.Open(os.path.join(os.getcwd(),r"C:\Users\cctom\Desktop\python\hwp2python\실작업공정표.hwpx"))

# date().weekday() : 월화수목금토일
#                     0 1 2 3 4 5 6


def get_value():
    hwp.InitScan(Range=0xff)  # 추출범위를 "선택영역"으로 지정
    text = hwp.GetText()[1]  # 선택범위 문자열값 추출
    hwp.ReleaseScan()  # 검색종료
    return text  # 추출값 리턴


def get_weekday(text):
    week_list = ["월", "화", "수", "목", "금", "토", "일"]
    month, day = [int(i) for i in text.split(".")[:2]]
    week_num = dt.date(2022, month, day).weekday()
    week_day = week_list[week_num]
    return f"({week_day})"


def insert_text(text):
    act = hwp.CreateAction("InsertText")
    pset = act.CreateSet()
    pset.SetItem("Text", text)
    act.Execute(pset)


if __name__ == '__main__':
    hwp.FindCtrl()  # 표 선택
    hwp.Run("ShapeObjTableSelCell")  # 첫 번째 셀로 진입(셀선택상태)
    while True:  # 무한반복
        text = get_value()  # 셀의 텍스트 추출
        if text.endswith("."):  # 셀 안의 텍스트가 "."으로 끝나면(날짜셀을 구분하는 임의의 방법)
            weekday = get_weekday(text)  # 요일 파악
            hwp.Run("Cancel")  # 셀선택 취소
            hwp.Run("MoveLineEnd")  # 문자열 끝으로 이동
            insert_text(weekday)  # 요일 삽입
            hwp.Run("TableCellBlock")  # 다시 셀선택
        if not hwp.HAction.Run("TableRightCell"):  # 우측으로 이동하다
            break  # 끝에 도달하면 while문 종료

답변 2

2

일코님의 프로필 이미지
일코
지식공유자

제가 답변이 늦었습니다...

예전에는 hwp.FindCtrl()을 실행하면, 멀리 있는 컨트롤도 선택했던 것 같은데,

지금은 조판부호에 붙어있지 않으면 선택하는 않는 방식으로 업데이트가 되었나봅니다^^;

(기억이 가물가물하네요...ㅜㅜㅜ 아이고)

그래도 예전 hwp.FindCtrl()의 기능을

(거의 동일하게) hwp.HAction.Run("SelectCtrlFront")로 사용할 수 있는 듯 합니다.

한컴 개발자 포럼의 개발자 분들도 대부분의 답변에서
FindCtrl보다는 SelectCtrlFront를 추천해주고 계신데요.

FindCtrl은 커서 좌측에 컨트롤이 있으면 그걸 선택해버리는 반면
SelectCtrlFront는 무조건 우측이나 아래로,
그리고 SelectCtrlPrev는 무조건 좌측이나 위쪽 방향으로
컨트롤을 찾아가기 때문에 FindCtrl에 비해 오류발생 가능성이 현저히 적어 보입니다.

녹화_2024_12_18_20_47_53_339.gif

 

그냥 마치기는 좀 죄송해서,

단순한 예제이긴 하지만 pyhwpx 모듈과 정규식으로도 동일 예제를 짜본 코드도 보여드려봅니다.

녹화_2024_12_18_21_52_45_108.gif
import datetime as dt

from pyhwpx import Hwp


def get_weekday(text):
    week_list = ["월", "화", "수", "목", "금", "토", "일"]
    month, day = [int(i) for i in text.split(".")[:2]]
    week_num = dt.date(2022, month, day).weekday()
    week_day = week_list[week_num]
    return f"({week_day})"

hwp = Hwp()
hwp.Open(r"C:\Users\Administrator\Desktop\실작업공정표.hwpx")

hwp.MoveDocBegin()
while hwp.find(r"\d+\.\d+\.", regex=True):
    date = hwp.get_selected_text()
    hwp.insert_text(date + get_weekday(date))

 

항상 자답 남겨주셔서 감사하고 죄송하고 그렇습니다.

행복한 하루 되세요^^

김재영님의 프로필 이미지
김재영
질문자

자세히 답변 달아주셔서 감사합니다^^ 날씨가 많이 추운데 감기 조심하시고 즐거운 하루 보내세요~^^

1

김재영님의 프로필 이미지
김재영
질문자

밑에 질문에 답해주신 내용 보고 해결했습니다.

매번 자문자답이 되네요ㅜㅠ

hwp.FindCtrl()을 사용하지 않고 hwp.HAction.Run("SelectCtrlFront")를 사용하니까 잘 실행 되었습니다.

한글이 업데이트 되면서 내부적으로 변경이 계속 생기나보네요ㅠㅠ

김재영님의 프로필 이미지
김재영

작성한 질문수

질문하기