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

hrlee1266님의 프로필 이미지
hrlee1266

작성한 질문수

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

표에서 특정한 값 찾기 문제

해결된 질문

작성

·

109

1

화면 캡처 2024-07-24 202344.jpg

순번 5번, 8번의 8번째 칸의 모습처럼, 줄나누기후 같은 숫자(12)와 O를 넣는 자동화를 하고 싶습니다.

즉,

1. 일정한 순번을 리스트를 통해 나열하면 EX) [5, 8, 10-2, 12 ....]

2. 그 값이 있는 셀을 찾은 후 오른쪽으로 이동, 줄나누기, 셀에 값입력 이런 작업을 자동화 하고 싶은 것입니다.

 

2번 작업은 일상의 코딩님 강의와 블로그를 통해 해결할 수 있을 거 같긴한데,

1번 작업을 어떻게 처리할지 도저히 감히 잡히지 않습니다.

(블로그를 보면 찾기 명령어는 자동화에 사용하지 않는 것 같고,

hwp.find()를 이용하는 것도 감이 잡히지 않습니다.)

 

저런식으로 단순히 1,2,3으로 진행되는 것이 아니고, 중간 중간 규칙성 없이 가지번호(10-1,10-2)가 등장합니다 ㅠ

또한 숫자가 여러 열에 존재하고 있어서 1열(즉 순번열)에 있는 숫자만을 찾아야 한다는 문제도 있습니다.

 

자동화가 필요한 이유가 저런 식의 순번이 5천개가 넘어서 반드시 필요합니다.

도와주세요!!!

답변 2

1

hrlee1266님의 프로필 이미지
hrlee1266
질문자

와.. 이리 간단한거였다니....
회사여서 아직 코드를 실행해보지 못해 감동이 덜하지만, 퇴근해보고 천천히 느껴보겠습니다.

일감으로는, 첫 번째 방법이 더욱 효율적으로 느껴지네여.

항상 빠르고 친절한 답변 감사합니다.

1

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

hrlee1266님 안녕하세요?

말씀해 주신 경우는 두 가지 접근방식으로 사용 가능할 것 같습니다.

어느 정도 파이썬 문법을 알고 계신다는 가정하에

 

  1. 셀을 하나씩 내려가면서 매번 그 값이 리스트에 있는지 확인하는 방법입니다.

① 1행1열("순번" 셀)로 이동 후 : hwp.set_pos(n, 0, 0)

②아래로 내려가면서 : while hwp.TableLowerCell():

③셀의 값이 해당 리스트 안에 있는지 확인하고 : if hwp.get_selected_text() in target_list:

④있으면 우측으로 8칸 이동해서 특정 작업을 완료한 후 : main()

⑤다시 1열로 이동 : hwp.TableColBegin()

def main():
    for _ in range(8):
        hwp.TableRightCell()  # 우측으로 8칸 이동 후
    hwp.TableCellBlock()  # 셀블록
    hwp.TableCellBlockExtend()  # 셀블록 확장
    hwp.TableRightCell()  # 셀 두 개 선택
    hwp.TableSplitCell(Rows=2)  # 2행으로 쪼개기
    ...

target_list = ["5", "8", "10-2", "12"]

hwp.set_pos(n, 0, 0)
while hwp.TableLowerCell():
    if hwp.get_selected_text() in target_list:
        main()
        hwp.TableColBegin()

이런 식으로요.

 

  1. 두 번째 방법은, "찾기"를 이용한 방식입니다.

단, "온전한 낱말" 옵션으로 찾기를 실행하고, 매번 "표의 A열"에 있는지 추가로 체크해줘야 합니다.

① 문서 시작으로 이동 : hwp.MoveDocBegin()

② 리스트의 첫 요소부터 찾기 실행 : for i in target_list: hwp.find(i, WholeWordOnly=1)

③ 표 안에 있고, A행에 있는지 확인 : if hwp.get_cell_addr(as_="tuple")[1] == 0:

④ 작업 수행 : main()

target_list = ["5", "8", "10-2", ]

hwp.MoveDocBegin()
for i in target_list:
    hwp.find(i, WholeWordOnly=1)
    if hwp.get_cell_addr(as_="tuple")[1] == 0:
        main()

이런 식으로 수행하시면 될 것 같습니다.

 

추가로 질문이 있거나 오류가 발생하는 경우

댓글로 알려주시기 바랍니다.

 

감사합니다.

행복한 하루 되세요^^

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

아래 코드와 시연화면을 참고하시면 도움이 될까 하여 남겨놓습니다.

현재 pyhwpx 최신버전은 0.30.4입니다.

from pyhwpx import Hwp

hwp = Hwp()
hwp.open("작업/파일/경로.hwp")

def 작업():
    """
    현재 셀에서 우측의 8, 9(I, J)번째 셀을 
    두 행으로 나눈 후,
    아래 셀에 각각 "12", "O"를 추가하기  
    """
    for _ in range(8):
        hwp.TableRightCell()
    hwp.TableCellBlock()
    hwp.TableCellBlockExtend()
    hwp.TableRightCell()
    hwp.TableSplitCell(Rows=2)
    hwp.Cancel()
    hwp.TableLowerCell()
    hwp.insert_text("O")
    hwp.TableLeftCell()
    hwp.insert_text("12")


대상리스트 = ["5", "8", "10-2", "12"]

# 방법1
hwp.set_pos(2, 0, 0)
while hwp.TableLowerCell():
    if hwp.get_selected_text() in 대상리스트:
        작업()
        hwp.TableColBegin()


# 방법2
hwp.MoveDocBegin()
for i in 대상리스트:
    hwp.find(i, WholeWordOnly=True)
    if hwp.get_cell_addr(as_="tuple")[1] == 0:
        작업()

 

방법1을 사용한 시연화면

image

 

방법2를 사용한 시연화면

image

행복한 하루 되세요!

hrlee1266님의 프로필 이미지
hrlee1266
질문자

다시 한번 감사드립니다...

막연하게 공부하는 것만 같았는데,

아직 부족하여 질문하기는 했지만 배울 지식을 실제로 써먹을 수 있어서 뿌듯합니다.

무엇을 몰라 질문할 수 있다는 거 자체가 기분이 좋습니다.

일코님을 몰랐더라면 이걸 자동화할 수 있다는 거 자체를 생각치도 않았겟죠.

 

감사합니다. 건강하십시오

hrlee1266님의 프로필 이미지
hrlee1266

작성한 질문수

질문하기