exe 파일로 자동화 추출

이 범주에서는 한글 오토메이션에 대한 다른 사용자의 기술 지원을 제공받을 수 있습니다.

  1. 한글 오토메이션의 API 사용/연동은 개발 가이드를 참조하세요.
  2. 일반 문의는 한글과컴퓨터 웹사이트의 고객 지원을 이용하세요.
  3. 개인정보가 포함되지 않도록 유의하세요. 게시글 또는 댓글에 개인정보가 포함된 내용이 있을 경우 게시물이 숨김처리 될 수 있습니다.

안녕하세요, 한글 파일에 존재하는 표 자료를 자동 데이터 프레임화 하는 작업을 진행중에 있습니다.
제 컴퓨터에서는 한글 파일이 무리없이 열리는 것을 확인하였고, exe 파일의 구동 여부도 확인이 되었습니다.

허나, 타 컴퓨터 (vscode, python 등 설치 X, 한글 버전 다름)에서 exe 파일을 실행하면, 한글 파일이 열리지 않고 무한로딩되는 문제가 발생하고 있습니다.

아무래도 한글 자동화 코드를 exe로 변환하는 작업 사례가 많지 않아 어려움을 겪고 있어, 다양한 분들에게 자문을 구하고자 합니다.

코드 전문을 여기에 공유 드립니다.

%%

import win32com.client as win32
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import fnmatch
import os # 경로 확인 및 생성용 모듈

한글 프로그램 제어 객체 생성

hwp = win32.gencache.EnsureDispatch(“HWPFrame.HwpObject”)
hwp.XHwpWindows.Item(0).Visible = False
hwp.RegisterModule(“FilePathCheckDLL”,“SecurityModule”)

사용자로부터 파일 경로 입력받기

file_path = input("한글 파일 경로를 입력하세요 (예: C:/Users/username/Desktop/파일명.hwp): ").strip()

파일 열기

hwp.Open(file_path)

페이지 이동 함수

def goto_page(page):
hwp.HAction.GetDefault(“Goto”, hwp.HParameterSet.HGotoE.HSet)
hwp.HParameterSet.HGotoE.SetSelectionIndex = 1
hwp.HParameterSet.HGotoE.HSet.SetItem(“DialogResult”, page)
hwp.HAction.Execute(“Goto”, hwp.HParameterSet.HGotoE.HSet)

사용자로부터 이동하고자 하는 페이지 번호 입력받기

pages_input = input("이동할 페이지 번호를 입력하세요 (예: 33,34,35): ").strip()
pages_to_read = [int(page.strip()) for page in pages_input.split(‘,’)] # 입력받은 값을 리스트로 변환

페이지 이동 전 데이터 프레임 사전 정의

df = pd.DataFrame()

반복문을 통한 페이지 테이블 읽기

for page in pages_to_read:
goto_page(page)
# 해당 페이지 마지막 부분으로 이동
hwp.Run(“MovePageEnd”)
# 현재 페이지에서 테이블을 탐색하고 데이터 추출
ctrlcode = hwp.FindCtrl()
if ctrlcode == “tbl”: # 컨트롤코드의 아이디가 "표"라면?
#hwp.HAction.Run(“SelectCtrlFront”) # 문서 역방향의 컨트롤 선택
#hwp.HAction.Run(“SelectCtrlReverse”) # 문서 역방향의 컨트롤 선택
hwp.Run(‘ShapeObjTableSelCell’) # 표 첫번째 칸으로 이동
hwp.Run(“TableCellBlockExtend”) # 표 영역선택 활성화
hwp.Run(“TableCellBlockExtend”) # F5를 두 번 눌러서 셀 전체 선택
hwp.Run(“Copy”) #표 데이터를 클립보드로 복사
clipboard_data = pd.read_clipboard() # 클립보드 데이터를 dataframe으로 읽음

    # 엑셀 프로그램 제어 객체 생성
    excel = win32.gencache.EnsureDispatch("Excel.Application")
    excel.Visible = False
    wb = excel.Workbooks.Add()
    ws = wb.Worksheets(1) # 표가 들어갈 워크시트
    ws.Cells(1,1).Select() # 워크시트 첫번째 칸 선택
    excel.DisplayAlerts = False
    ws.Paste() # 붙여넣기
    ws.UsedRange.Copy() # 직전 작업영역 복사
    wb.Close() # 워크시트 종료
    excel.Quit() # 엑셀 프로그램 종료
    df = pd.read_clipboard() # 클립보드 복사 데이터 데이터 프레임화
    df.iloc[:,[0]] = df.iloc[:,[0]].ffill() # 보간
    df.columns = df.columns.str.replace(' ', '') #지점 또는 항목 명에 띄어쓰기 제거
    # 특정 키워드가 포함된 행을 검색하여 제거 ("평가시 지점비교")
    # applymap을 사용해 데이터프레임 전체에서 문자열이 포함된 셀 찾기
    mask = df.map(lambda x: '평가시 지점비교' in str(x) if pd.notnull(x) else False)

    # 행 단위로 True가 있는 행을 찾고 제거
    df_filt = df[~mask.any(axis=1)]

    # '-'와 '- '의 혼용을 처리하기 위해 정규 표현식을 사용하여 '-' 앞뒤 공백을 무시하고 NaN으로 변환
    df_filt = df_filt.replace(r'^\s*-\s*$', np.nan, regex=True) # 미조사 필터링
    df_filt = df_filt.replace(r'^\s*ND\s*$', np.nan, regex=True) # 검출한계 미만 필터링
    # 시계열을 위한 시간 데이터를 생성
    # 사용자에게 선택할 열 목록 제공
    selected_columns = input("선택할 조사 지점을 입력하세요 (예: A-1,A-2 또는 A-*): ").strip()

    # 모든 조사 지점을 선택하는 경우
    if '*' in selected_columns:
        # 와일드카드 패턴으로 열 선택 (예: A-*, B-*)
        pattern = selected_columns.strip()
        selected_columns = [col for col in df_filt.columns if fnmatch.fnmatch(col, pattern)]
        graph_title = "모든 정점"  # 그래프 제목을 "모든 정점"으로 설정
    else:
        # 조사 지점들 입력받아 리스트로 만듦
        selected_columns = selected_columns.split(',')
        graph_title = f"정점 ({', '.join(selected_columns)})"  # 조사 지점 이름으로 제목 생성

    # 0번째 열과 1번째 열을 결합하여 X축 레이블 생성
    df_filt['X_Label'] = df_filt.iloc[:, 0].astype(str) + ' ' + df_filt.iloc[:, 1].astype(str)

    # '평가시 지점비교'행 제거
    val = df_filt[df_filt['X_Label'] != '평가시 지점비교']  # '평가시 지점비교' 제외
                                
    # 선택한 열과 X_Label 열을 함께 선택하여 데이터프레임 생성
    val = val[['X_Label'] + list(selected_columns)]  # selected_columns는 리스트이므로 리스트로 변환

    # NaN 값이 있으면 문제를 발생시킬 수 있으므로 숫자형으로 변환하고 NaN을 제거
    val[selected_columns] = val[selected_columns].apply(pd.to_numeric, errors='coerce')

    # 모든 값이 NaN인 행은 제거
    val = val.dropna(subset=selected_columns, how='all')

    # 시계열 그래프 그리기 (X축은 시간 대신 레이블을 사용)
    plt.figure(figsize=(10, 6))
    # 폰트 설정
    plt.rcParams['font.family']='Malgun Gothic'
    plt.rcParams['axes.unicode_minus'] = False

    ylabel_title = df_filt.columns[0]  # 첫 번째 열의 제목
                                
    for column in selected_columns:
        plt.plot(val['X_Label'], val[column], label=column, marker='o')

    plt.title(f'{ylabel_title} {(graph_title)}')  # 제목 설정
    plt.xlabel('조사 시간')
    plt.ylabel(f'{ylabel_title}')
    plt.xticks(rotation=45, ha='right')  # X축 레이블을 회전시켜 보기 쉽게 조정
    plt.legend()
    plt.grid(True)
    plt.tight_layout()  # 레이블이 겹치지 않도록 레이아웃 조정
    # 사용자로부터 저장할 경로 입력받기
    save_path = input("그래프를 저장할 경로를 입력하세요 (예: C:/Users/username/Desktop/graph.png): ").strip()
    
     # 경로가 존재하지 않으면 디렉토리 생성
    directory = os.path.dirname(save_path)
    if not os.path.exists(directory):
        os.makedirs(directory)
        print(f"{directory} 경로가 생성되었습니다.")
        
    plt.savefig(save_path)  # 입력받은 경로에 그래프 저장
    plt.show()
    plt.close()
        
else:
    print(f"페이지 {page}에 표가 없습니다.")

새로운 PC에 모듈이 설치 되었는가 확인이 필요해 보이네요.
경로도 수기 입력인데 잘 넣었는지 체크도 해야 할것 같구요.

보안 모듈은 pyinstall 과정에서 포함시켜서 진행하였습니다.
경로 또한 수기 입력을 해결하기 위하여 콘솔창에 한글 파일을 드래그&드랍해서 입력하도록 유도하였습니다.

감사하게도, 다른 분들의 도움으로 타 컴퓨터에서 무한로딩 되는 문제는 해결되었습니다.

현재는 여전히 exe 실행 시 팝업되는 보안 창을 어떻게 해결할 수 있을지에 대하여 고민중입니다!

답변 감사합니다!