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

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

윤병현님의 프로필 이미지
윤병현

작성한 질문수

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

블록 내에서 표 갯수 확인하기, 표 찾기

해결된 질문

작성

·

25

1

질문 남겨주셔서 감사합니다.

막히면 언제든 무엇이든 자주 질문 던져주세요.

수학/과학이나 알고리즘과는 달리

업무자동화 코딩은 고민해서 풀리는 경우가 정말 드뭅니다.

다시 말씀드리지만, 질문을 자주자주 남겨주세요.

저도 최대한 빠르게 회신 드리겠습니다.

당부드릴 두 가지가 있습니다.

① 가급적 구체적으로 설명해주세요.
② 특정 챕터 관련 질문 남겨주실 때는,
어느 챕터인지 알려주세요ㅜ

====================================

 

 안녕하세요 일코님

메일드렸는데 많이 바쁘신듯 하네요~ ㅠ.ㅠ

 

열심히 구현하고 있는데,

 

(1) 블록 설정된 내에서 표가 몇개 있는지 확인 하는것

 

(2) 표의 갯수를 확인하고 차례로 그 표를 찾아서 진입하는 방법

 

을 잘 모르겠습니다.

(3) 이전에 블록 내에서 텍스트를 검색하는 방법을 알려주셨었는데, 그것을 잘 활용하고 있는데요.

def 블록내_텍스트_포함_여부(text):
    try: 
        hwp.InitScan(Range=0xff)  # 0xff <<선택된 범위 내에서 검색
    except:
        hwp.InitScan(range=0xff)
    _, range_text = hwp.GetText()  # 텍스트만 추출
    hwp.ReleaseScan() # releaseScan이란 함수는 스캔을 해제.
    hwp.HAction.Run("MoveParaEnd")
    return f"{text}" in range_text # 이경우, 해당 target이 text에 포함되어있으면 True, 아니면 False를 반환.

 

python 터미널에서 행별로 코드를 실행할 때,

Range=0xff 를 했을때 올바른 파라미터가 아니라고 오류가 뜰때가 많더라구요

근데 또 이걸 py파일을 실행해서 했을떄는 되는거 같구요.
그래서 그냥 try except 구문을 쓰고있는데,

제가 뭔가를 잘못사용하고 있는 걸까요?

감사합니다.

답변 1

0

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

병현님 안녕하세요?

(메일은 오늘에야 회신을 드렸습니다^^;)

 

1. 블록 내 표의 갯수

두 가지 방법이 있습니다.

적절한 방법을 선택하시면 되겠습니다.

1-1. 선택부분을 블록저장하고 Table 갯수 세기

hwp.GetTextFile 메서드를 사용하면 간편합니다.

녹화_2024_12_14_14_03_56_265.gif
hwp.GetTextFile(format="HWPML2X", option="saveblock:true").count("<TABLE")

대신 표 안의 표도 별개로 카운트한다는 점 유의하시기 바랍니다.

 

1-2. ctrl의 pos를 일일이 확인하는 방법

hwp.GetSelectedPos() 메서드는 블록의 범위를 튜플로 반환합니다.

(블록상태이면 True, 시작리스트, 시작문단, 시작글자, 끝리스트, 끝문단, 끝글자)

녹화_2024_12_14_14_07_45_489.gif

hwp.GetSelectedPos()로 탐색할 범위를 찾았으니

표의 갯수는 표 ctrl을 순회하면서 해당하는 갯수만 찾으면 되겠습니다.

녹화_2024_12_14_14_22_13_672.gif

코드는 아래와 같습니다. (표 안의 표는 카운트하지 않습니다.)

# 블록선택 상태에서
slist, spara, spos, elist, epara, epos = hwp.GetSelectedPos()[1:]

count = 0
ctrl = hwp.HeadCtrl.Next.Next
while ctrl:
    if ctrl.UserDesc == "표":
        ctrl_pos = ctrl.GetAnchorPos(0)
        if spara <= ctrl_pos.Item("Para") <= epara and ctrl_pos.Item("List") == 0:
            count += 1
    ctrl = ctrl.Next

print("블록 내 표의 갯수 : ", count)

 

2. 표의 갯수를 확인하고 진입하기

위의 두 번째 방법은 사실 ctrl에 접근해서 갯수를 세는 방법이므로

위 코드를 조금만 수정하면 표 안에 접근하는 코드를 구현할 수 있습니다.

녹화_2024_12_14_14_28_56_916.gif

 

블록영역(본문) 내 각 표의 A1셀에 진입한 후, "Hello!\r\n" 문자열을 삽입하는 예시코드입니다.

# 블록선택 상태에서
slist, spara, spos, elist, epara, epos = hwp.GetSelectedPos()[1:]

count = 0
ctrl = hwp.HeadCtrl.Next.Next
while ctrl:
    if ctrl.UserDesc == "표":
        ctrl_pos = ctrl.GetAnchorPos(0)
        if spara <= ctrl_pos.Item("Para") <= epara and ctrl_pos.Item("List") == 0:
            # 표에 접근 및 수정하는 코드 삽입
            hwp.SetPosBySet(ctrl_pos)
            hwp.SelectCtrlFront()
            hwp.ShapeObjTextBoxEdit()
            hwp.insert_text("Hello!\r\n")
            # 표 수정하는 코드 종료

    ctrl = ctrl.Next

도움이 되었길 바랍니다.

행복한 하루 되세요!!!

윤병현님의 프로필 이미지
윤병현

작성한 질문수

질문하기