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

이형주님의 프로필 이미지

작성한 질문수

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

[응용] 엑셀문서 값을 필드에 입력하기

join(val) 코드 해석

해결된 질문

24.03.09 17:34 작성

·

142

2

챕터명: [응용] 엑셀문서 값을 필드에 입력하기

# 셀범위 값 전부 읽어오기
xlsx_values = [list(i) for i in ws.UsedRange()]

# 날짜 문자열 수정하기
for idx, val in enumerate(xlsx_values):
    if idx:  # [0]은 제목이므로 생일 수정안함
        xlsx_values[idx][2] = xlsx_values[idx][2].strftime("%Y년 %#m월 %#d일")

print(xlsx_values)
# >>> [['이름', '성별', '생일', '취미'],
# ...  ['마크', '남', '1984년 5월 14일', 'VR'],
# ...  ['빌', '남', '1955년 10월 28일', '기부'],
# ...  ['일론', '남', '1971년 6월 28일', '트위터'],
# ...  ['제프', '남', '1964년 1월 12일', '독서'],
# ...  ['리사', '여', '1969년 11월 7일', '게임'],
# ...  ['슬아', '여', '1983년 6월 16일', '쇼핑']]

# 1페이지 복사해 둠
hwp.Run("CopyPage")

for idx, val in enumerate(xlsx_values[1:]):
    if idx:  # idx가 0인 경우는 제외
        hwp.Run("PastePage")  # 페이지 붙여넣기
    hwp.PutFieldText(f"이름{{{{{idx}}}}}\x02성별{{{{{idx}}}}}\x02생일{{{{{idx}}}}}\x02취미{{{{{idx}}}}}", 
                     "\x02".join(val))  # 4개의 값을 한 번에 배치삽입하는 방법. "\x02"로 구분함.

위 코드에서

hwp.PutFieldText(f"이름{{{{{idx}}}}}\x02성별{{{{{idx}}}}}\x02생일{{{{{idx}}}}}\x02취미{{{{{idx}}}}}",

"\x02".join(val))

이 부분이 이해가 잘 안됩니다.

 

  1. hwp.PutFieldText("이름", "홍길동") 이게 기본 형태로 알고 있는데, 저건 어떤 형태인가요?? 해석이 안되네요

idx가 1인 경우에 대입하면, hwp.PutFieldText("이름{{1}} 성명{{1}} 생일{{1}} 취미{{1}}") 이렇게 있는데, 이름{{1}} 뒤에 1을 더하는 식으로 각 필드명에 적용한다는 건가요??

 

  1. 그리고 마지막 join(val)은 무슨 역할인가요???

 

 

답변 2

1

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

2024. 03. 10. 12:39

형주님, 안녕하세요?

예제에서 보여드린 방식은

대량의 텍스트 데이터를 여러 필드에 한 번에 넣고 싶을 때,

최고로 빠른 고급 방식입니다.

(pyhwpx의 hwp.put_field_text도 내부적으로는 이 방식을 대부분 활용하고 있습니다.)

 

코드가 조금 복잡해 보이지만

간단히 말씀드리면 결국 "한 개의 문자열로 병합해서 한 번에" 입력하는 방식인데요.

 

차근차근 알려드리겠습니다.

  1. 가장 low하게 필드에 텍스트를 넣는 방법부터.

이름필드 = "name"
이름 = "형주"
나이필드 = "age"
나이 = 25
hwp.PutFieldText(이름필드, 이름)
hwp.PutFieldText(나이필드, 나이)

위 코드를 실행하면 "name"이라는 필드가 "형주"라는 문자열로 채워지는데요. (알고 계시죠?)

근데 이걸 한 번에 입력하는 방법이 있습니다.

아래처럼 실행하시면 됩니다.

필드 = "name\x02age"
텍스트 = "형주\x0225"
hwp.PutFieldText(필드, 텍스트)

자세히 보시면 "\x02"라는 문자열로 구분지어져 있는데요.

이렇게 병합해서 한 번에 입력하는 방식이 hwp.PutFieldText를 여러 번 실행하는 방식보다 훨씬 빠릅니다.

 

근데 동일명의 필드가 여러 개인 경우!!! (질문 주신 예제에서처럼요)

n번째 필드에만 특정 텍스트를 넣고 싶을 때에는

필드이름 뒤에다 "{{n}}"이라는 인덱스문자열을 꼭 추가하셔야 합니다.

("{{n}}"이 없는 경우에는 모든 필드에 동일한 값이 들어가버리게 됩니다.)

 

{{n}}에 대한 궁금증은 해결되었기를 바랍니다.

 

  1. 문자열 메서드 join의 용도와 사용법

join은 제가 파이썬에서 가장 많이 사용하는 문자열 메서드 중 하나인데요.

리스트나 튜플의 값들을 하나의 문자열로 병합하는 기능을 합니다.

아래와 같이 사용합니다.

>>> fields = ["이름", "나이", "성별"]
>>> fields_str = "+++".join(fields)
>>> fields_str
"이름+++나이+++성별"

>>> "\x02".join(fields)
"이름\x02나이\x02성별"

 

이런 병합과정을 거치면

hwp.PutFieldText(필드명, 텍스트)

라고 한 줄만 입력해도 여러 필드를 한 번에 채울 수 있는 거죠.

 

그리고 만약 pyhwpx를 사용하신다면

위와 같은 복잡한 과정 없이

from pyhwpx import Hwp

hwp = Hwp()
hwp.open(파일명)
hwp.put_field_text(엑셀파일명)

이렇게 실행하실 수도 있습니다. (단, 필드명과 엑셀의 칼럼명이 동일한 값들만 대입됩니다.)

image

 

표나 필드가 아예 준비되어 있지 않은 경우라도

hwp.table_from_data라는 메서드를 사용하시면

표가 자동생성됩니다.

image

도움이 되었길 바랍니다.

추가로 궁금한 부분이나, 구체적인 질문은

댓글이나 새질문으로 남겨주세요^^

 

행복한 하루 되세요!!!

1

인프런 AI 인턴님의 프로필 이미지

2024. 03. 09. 17:36

안녕하세요, 인프런 AI 인턴입니다.

이형주님의 질문에 대한 답변을 찾기 위해 고민하였으나, 구체적으로 이와 동일한 상황을 다룬 내용을 찾는데 어려움이 있었습니다. 그러나 제공된 자료 중 아래의 내용이 이형주님의 질문과 연관이 있을 것 같아 추천해 드립니다.

“PutFieldText 함수 사용 관련 질문”에서 다루는 내용은 필드에 값을 넣는 방법에 대한 질문이며, Python과 아래아한글 자동화와 관련된 세부적인 구현 방법에 대한 답변을 제공하고 있습니다. 이 답변은 필드 삽입 방법에 대한 궁금증을 해결하는 데 도움이 될 수 있습니다.

이 답변에서 강사님이 제공한 코드 해설은 Python의 문자열 포매팅과 관련한 내용이 주를 이루며, f-string 포맷팅 방식을 사용해 특정 필드에 접근하는 방법과 필드의 중복을 허용하는 인덱스 사용 방법에 대해 설명하고 있습니다.

다만, 질문에서 언급하신 join(val)은 위 링크에서 직접적으로 다루지 않고 있습니다. join(val) 메서드는 Python에서 문자열 리스트를 하나의 문자열로 병합할 때 사용되며, "\x02".join(val) 구문은 val이라는 리스트의 각 요소를 \x02 문자열로 구분하여 하나의 문자열로 만드는 방법을 보여줍니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.