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

모든 날짜 문자열 끝에 요일 붙이기

by 일코 2022. 12. 20.
반응형

안녕하세요? 이번 포스팅에서는

이번 포스팅에서는 "12.20." 이런 형식의 날짜 문자열을

"12.20.(화)"라고 요일을 붙이는 코딩을 알려드리겠습니다.

작업 개요

요새 연말이라 기성이나 준공계 제출 등으로 바쁘신 분들 많이 계시죠?

저는 최근에 이런 문서를 편집하게 되었습니다.

4_작업일정표.hwp
0.12MB

내용은 대략 아래와 같습니다.

이 밑으로 네 페이지가 더 있습니다.

 

날짜가 빼곡하게 적혀 있는 실적표입니다.

어떤 종류의 작업을 날마다 어느 현장에서 시행했는지 적어놓은 문서죠.

편집을 마무리할 때 쯤 저녁무렵이 되었는데,

날짜 뒤에 괄호로 요일을 전부 적어놓으면 더 낫지 않을까?ㅎㅎ

 

라는 의견이 불쑥 나왔습니다...

그렇다면

일반인이 생각하는 프로그래밍.. (출처: 조코딩)

요즘 한/글 자동화 포스팅을 부쩍 자주 올려서 그런지

뚝배기가 평소보다 잘 구릅니다.

머릿속에서 아이디어가 금방 정리되었습니다.

1. "month.day." 형식의 문자열을 온점(".")으로  split 하자.

2. 그걸 datetime.date(2022, month, day).weekday() 메서드 안에 넣어서 요일인덱스를 뽑고

3. ["월", "화", "수", "목", "금", "토", "일"][weekday] 로 출력하면 요일이 튀어나오니까

4. f"({weekday})" 라는 문자열을 셀 끝에 삽입해주면 되겠구나?

 

뼈대가 굉장히 간단해서 코드도 금방 짤 수 있었습니다.

최종 코드는 아래와 같습니다.

import datetime as dt
import win32com.client as win32

hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject")
hwp.XHwpWindows.Item(0).Visible = True
hwp.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule")
hwp.Open(r"C:\Users\smj02\Desktop\4_작업일정표.hwp")

# 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):
    """
    "month.day." 형식의 문자열을 입력으로 받고
    해당 일자의 weekday(0~6)를 리턴하는 함수
    """
    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)


def get_end_addr():
    """
    표 안에서 마지막 셀까지 직접 다녀와보고
    제일 마지막 셀의 주소를 리턴하는 함수
    """
    hwp.HAction.Run("TableColEnd")
    hwp.HAction.Run("TableColPageDown")
    end_addr = hwp.KeyIndicator()[-1]
    hwp.HAction.Run("TableColBegin")
    hwp.HAction.Run("TableColPageUp")
    return end_addr


def cell_select():
    """
    셀 선택 상태가 아니면 선택해주는 함수
    """
    if hwp.SelectionMode != 3:
        hwp.Run("TableCellBlock")


def main():
    """
    실행방법: 표의 "A1" 셀에 커서를 두고 main 실행
    """
    cell_select()  # 먼저 셀 선택상태로 해 놓고
    end_addr = get_end_addr()  # 끝 셀의 주소를 저장해놓은 다음
    while True:  # 계속해서
        text = get_value()  # 해당 셀의 문자열이
        if text.endswith("."):  # "."으로 끝나면
            hwp.Run("Cancel")  # 셀 선택 취소
            hwp.Run("MoveLineEnd")  # 커서를 문자열 끝으로 옮겨놓고
            weekday = get_weekday(text)  # 해당 일자의 요일을 추출해서
            insert_text(weekday)  # 셀에 붙여넣는다.
            hwp.Run("TableCellBlock")  # 다시 셀 선택상태로
        if hwp.KeyIndicator()[-1] == end_addr:  # 끝 셀에 다다르면
            hwp.Run("Cancel")  # 선택상태 해제하고
            break  # while문 탈출
        hwp.Run("TableRightCell")  # 요일 붙여넣기 후 계속해서 한 셀씩 우측으로 이동


main()  # 콘솔을 열어놓고 이 함수만 반복실행

어떤 모양으로 실행이 될지 기대되지 않으시나요?

 

실행화면을 보여드리겠습니다.

각각 표의 A1 셀에다 커서를 놓고 main()을 실행하니

날짜를 인식해서 요일을 붙여주었습니다.

파이썬이 인터프리터 언어라서 한/글 문서작업과 병행해서

코드를 적용할 수 있다는 게 참 유용한 것 같습니다.

 

오랜만에 코르가즘을 만끽한 시간이어서

공유해보았습니다.

 

행복한 하루 되세요!

 

반응형

댓글1