inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피

누름틀 없는 대량의 한/글 문서를 엑셀로 취합하기#라이브코딩

hwp.InitScan(Range=0x00ff).. pywintypes.com_error: (-2147352562, '매개 변수의 개수가 잘못되었습니다.', None, None)

해결된 질문

604

김용범

작성한 질문수 5

1

모듈화를 위해 다음과 같이 코드를 정리했습니다.

import win32com.client as win32
import os
from tkinter.filedialog import askopenfilenames, askopenfilename
from tkinter import Tk

def select_excel():
    win = Tk()
    win.withdraw()
    xlsx = askopenfilename(
        title = "엑셀파일을 고르세요",
        initialdir = os.getcwd(),
        filetypes = [("엑셀파일", "*.xlsx *xls")]
    )
    win.quit()
    return xlsx

def select_hwp():
    win = Tk()
    win.withdraw()
    hwp_file_list = askopenfilenames(
        title ="취합할 아래아 파일을 고르시오",
        initialdir=os.getcwd(),
        filetypes=[("아래아한글파일", "*.hwp *.hwpx")])
    win.quit()   
    return hwp_file_list

def open_hwp(file):
    hwp = win32.dynamic.Dispatch("HWPFrame.HwpObject")
    hwp.XHwpWindows.Item(0).Visible = True
    hwp.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule")
    hwp.Open(filename=file, Format="", arg="") # 한/글 파일 열기
    return hwp

def open_excel(xlsx):
    excel = win32.dynamic.Dispatch("Excel.Application")
    excel.DisplayAlerts = False 
    wb = excel.Workbooks.Open(xlsx)
    ws = wb.Worksheets(1)
    excel.Visible = True
    return excel, ws, wb

def get_text():
    hwp.InitScan(Range=0xff) # 선택한 셀의 문자를 추출하는 방법.. 꼭!! Range=0xff를 빼먹지마라!
    total_text =""
    state = 2
    while state not in [0,1]:
        state, text =hwp.GetText()
        total_text += text
    hwp.ReleaseScan()
    return total_text

def change_dir(path):
    os.chdir(path.rsplit("/", maxsplit=1)[0]) # 파일경로로 콘솔 이동

if __name__ == "__main__":
    excel_file = select_excel()
    change_dir(excel_file)
    excel, wb, ws = open_excel(excel_file)
    hwp_file_list = select_hwp()
    for file in hwp_file_list:
        hwp = open_hwp(file)
        ctrl = hwp.HeadCtrl
        while ctrl:
            if ctrl.CtrlID == 'tbl':
                hwp.SetPosBySet(ctrl.GetAnchorPos(0))
                break
            else:
                ctrl = ctrl.Next

        hwp.FindCtrl()
        hwp.Run("ShapeObjTableSelCell")

        contents = []
        contents.append(get_text())
        while hwp.HAction.Run("TableRightCell"):
            contents.append(get_text())

        과제명 = contents[1]
        신청부서 = contents[3].split("\r\n")[0].replace("/", "")
        과제담당관 = contents[3].split("\r\n")[1]
        담당공무원 = contents[5]
        연구방식_ =["위탁형", "공동연구형", "자문형"]
        연구방식 = [ i.strip() for i in contents[7].split("(")[1:]]
        for idx, text in enumerate(연구방식):
            if not text.startswith(")"):
                연구방식 = 연구방식_[idx]
        연구시작 = contents[9].split("~")[0].strip()
        연구종료 = contents[9].split("~")[1].split('(')[0].strip()
        연구기간 = contents[9].split("~")[1].split('(')[1].replace(")", "")
        예산항목_ = ["포괄", "사업별"]
        예산항목 = [i.strip() for i in contents[12].split("(")[1:]]
        for idx, text in enumerate(예산항목):
            if text.startswith(")"):
                pass
            else:
                예산항목 = 예산항목_[idx]
        예상금액 = contents[15]
        연구필요성 = contents[17]
        중복검토방법 = contents[21].split("\r\n")[1].replace("-", "").strip()
        중복성여부_ = ["있다", "없다"]
        중복성여부 = [ i.strip() for i in contents[21].split("\r\n")[2].split("(")[1:]]
        for idx, text in enumerate(중복성여부):
            if not text.startswith(")"):
                중복성여부 = 중복성여부_[idx]
        연구내용 = contents[23]
        연구결과활용방안 = contents[25]
        입력행 = len(ws.UsedRange()) + 1
        ws.Range(ws.Cells(입력행, 1), ws.Cells(입력행, 15)).Value = (과제명, 신청부서, 과제담당관, 담당공무원, 연구방식, 연구시작, 연구종료, 연구기간, 예산항목, 예상금액,
                연구필요성, 중복검토방법, 중복성여부, 연구내용, 연구결과활용방안)

    wb.Save()
    hwp.Quit()

 하지만 코드를 실행하니 다음과 같은 에러가 발생했습니다.

------------------------------------------------------

Traceback (most recent call last):

File "C:\Users\user\Desktop\Pyton_hwp_auto\pyinstallertest.py", line 74, in <module>

contents.append(get_text())

^^^^^^^^^^

File "C:\Users\user\Desktop\Pyton_hwp_auto\pyinstallertest.py", line 43, in get_text

hwp.InitScan(Range=0x00ff) # 선택한 셀의 문자를 추출하는 방법.. 꼭!! Range=0xff를 빼먹지마라!

^^^^^^^^^^^^^^^^^^^^^^^^^^

File "<COMObject HWPFrame.HwpObject>", line 3, in InitScan

pywintypes.com_error: (-2147352562, '매개 변수의 개수가 잘못되었습니다.', None, None)

------------------------------------------------------

무엇이 잘못된걸까요?

 

 

python 한컴오피스

답변 2

1

일코

앗ㅜ 셀프로 먼저 답변을 달아주셨네요ㅜㅜㅜ 죄송합니다.

 

맞습니다.

dynamic.Dispatch는 파라미터나 디폴트 인수를 가져오지 않은 채로 디스패치하는 방식인데요.

직접 모든 파라미터의 기본값을 지정해주지 않으면 매개변수 개수가 잘못되었다는 오류가 뜹니다.

 

사실 90년대 PC는 메모리 여유가 없었기 때문에

소모되는 메모리 공간을 최소화하기 위해 이런 동적 디스패치 옵션이 만들어져 있었지만,

현재에는 왠만한 PC에선 메모리가 부족할 일이 거의 없기 때문에

gencache.EnsureDispatch를 주로 사용하게 되었습니다.

그리고 사실 gencache.EnsureDispatch로 딱 한 번 오브젝트를 생성하시고 나면

이후에는 그냥 간단히 win32.Dispatch 명령어로만 오브젝트를 실행해도

내부적으로는 EnsureDispatch가 실행되게 됩니다.

(저는 코드를 공유한다든지, 강의 특성상, 매번 gencache.EnsureDispatch를 쓰고는 있습니다ㅜ)

 

참고해주시기 바랍니다^^

행복한 하루 되세요!!

1

김용범

hwp 변수를 정의(?)할때

hwp = win32.dynamic.Dispatch가 아니라 hwp = win32.gencache.EnsureDispatch로 바꾸니 해결되네요!

섹션7과 같은 수학 수식을 백지에서 시작할 때 어떻게 만들 수 있을까요?

0

76

1

hwp 병렬 작업시 클립보드 충돌문제

0

59

1

본문을 각주로 내리는 법

1

93

1

한글 자동화 삽도 삽입!!

1

384

2

한글 표 내부 위치 찾는 코드좀 알려주세요 ㅠㅠ

1

233

2

빈 문서를 새로 열때는 팝업이 안나오는데 기존 문서를 열면 팝업이 나옵니다

1

119

2

사무실 컴퓨터ㅠ

0

96

2

글자입력 여러번 실행기

0

69

1

현재 커서 문단에 아무런 내용이 없는지 확인하기

1

103

1

특정 스타일을 찾아 이동하는 방법

1

164

2

한/글 파일 open 시 '상위 버전에서...' 메세지 안 뜨게 하는 방법?

1

1116

1

win32com 으로 hwp 문자열 검색하기 문의

1

223

2

[응용] 엑셀문서 값을 필드에 입력하기 질

1

123

1

표 병합하기 관련

0

142

0

메타태그 삽입 자동화

0

191

1

스크립트 매크로 초기화 하고 싶습니다.

1

272

2

한글 창이 여러 개 존재할 때 pyhwpx 모듈로 접근하는 방법을 알고 싶습니다.

1

271

1

표안의 특정 필드에 있는 이미지를 복사하여 한글 외부에 저장하기

1

277

2

스타일 싹 다 지우고 바탕글로 통일하는 방법 문의드립니다.

1

285

0

하위의 여러 폴더 중 특정폴더의 사진만 추출하기

1

346

2

한글 수식을 자동으로 넣는 코드를 만들었는데, 수식 사이의 간격이 계속 벌어집니다.

1

661

1

보유 특허 검색 페이지에서 검색이 되지 않습니다.

1

139

1

hwp 페이지별 분할 저장하는 코드 관련 문의

0

449

0

한글 문서에 사용된 폰트명 추출

1

647

1