해결된 질문
작성
·
63
답변 2
1
현욱님 안녕하세요?
답변이 늦었습니다ㅜ
저 개인적으로는 임시 셀필드를 만들어서 엑셀데이터를 옮기는 방법을 자주 쓰지만,
필드를 쓰지 않고 셀 하나하나를 옮기는 방법이 필요한 경우도 있습니다.
(예를 들면, 엑셀파일의 날짜데이터나, 숫자데이터를 적절히 가공해야 한다든지요..)
두 가지 방법 다 예시를 보여드리겠습니다.
예시로 사용한 엑셀파일은 여기에서 다운받으실 수 있습니다.
표를 새로 생성하시는 경우라면, 필드를 쓰지 않고 아래 코드로 엑셀문서를 가져오실 수 있습니다.
from pyhwpx import Hwp
hwp = Hwp()
hwp.table_from_data(
data="괴상한취미특기.xlsx", # 엑셀파일 경로
treat_as_char=False, # 글자처럼 취급 여부
header=True, # 1행을 제목행으로 반복할지 여부
index=False, # 1열에 인덱스 삽입할지 여부
cell_fill=True, # 1행에 회색음영 여부
header_bold=True # 1행에 Bold 적용여부
)
# 표 전체너비는 유지한 채로 열 비율 조정하기
hwp.set_col_width([2,2,6,6])
저는 특별한 경우가 아니라면 이 방식을 가장 많이 사용하는데요.
이 경우에는
제목행을 제외한 모든 셀에 동일한 (아무) 이름의 셀필드를 모두 지정하면 됩니다.
엑셀데이터는 openpyxl이나 xlwings, pandas 등 여러가지 모듈 중 하나를 쓰시면 되는데,
아무래도 pandas가 가장 인기있는 모듈 아닌가 싶습니다. 참고할 포스팅도 많고요.
하여튼 엑셀문서를 데이터프레임으로 변환한 후,
값 부분만 1차원으로 펼쳐서 hwp.put_field_text
로 넣으시면 됩니다.
설명이 다소 장황한데(코드도 약간 장황할 수...ㅜ)
아래 판다스를 활용하는 코드와 시연화면을 보여드리겠습니다.
from pyhwpx import Hwp
import pandas as pd
hwp = Hwp()
# 엑셀파일을 1차원 리스트로 변환하기
df = pd.read_excel("괴상한취미특기.xlsx")
l = df.values.flatten().tolist()
# target번째 표의 첫 번째(A1)셀로 진입하기
target = 0
hwp.get_into_nth_table(target)
# 1행을 제외한 모든 셀 선택
hwp.TableLowerCell()
hwp.TableCellBlock()
hwp.TableCellBlockExtend()
hwp.TableColEnd()
hwp.TableColPageDown()
# 임시필드 넣고 값 채운 후 임시필드 지우기
hwp.set_cur_field_name("imsi") # 선택된 셀에 셀필드 지정하는 코드
hwp.put_field_text("imsi", l)
hwp.set_cur_field_name("") # 선택된 셀의 셀필드 이름 제거
hwp.Cancel()
코드가 다소 길어 보이지만, 동작 자체는 간단합니다.
①엑셀문서를 1차원으로 쫙 펼친 후에 ②put_field_text로 일괄로 넣는 작업이 전부입니다.
열마다 필드를 일일이 다른 이름으로 지정하지 않아도 되고, 서식도 잃지 않으면서
한/글 표와 엑셀 칼럼의 수만 일치하면 사용할 수 있는, 속도도 가장 빠르고 유용한 방법입니다.
엑셀데이터에 날짜데이터가 있거나, 1,000단위 콤마를 넣어야 하거나,
"3.0E-3" 같은 지수 서식의 문자열을 "3×10^-3"처럼 위첨자로 변환해야 한다든지 하는 경우에는
셀을 한땀한땀 hwp.insert_text
로 넣으면서 그때그때 조작해야 하는 경우가 있을 수도 있거든요.
(우선 put_field_text로 다 때려넣고, 다른 반복작업 코드로 후처리를 하는 방법도 있겠네요ㅎ)
하여튼 여러 가지 방법이 있겠지만, 1번 방법과 비슷하게 짜보면
from pyhwpx import Hwp
import pandas as pd
hwp = Hwp()
# 엑셀파일을 1차원 리스트로 변환하기
df = pd.read_excel("괴상한취미특기.xlsx")
l = df.values.flatten().tolist()
# target번째 표의 첫 번째(A1)셀로 진입하기
target = 0
hwp.get_into_nth_table(target)
# A2셀로 이동
hwp.TableLowerCell()
# 순차적으로 값 입력
for value in l:
hwp.insert_text(value)
hwp.TableRightCell()
제가 질문의 의도를 제대로 파악하지 못하고
다소 장황하게 설명을 드린 느낌입니다ㅜ
하여튼 남겨주신 질문에 대한 답변을 요약해보면
① 꼭 셀필드를 적용해야 하는 건 아니지만, 적용하면 편하고 빠릅니다.
② 셀필드를 삽입할 때 항상 속성창에 들어가서 직접 필드명을 입력하는 경우도 많아요.
근데 한 번에 여러 셀을 선택하고 필드명을 지정할 수 있으니까,
꼭 코드를 활용하지 않아도 금방 작업하실 수 있을 거예요.
위의 예시에서는 극단적으로 엑셀데이터가 들어갈 셀 전체의 필드명을
아예 한 개로 통일해버리고, 값도 무식하게 한 번에 넣어버렸는데요.
경우에 따라 적절한 방법을 생각하셔서 구현하시면 될 것 같아요^^
하여튼 저 개인적으로는 크게 특별한 경우가 아니면 1.② 방법을 가장 많이 쓰고 있어요.
하나씩 해보시면서 적절한 방법을 찾으시기 바랍니다.
추가로 질문 있으면 언제든 자유롭게 남겨주세요!
도움이 되었길 바랍니다.
행복한 하루 되세요^^
1
안녕하세요, 인프런 AI 인턴입니다. Hyunuk Seo님.
100x100 크기의 한글 표에 셀필드를 모두 지정해야 한다면, 수동으로 각 셀에 필드 이름을 지정하는 것은 매우 번거로운 작업이 될 것입니다. 이를 자동화하는 방법이 있습니다.
이전 질문에서도 유사한 문제에 대해 다룬 적이 있습니다. 아래에서 유사한 사례와 해결 방법을 참고하실 수 있도록 관련 링크를 제공하겠습니다.
해당 게시물에서는 셀필드명을 표에 자동으로 부여하는 코드 예제와 함께 설명하고 있습니다. 이를 통해 Hyunuk Seo님도 많은 셀에 대해 필드를 빠르게 지정할 수 있을 것입니다.
hwp = Hwp()
# 한글 문서 열기
hwp.Open(‘your_hwp_file.hwp’)
# 예: 100x100 크기의 셀 필드 자동 지정
table_rows = 100
table_cols = 100
for row in range(1, table_rows + 1):
for col in range(1, table_cols + 1):
fieldname = f”cell{row}_{col}”
hwp.MoveToField(field_name)
hwp.SetCurFieldName(field_name)
hwp.Save()
hwp.Quit()
“`
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
정성스러운 답변 감사합니다 .
적어주신 코드 하나씩 해보겠습다.
감사합니다.