해결된 질문
작성
·
162
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))
이 부분이 이해가 잘 안됩니다.
hwp.PutFieldText("이름", "홍길동") 이게 기본 형태로 알고 있는데, 저건 어떤 형태인가요?? 해석이 안되네요
idx가 1인 경우에 대입하면, hwp.PutFieldText("이름{{1}} 성명{{1}} 생일{{1}} 취미{{1}}") 이렇게 있는데, 이름{{1}} 뒤에 1을 더하는 식으로 각 필드명에 적용한다는 건가요??
그리고 마지막 join(val)은 무슨 역할인가요???
답변 2
1
형주님, 안녕하세요?
예제에서 보여드린 방식은
대량의 텍스트 데이터를 여러 필드에 한 번에 넣고 싶을 때,
최고로 빠른 고급 방식입니다.
(pyhwpx의 hwp.put_field_text도 내부적으로는 이 방식을 대부분 활용하고 있습니다.)
코드가 조금 복잡해 보이지만
간단히 말씀드리면 결국 "한 개의 문자열로 병합해서 한 번에" 입력하는 방식인데요.
차근차근 알려드리겠습니다.
가장 low하게 필드에 텍스트를 넣는 방법부터.
이름필드 = "name"
이름 = "형주"
나이필드 = "age"
나이 = 25
hwp.PutFieldText(이름필드, 이름)
hwp.PutFieldText(나이필드, 나이)
위 코드를 실행하면 "name"이라는 필드가 "형주"라는 문자열로 채워지는데요. (알고 계시죠?)
근데 이걸 한 번에 입력하는 방법이 있습니다.
아래처럼 실행하시면 됩니다.
필드 = "name\x02age"
텍스트 = "형주\x0225"
hwp.PutFieldText(필드, 텍스트)
자세히 보시면 "\x02"라는 문자열로 구분지어져 있는데요.
이렇게 병합해서 한 번에 입력하는 방식이 hwp.PutFieldText를 여러 번 실행하는 방식보다 훨씬 빠릅니다.
근데 동일명의 필드가 여러 개인 경우!!! (질문 주신 예제에서처럼요)
n번째 필드에만 특정 텍스트를 넣고 싶을 때에는
필드이름 뒤에다 "{{n}}"이라는 인덱스문자열을 꼭 추가하셔야 합니다.
("{{n}}"이 없는 경우에는 모든 필드에 동일한 값이 들어가버리게 됩니다.)
{{n}}에 대한 궁금증은 해결되었기를 바랍니다.
문자열 메서드 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(엑셀파일명)
이렇게 실행하실 수도 있습니다. (단, 필드명과 엑셀의 칼럼명이 동일한 값들만 대입됩니다.)
표나 필드가 아예 준비되어 있지 않은 경우라도
hwp.table_from_data라는 메서드를 사용하시면
표가 자동생성됩니다.
도움이 되었길 바랍니다.
추가로 궁금한 부분이나, 구체적인 질문은
댓글이나 새질문으로 남겨주세요^^
행복한 하루 되세요!!!
1
안녕하세요, 인프런 AI 인턴입니다.
이형주님의 질문에 대한 답변을 찾기 위해 고민하였으나, 구체적으로 이와 동일한 상황을 다룬 내용을 찾는데 어려움이 있었습니다. 그러나 제공된 자료 중 아래의 내용이 이형주님의 질문과 연관이 있을 것 같아 추천해 드립니다.
“PutFieldText 함수 사용 관련 질문”에서 다루는 내용은 필드에 값을 넣는 방법에 대한 질문이며, Python과 아래아한글 자동화와 관련된 세부적인 구현 방법에 대한 답변을 제공하고 있습니다. 이 답변은 필드 삽입 방법에 대한 궁금증을 해결하는 데 도움이 될 수 있습니다.
이 답변에서 강사님이 제공한 코드 해설은 Python의 문자열 포매팅과 관련한 내용이 주를 이루며, f-string
포맷팅 방식을 사용해 특정 필드에 접근하는 방법과 필드의 중복을 허용하는 인덱스 사용 방법에 대해 설명하고 있습니다.
다만, 질문에서 언급하신 join(val)
은 위 링크에서 직접적으로 다루지 않고 있습니다. join(val)
메서드는 Python에서 문자열 리스트를 하나의 문자열로 병합할 때 사용되며, "\x02".join(val)
구문은 val
이라는 리스트의 각 요소를 \x02
문자열로 구분하여 하나의 문자열로 만드는 방법을 보여줍니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.