파이썬(Python)

[ 파이썬 한글 자동화 ] 엑셀 표를 붙여 넣을 때 공백 지우기, 표 공백 지우기

카루루1007 2024. 10. 17. 12:02
728x90
반응형

엑셀에서 작업한 내용을 한글 프로그램에 붙여 넣을 때

아래 그림과 같이 공백이 생기는 경우가 있습니다.

 

이렇게 만들어지는 표 안의 공백을 자동으로 제거하는 코드입니다.

 

표 안의 셀에 커서를 두고 코드를 실행하면

아래와 같이 동작을 합니다.

 

 전체 코드

 

실행 중인 한글 파일을 제어하는 방법은 지난 블로그를 참고하세요

실행 중인 한글(Hwp, Hwpx) 프로그램 조작하기

 

import pythoncom
import win32com.client as win32

def get_running_hwp():

    pythoncom.CoInitialize()
    context = pythoncom.CreateBindCtx(0)
    running_coms = pythoncom.GetRunningObjectTable()
    monikers = running_coms.EnumRunning()

    max_value = -1
    result_moniker = None

    for moniker in monikers:
        name = moniker.GetDisplayName(context, moniker)

        if name.startswith("!HwpObject"):
            parts = name.split(".")
            try:
                number = int(parts[-1])
                if number > max_value:
                    max_value = number
                    result_moniker = moniker
            except ValueError:
                continue

    if result_moniker is not None:
        hwp_object = running_coms.GetObject(result_moniker)
        hwp_dispatch = hwp_object.QueryInterface(pythoncom.IID_IDispatch)
        hwp = win32.Dispatch(hwp_dispatch)
        return hwp

    return None
    
hwp = get_running_hwp()
    
temp_data= ""

select_table = hwp.CellShape
if select_table:
    print("표")
else:
    print("표 안의 셀 선택")

hwp.Run("Cancel")
hwp.Run("TableCellBlock")
hwp.Run("TableCellBlockExtend")
hwp.Run("TableCellBlockExtend")
hwp.Run("Cancel")


while True:
    table_data = hwp.KeyIndicator()[-1]

    hwp.Run("SelectAll")

    hwp.InitScan(0, 0x00ff, 0, 0, 0, 0)
    cell_text = hwp.GetText()[1]

    remove_blank = cell_text.strip()

    action = hwp.CreateAction("InsertText")
    parameter_set = action.CreateSet()
    parameter_set.SetItem("Text", remove_blank)
    action.Execute(parameter_set)
    hwp.Run("StyleShortcut1")   
    hwp.Run("TableCellBlock")

    hwp.Run("TableLeftCell")
    hwp.Run("Cancel")

    
    if table_data == temp_data:
        break
    
    temp_data = table_data

 

코드 설명

 

먼저 한글 프로그램을 조작할 객체를 생성합니다.

hwp = get_running_hwp()

 

모든 셀을 처리했는지 확인하기 위한 변수를 하나 생성합니다.

temp_data= ""

 

현재 커서의 위치가 표 안에 있는지 확인하는 코드입니다.

select_table = hwp.CellShape
if select_table:
    print("표")
else:
    print("표 안의 셀 선택")

한글 자동화와 관련된 HwpAutomation.pdf 파일을 보시면

CellShape는 다음과 같이 설명되어 있습니다.

현재 선택되어 있는 표와 셀의 모양 정보를 나타낸다.

ParameterSet/Table로 표의 속성에 대한 기본 정보를 나타내며, 이 가 운데 "Cell" 아이템이 ParameterSet/Cell로 셀의 속성을 나타낸다. 셀 블록이 잡혀있지 않은 상태이면 현재 캐럿이 위치한 셀 하나만을 대상으로 한다. 현재 표 내부에 캐럿이 위치하지 않으면 에러가 발생한다

※ 한글 자동화 관련 참고 문서 : 한글 문서(Hwp) 안의 표 개수 확인하기

 

즉 커서가 표 내부에 위치해 있지 않으면

에러가 발생하므로,

현재 커서가 표 내부에 있는지 확인할 수 있습니다.

 

표 전체를 선택하는 코드입니다.

hwp.Run("Cancel")
hwp.Run("TableCellBlock")
hwp.Run("TableCellBlockExtend")
hwp.Run("TableCellBlockExtend")
hwp.Run("Cancel")

이 코드는 

ESC 누르고 → F5 → F5 → F5 → ESC 키를 누릅니다.

 

사용자가 표 안의 셀에 커서를 두고 이 코드를 실행하면

먼저 ESC 키를 누릅니다.

ESC 키를 누르게 한 이유는 혹시 블록 지정으로 선택되었을 때 

단순히 커서를 위치해 놓은 상태로 바꾸기 위함입니다.

 

F5키를 세번 누르면 표 전체가 선택이 됩니다.

이때 활성화되는 셀은 제일 마지막 셀입니다.

 

여기서 ESC 키를 누르면 맨 마지막 셀에 커서가 위치하게 됩니다.

 

현재 셀에 대한 정보를 저장합니다.

table_data = hwp.KeyIndicator()[-1]

 

KeyIndicator() 함수는 한글 프로그램의 상태 표시줄 정보를 반환합니다.

실제 반환한 내용은 다음과 같습니다.

(True, 1, 1, 1, 1, 1, 1, 0, '(D13): 문자 입력')

 

[-1]을 하게 되면 맨 마지막의 (D13): 문자 입력만 변수에 저장됩니다.

 

현재는 맨 마지막 셀에 커서가 위치해 있습니다.

아래 코드는 현재 셀의 텍스트를 읽어와 텍스트의 공백을 제거하고

공백이 제거된 텍스트를 입력하는 코드입니다.

    hwp.Run("SelectAll")

    hwp.InitScan(0, 0x00ff, 0, 0, 0, 0)
    cell_text = hwp.GetText()[1]

    remove_blank = cell_text.strip()

    action = hwp.CreateAction("InsertText")
    parameter_set = action.CreateSet()
    parameter_set.SetItem("Text", remove_blank)
    action.Execute(parameter_set)
    
    hwp.Run("StyleShortcut1")

 

마지막 셀에서 SelectAll 즉, 한글에서 Ctrl+A를 한 것과 같이 

셀 안의 텍스트를 모두 선택한 후

InitScan()과 GetText()를 통해 셀 안에 입력된 텍스트를 읽어옵니다.

지정한 범위의 텍스트 출력하기, 선택 범위 텍스트 출력

 

그 다은 strip() 함수를 사용해 읽어온 텍스트의 왼쪽과 오른쪽의 공백을 제거합니다.

공백이 제거된 텍스트를 다시 해당 셀에 입력합니다.

 

그리고 엑셀에서 복사하면서 설정된 글자크기 배경색 등을 모두 지울 수 있도록

초기화합니다.

Run("StyleShortcut1")은 한글 프로그램에서 Ctrl + 1을 누른 것과 같은 기능입니다.

 

이 코드는 현재 셀의 왼쪽 셀로 이동하는 코드입니다.

    hwp.Run("TableCellBlock")
    hwp.Run("TableLeftCell")
    hwp.Run("Cancel")

    
    if table_data == temp_data:
        break
    
    temp_data = table_data

 

셀 블록 지정 후(F5를 한 번 누른 후)

왼쪽 셀로 이동한 다음, 다시 ESC 키를 눌러 해당 셀에 커서를 위치시킵니다.

그리고 아래 과정을 반복합니다.

    table_data = hwp.KeyIndicator()[-1]

    hwp.Run("SelectAll")

    hwp.InitScan(0, 0x00ff, 0, 0, 0, 0)
    cell_text = hwp.GetText()[1]

    remove_blank = cell_text.strip()

    action = hwp.CreateAction("InsertText")
    parameter_set = action.CreateSet()
    parameter_set.SetItem("Text", remove_blank)
    action.Execute(parameter_set)
    hwp.Run("StyleShortcut1")

 

table_data와 temp_data를 비교하는 이유는

맨 처음 셀에 도달했는지 확인하기 위함입니다.

 

맨 처음셀에 도달하여 처리하면 코드가 종료됩니다.

여기를 방문하시면 더 많은 파이썬 관련 자료를 확인할 수 있습니다.

파이썬 공부하기

728x90
반응형