엑셀에서 작업한 내용을 한글 프로그램에 붙여 넣을 때
아래 그림과 같이 공백이 생기는 경우가 있습니다.
이렇게 만들어지는 표 안의 공백을 자동으로 제거하는 코드입니다.
표 안의 셀에 커서를 두고 코드를 실행하면
아래와 같이 동작을 합니다.
전체 코드
실행 중인 한글 파일을 제어하는 방법은 지난 블로그를 참고하세요
※ 실행 중인 한글(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를 비교하는 이유는
맨 처음 셀에 도달했는지 확인하기 위함입니다.
맨 처음셀에 도달하여 처리하면 코드가 종료됩니다.
여기를 방문하시면 더 많은 파이썬 관련 자료를 확인할 수 있습니다.
'파이썬(Python)' 카테고리의 다른 글
[ 파이썬 한글 자동화 ] 표 안의 셀 너비와 높이 확인하기 (4) | 2024.10.25 |
---|---|
[ 파이썬 한글 자동화 ] 한글 문서 표 만들기, 한글 자동화 CreateAction(), CreateSet(), GetDefault(), SetItem(), Execute() (4) | 2024.10.24 |
[ 이미지 변환기 ] 그림 파일 용량, 이미지 사진 용량 줄이기 : 자작 프로그램 (2) | 2024.10.16 |
[ 파이썬 한글 자동화 ] 지정한 범위의 텍스트 출력하기, 선택 범위 텍스트 출력 (1) | 2024.10.14 |
[ 파이썬 한글 자동화 ] 숫자를 금액으로 바꾸기 : 금100,000원으로 바꾸기 (0) | 2024.10.14 |