해결된 질문
작성
·
172
1
섹션2 [응용] 엑셀문서 값을 필드에 입력하기
안녕하세요....선생님
만약 제가 관리하는 엑셀파일의 열별 정리순서가
["이름", "주소", "연락처", "성별", "생일", "취미"] 인 파일을 이용하여,
한/글 누름틀 적용하여 ["이름", "성별", "생일", "취미"]만 추출하고자 한다면....어떻게 해야 하는지요?
저는 누름틀을 이용하면 엑셀파일에서 [이름, 성별,생일,취미]에 해당하는 열에서 값을 불러와 한/글로 가져오는 줄 알았습니다만....실제로 해보니 [이름,주소,연락처,성별]로 파일이 생성되더군요.
코딩없이 한/글 메일머지를 이용하면 엑셀의 항목과 한/글의 항목이 일치하는 값을 불러와 주던데......
누름틀은 그렇지 않은 것인지...아니면 제가 실수한게 있는지 궁금합니다.
답변 2
1
현우님 안녕하세요!!ㅎ
연휴에도 이렇게 열심이신 걸 보면, 보통 분이 아니신데요?ㅎ
질문에 답변을 먼저 드리면,
필드와 메일머지는 굉장히 유사하게 작동합니다.
다만, 엑셀에서 값을 가져올 때, 칼럼명을 빼고 값만 가져오는 경우에는
말씀하신 것처럼, 작동할 수 있습니다.
이미 메일머지를 통해 값을 입력하는 개념을 잘 알고 계시니
저를 포함하여 많은 업무자동화 전문가들이 즐겨 사용하는
간편한 방법을 하나 미리 알려드리고자 합니다.
강의에서 알려드린 코드는 밑바닥까지 직접 구현한 관계로 굉장히 복잡한데요,
원리만 이해하시면 됩니다. 실제로는 이렇게 복잡하게 코딩하지 않습니다ㅜ 죄송
우선은 pywin32를 설치하셨던 것과 동일하게,
터미널에서 pip install pyhwpx
명령어로 pyhwpx
모듈을 설치해주시기 바랍니다.
혹은 주피터노트북의 아무 셀에서
%pip install pyhwpx
라고 한 번만 실행하셔도 됩니다.
설치를 완료하셨으면, 다시 주피터노트북으로 돌아가셔서
기존에 입력하셨던 아래 코드를 실행하지 마시고
import win32com.client as win32
hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject")
hwp.XHwpWindows.Item(0).Visible = True
hwp.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule")
아래의 코드를 대신 실행해보시기 바랍니다.
from pyhwpx import Hwp
hwp = Hwp()
이렇게 아래아한글을 실행해도 대부분의 코드는 동일하게 사용하실 수 있지만,
hwp.PutFieldText
의 작동방식이 더 간편해지고,
hwp.open
실행시, 전체경로를 입력하지 않아도 되는 등
몇 가지 기능보완 및 편의기능이 추가되어 있습니다.
그럼 pyhwpx
의 PutFieldText
활용예시를 몇 가지 보여드리겠습니다.
만약 삽입할 데이터가 들어있는 엑셀파일이 깔끔하게 메일머지 형태로 정리되어 있는 경우
hwp.PutFieldText(엑셀파일명)
을 실행하면 엑셀의 값이 필드 안에 고스란히 들어가게 됩니다.
질문 주셨던 것처럼, 엑셀문서 B열에 사이에 "별명" 칼럼이 끼어 있지만,
필드에 "별명"이 없으므로 누락되었습니다.
이 방법이 제일 간편하다면 간편하지만, 파이썬 단에서 조금도 값을 수정할 수 없으므로
미리 엑셀파일 안에 모든 값이 완벽하게 작성되어 있어야 합니다.
기왕 파이썬을 시작하셨다면, 꼭 pandas
를 공부해보시는 걸 강력히 추천드립니다.
엑셀파일을 다루는 것뿐만 아니라, 굉장히 방대한 데이터 처리 기능을 제공하므로
비단 아래아한글이나 엑셀 업무자동화 뿐만 아니라 통계나 차트, 각종 분석 등 고급 업무에
공부시간이 아깝지 않을 만큼 활용하실 수 있는, 파이썬의 가장 인기있는 라이브러리 중 하나입니다.
하여튼, 엑셀파일을 판다스 데이터프레임으로 불러와서
가공을 거친 후 삽입도 가능합니다.
import pandas as pd
df = pd.read_excel("엑셀파일.xlsx") # 데이터프레임 생성
df["특기"] = df["특기"] + "내기"
hwp.PutFieldText(df)
이런 방식으로 엑셀파일경로 문자열 대신 데이터프레임(df) 객체를 직접 집어넣을 수도 있습니다.
만약, 필드가 하나만 있고, 데이터프레임에서 특정 행만 넣고 싶은 경우는 아래처럼 실행하시면 됩니다.
hwp.PutFieldText(df.iloc[[2]])
df.iloc
는 "데이터프레임의 i번째 location"이라는 뜻입니다.
i번째 행의 데이터만 골라서 넣겠다는 뜻입니다. 이게 굉장히 유용한 경우가 있는데요.
메일머지로는 엑셀의 행 하나하나를 별도의 파일로 저장하는 것이 불가능합니다.
그런데 파이썬으로는 좀 더 세부적인 수준에서 필드를 다룰 수 있으므로,
예를 들어 엑셀행이 500개가 있다고 할 때, 500개의 파일을 별도로 생성하는 것이 가능합니다.
아래처럼 for문 안에서 실행하시면 됩니다.
for i in range(len(df)):
hwp.PutFieldText(df.iloc[[i]])
hwp.SaveAs(f"{df["이름"][i]}.hwp")
엑셀파일경로나 df 뿐만 아니라,
파이썬의 리스트나 딕셔너리, 혹은 딕셔너리안의 리스트 자료형도
동일하게 pyhwpx의 PutFieldText 기능을 통해 삽입 가능하므로
아마 생각하시는 거의 모든 작업은 필드를 통해 가능할 것으로 생각됩니다.
처음 질문 주셨던, "특정 칼럼만 골라서 필드에 삽입" 하는 기능은
win32com으로 구현하기에는 굉장히 까다로운 부분이 있는데
데이터프레임이나, PutFieldText의 내장기능을 활용하면
이렇게 간편하게도 구현할 수 있다는 점을 보여드리고 싶었습니다.
답변이 되었을지 모르겠습니다^^;;
하여튼 질문 주셨던 것처럼, 특정 칼럼을 배제하려면
딕셔너리 자료형으로 추출을 해서, 특정 칼럼명을 배제하거나
아니면 처음부터 특정칼럼을 빼고 리스트로 만들거나........
하여튼 상당히 까다롭습니다ㅜ 매번 이걸 코딩하기도 어렵고요.
가급적 위에 제안드린 방식을 한 번 검토해보시고
실무에 적용하시는 걸 추천드립니다.
또 자동화하시면서, 혹은 자동화하시고자 하는 업무 관련하여 질문이 있으면
언제든 편하게 추가질문 남겨주시기 바랍니다!!!!
감사합니다. 남은 연휴 잘 보내시기 바랍니다.
행복한 하루 되세요^^
1
안녕하세요, 인프런 AI 인턴입니다.
조현우님께서 질문하신 내용을 살펴보니, 엑셀 파일에서 특정 열을 선택하여 한글 파일에 적용하고자 하는 과정에서 문제를 겪으신 것 같아요.
핵심 개념 설명: 한글의 누름틀을 사용할 때, 원하는 항목만 선택하여 엑셀에서 불러와 매칭하는 방법이 핵심입니다. 문제는 아마도 엑셀의 열 순서와 한글 누름틀의 매칭이 올바르게 이루어지지 않는 것 같습니다. 기본적으로, 엑셀의 열 순서와 한글의 누름틀 순서는 서로 맞춰져야 하는데, 엑셀의 열 순서를 바꾸지 않고 누름틀에 필요한 항목만 선택하려면 코드에서 각각의 열 인덱스를 지정해주는 과정이 필요할 수 있습니다.
해결 방법:
코딩 방법 사용:
pandas
로 필요한 컬럼을 추출한 후, 이를 누름틀에 맞추어 적용하는 것입니다.누름틀의 매칭 순서 확인:
참고 자료:
- 누름틀 없는 한글문서 엑셀로 취합하기 응용 질문드려요: 한글 자동화에서 엑셀과의 데이터 매칭에 관한 내용을 다루며 유사한 상황에 대한 해결책을 제시합니다.
- 엑셀 문서값을 피드에서 응용하기 부분에서 질문 있습니다: 엑셀 값과 한글 문서의 필드를 매칭하는 다양한 방법을 제시합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.