강의

멘토링

로드맵

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

Pureumae Lee님의 프로필 이미지
Pureumae Lee

작성한 질문수

파이썬 한글셀필드 응용 질문

작성

·

131

·

수정됨

1

안녕하세요! 사무보조알바하면서 자동화 프로그램을 만들어서 일에 도움이 될수있게 파이썬을 배우고있는 대학생입니다! 아래아 한글에 셀필드를 지정하고 셀들을 각 _3번까지 만들어두었습니다. 엑셀에서 각 시트별로 동일한 과제번호끼리 데이터를 가져와서 아래아한글파일에 각 과제번호 별로 데이터값을 넣어서 저장해주는 코드를 만들었는데 셀필드를 3개만 만들어두니까 데이터값이 3개 넘어가는거는 더 이상 저장이 안되더라구요.그래서 제가 아는 함수도 사용해봐도 셀이 추가되지않아서 데이터값이 들어가지않더라구요 ㅠㅡㅠ 혹시 어떻게 하면 될지 알려주실수있나요?

엑셀에서 한글파일에 데이터값을 넣는 코드 올려드립니다! 제발 해결됬으면 좋겠어요 ㅠㅠ

 import pandas as pd
from tkinter import Tk, filedialog
import win32com.client as win32
import os

def select_file(file_type):
    root = Tk()
    root.withdraw()
    file_path = filedialog.askopenfilename(
        filetypes=[(file_type, "*.xlsx" if file_type == "Excel files" else "*.hwp")]
    )
    root.destroy()
    return file_path

def read_excel(file_path):
    xls = pd.ExcelFile(file_path)
    data = {}

    for sheet_name in xls.sheet_names:
        df = pd.read_excel(xls, sheet_name=sheet_name)
        data[sheet_name] = df

    return data

def group_data_by_project_number(data):
    grouped_data = {}

    for sheet_name, df in data.items():
        if '과제번호' in df.columns:
            for _, row in df.iterrows():
                project_number = row['과제번호']
                if project_number not in grouped_data:
                    grouped_data[project_number] = {}
                if sheet_name not in grouped_data[project_number]:
                    grouped_data[project_number][sheet_name] = []
                grouped_data[project_number][sheet_name].append(row)

    return grouped_data

def fill_hwp_template(hwp_file_path, grouped_data, output_dir):
    hwp = win32.gencache.EnsureDispatch("HWPFrame.HwpObject")

    for project_number, data in grouped_data.items():
        hwp.Open(hwp_file_path)
        try:
            hwp.PutFieldText("과제번호", project_number)
            for sheet_name, rows in data.items():
                for index, row in enumerate(rows, start=1):
                    suffix = f"_{index}" if index > 1 else ""
                    if sheet_name == '0-1.과제기본정보':
                        hwp.PutFieldText(f"사업분야{suffix}", row.get('사업분야', ''))
                        hwp.PutFieldText(f"과제명{suffix}", row.get('과제명', ''))
                        hwp.PutFieldText(f"과제번호{suffix}", row.get('과제번호', ''))
                        hwp.PutFieldText(f"총괄책임자{suffix}", row.get('총괄책임자', ''))
                        hwp.PutFieldText(f"당해지원사업명{suffix}", row.get('당해지원사업명', ''))
                        hwp.PutFieldText(f"기술분류(대분류){suffix}", row.get('기술분류(대분류)', ''))
                        hwp.PutFieldText(f"기술분류(중분류){suffix}", row.get('기술분류(중분류)', ''))
                        hwp.PutFieldText(f"기술분류(소분류){suffix}", row.get('기술분류(소분류)', ''))
                        hwp.PutFieldText(f"연구개발단계{suffix}", row.get('연구개발단계', ''))
                        hwp.PutFieldText(f"과제유형{suffix}", row.get('과제유형', ''))
                        hwp.PutFieldText(f"주관기관{suffix}", row.get('주관기관', ''))
                        hwp.PutFieldText(f"총개발기간{suffix}", row.get('총개발기간', ''))
                        hwp.PutFieldText(f"참여기관{suffix}", row.get('참여기관', ''))
                        hwp.PutFieldText(f"성명{suffix}", row.get('성명', ''))
                        hwp.PutFieldText(f"직위{suffix}", row.get('직위', ''))
                        hwp.PutFieldText(f"휴대전화{suffix}", row.get('휴대전화', ''))
                        hwp.PutFieldText(f"소속기관{suffix}", row.get('소속기관', ''))
                        hwp.PutFieldText(f"전자우편{suffix}", row.get('전자우편', ''))
                    elif sheet_name == '0-2.참여기관현황':
                        hwp.PutFieldText(f"0-2.참여기관현황_기관명{suffix}", row.get('기관명', ''))
                        hwp.PutFieldText(f"0-2.참여기관현황_역할{suffix}", row.get('역할', ''))
                        hwp.PutFieldText(f"0-2.참여기관현황_사업자등록번호{suffix}", row.get('사업자등록번호', ''))
                        hwp.PutFieldText(f"0-2.참여기관현황_대표자{suffix}", row.get('대표자', ''))
                    elif sheet_name == '0-1-1.협약사업비':
                        hwp.PutFieldText(f"0-1-1.협약사업비_단계/연차{suffix}", row.get('단계/연차', ''))
                        hwp.PutFieldText(f"0-1-1.협약사업비_연도{suffix}", row.get('연도', ''))
                        hwp.PutFieldText(f"0-1-1.협약사업비_정부출연금{suffix}", row.get('정부출연금', ''))
                        hwp.PutFieldText(f"0-1-1.협약사업비_지자체{suffix}", row.get('지자체', ''))
                        hwp.PutFieldText(f"0-1-1.협약사업비_현금{suffix}", row.get('현금', ''))
                        hwp.PutFieldText(f"0-1-1.협약사업비_현물{suffix}", row.get('현물', ''))
                        hwp.PutFieldText(f"0-1-1.협약사업비_소계{suffix}", row.get('소계', ''))
                        hwp.PutFieldText(f"0-1-1.협약사업비_합계{suffix}", row.get('합계', ''))
                    elif sheet_name == '1.논문':
                        hwp.PutFieldText(f"1.논문_성과관리ID{suffix}", row.get('성과관리ID', ''))
                        hwp.PutFieldText(f"1.논문_성과년도{suffix}", row.get('성과년도', ''))
                        hwp.PutFieldText(f"1.논문_학술지구분{suffix}", row.get('학술지구분', ''))
                        hwp.PutFieldText(f"1.논문_논문명{suffix}", row.get('논문명', ''))
                        hwp.PutFieldText(f"1.논문_학술지명{suffix}", row.get('학술지명', ''))
                        hwp.PutFieldText(f"1.논문_ISSN{suffix}", row.get('ISSN', ''))
                        hwp.PutFieldText(f"1.논문_저자명{suffix}", row.get('저자명', ''))
                        hwp.PutFieldText(f"1.논문_발행일자{suffix}", row.get('발행일자', ''))
                        hwp.PutFieldText(f"1.논문_SCI구분{suffix}", row.get('SCI구분', ''))
                        hwp.PutFieldText(f"1.논문_기여율{suffix}", row.get('기여율', ''))
                        hwp.PutFieldText(f"1.논문_증빙제출여부{suffix}", row.get('증빙제출여부', ''))
                        hwp.PutFieldText(f"1.논문_비고(추가/삭제/수정/증빙보완등){suffix}", row.get('비고(추가/삭제/수정/증빙보완등)', ''))
            output_file = os.path.join(output_dir, f"{project_number}.hwp")
            hwp.SaveAs(output_file)
            print(f"Saved: {output_file}")
        except Exception as e:
            print(f"Error filling data for project {project_number}: {e}")
        finally:
            hwp.Clear(1)

    hwp.Quit()

def main():
    excel_file = select_file("Excel files")
    if not excel_file:
        print("No Excel file selected.")
        return

    excel_data = read_excel(excel_file)
    grouped_data = group_data_by_project_number(excel_data)

    hwp_template_file = select_file("HWP files")
    if not hwp_template_file:
        print("No HWP template file selected.")
        return

    root = Tk()
    root.withdraw()
    output_dir = filedialog.askdirectory()
    root.destroy()
    if not output_dir:
        print("No output directory selected.")
        return

    fill_hwp_template(hwp_template_file, grouped_data, output_dir)
    print("Data successfully filled into HWP files.")

if __name__ == "__main__":
    main()

답변 2

1

푸르매님 안녕하세요!

셀필드를 임의로 추가하는 방법은 굉장히 간단합니다.

행을 추가하려면 TableRightCellAppend 같은 액션,

열을 추가하려면 Split 같은 액션을 추가하시면 되고,

추가된 셀에 hwp.SetCurFieldName 액션으로 셀필드를 넣으시면 됩니다.

 

근데

추가할 셀이 행방향인지, 열방향인지에 따라 부가작업이 필요할 듯 합니다.

예를 들어,

열이 추가되는 방식이라면 : 너비에 맞게 짜여진 표의 우측 끝에 열을 추가하고,

너비를 재조정하는 작업이 병행되어야 하며,

행이 추가되는 방식이라면 : 전체 문서의 레이아웃이 틀어져버릴 수 있으므로

각 행의 높이를 조절해서 표너비를 고정한다든지,

혹은 특정 문단이나 표에서 페이지넘김을 한다든지 하는

작업들이 필요할 수도 있을 듯 하고요.

 

완성된 문서나, 템플릿 같은 걸 공유해주시면

참고해서 코드를 보완해드릴 수 있을 듯 한데

괜찮으시다면 메일 남겨주시겠어요?^^

martinii.fun@지메일입니다.

 

행복한 하루 되세요!!!

이거, 제 강의에 남겨주신 질문은 아닌 거죠? 헷갈리네요ㅜ

0

안녕하세요, 인프런 AI 인턴입니다. 님의 질문에 대해 답변드리겠습니다. 파이썬을 이용하여 아래아 한글 문서에서 셀 필드를 동적으로 추가하는 방법은 직접적으로 원본 코드에 포함되어 있지 않습니다. 아래아 한글 파일(HWP) 자동화를 위해 사용된 win32com.client 라이브러리는 HWP의 COM(Object Model)을 조작하여 문서 내용을 추가하거나 수정할 수 있게 도와줍니다. 그러나 셀(필드)을 동적으로 추가하는 기능은 HWP의 COM API가 제공하는 기능 중 하나가 아닐 수 있으며, 복잡한 스크립팅이나 추가적인 로직을 구현해야 할 수도 있습니다.

하나의 해결 방법으로, 필드를 미리 다수 만들어 두고 숨김 처리한 뒤 필요에 따라 보여주거나 필요한 필드 개수만큼 미리 생성해두는 방법을 고려할 수 있습니다. 그러나 이 방식은 각 문서마다 필요한 필드의 수가 정적이거나 예측 가능해야 효과적입니다.

사용자가 동적으로 필드를 추가하는 기능을 구현하길 원한다면, 아래아 한글 스크립트(HWP 스크립트)를 직접 작성하여 필드를 생성하는 로직을 구현한 후, 이 스크립트를 Python 코드에서 호출해 실행시키는 방법을 고려해 볼 수 있습니다. 이를 위해서는 아래아 한글 스크립트 언어에 대한 이해와 win32com.client 라이브러리를 사용하여 HWP와 상호 작용하는 방법에 대한 추가 학습이 필요할 수 있습니다.

또 다른 방법은 HWP 문서 편집이 가능한 다른 라이브러리나 도구를 찾아보는 것입니다. 현재 사용하고 계신 방법 외에도 HWP 파일을 편집할 수 있는 다양한 도구나 라이브러리가 존재할 수 있으며, 그 중 일부는 동적 필드 추가 같은 기능을 지원할 수도 있습니다.

결론적으로, 현재 코드에서 직접 필드를 동적으로 추가하는 기능을 구현하는 것은 상당한 커스터마이징을 필요로 합니다. 가능한 해결 방안을 탐색하면서, 필요에 따라 추가적인 라이브러리 사용이나 아래아 한글 스크립팅 학습을 고려해 보시길 권장합니다.

Pureumae Lee님의 프로필 이미지
Pureumae Lee

작성한 질문수

질문하기