Daily Life of BlueRose

컴퓨터 & 코딩 공부/파이썬

파이썬 Library/API - pyWin32로 엑셀 조작하기

푸른로즈 2024. 4. 19. 20:41
728x90

여는 글

거창하게 사용방법 정리라고는 했지만, 사실 VBA에서 사용하던 코드를 거의 그대로 사용하기 때문에 몇몇 차이점만 주의하여 알면되는 편입니다.

 

대부분의 내용에서 이전에 다루었던 한글에 대한 조작과 대동소이하며, 응용프로그램을 켜거나 닫는 등의 기본기능은 제외하고 차이점 위주로 간단하게만 기술하겠습니다.

 

파이썬에서 달라지는 문법 정리

동일한 내용이라도 VBA와 Python에서 코드차이가 있다

차이가 나는 코드를 정리한 표


동일한 내용을 구현하는데 이상하게 차이가 난다. 이유까지는 모르겠지만... 아마 내부용 코드, 외부용 코드가 분리되어 있는게 아닐까 생각한다.

 

응용상의 팁

VBA의 강력한 접근성에도 불구하고 파이썬을 사용한다면, 아무래도 VBA의 10년도 넘은 구질구질한 제약에서 벗어날 수 있다는 점이 가장 메리트일 것이다. 특히 리스트나 튜플로 Range 개체를 저장할 때가 그러하다.

Range개체를 이용하여 여러 값들을 불러오는 경우, 가로방향은 하나의 튜플에 저장되며, 열방향은 각각 다른 튜플에 저장되어 2차원 형태로 저장된다.

이러한 튜플을 해제하여 하나의 리스트로 만들고 싶은 경우에는 리스트 컴프리헨션을 다음과 같이 사용한다.

[element for capsule in capsules for element in capsule]

언뜻 이해가 어려울 수 있으나 [표현식 / 외부 for문 / 내부 for문]으로 보면 이해가 쉽다.
tkinter의 askopenfilename메서드가 '취소'시 빈 문자열을 반환하는 것과 달리, 엑셀은 False를 반환하니 두 라이브러리를 모두 사용중이라면 혼동하지 않도록 주의가 필요하다.

728x90

 

win32기능으로 인한 주의사항

초기 바인딩 / 후기 바인딩 관련 사항

  • 초기 바인딩
    • 선언 : win32com.client.gencache.EnsureDispatch(ID)
    • 특징 : 파일 내부 구조를 미리 파악 후 바인딩하므로, 인텔리센스 기능이 내부구조를 알려주며 초기바인딩과 별개로 캐시생성 기능을 통해 내부구조를 py문서로 저장해두므로 이후에는 바인딩과 무관하게 내부구조에 대한 인텔리센스가 작동가능해진다.
    • 단점 : pyInstaller로 실행파일을 만들었을 때 캐시파일로 인한 오류 발생가능
  • 후기 바인딩 / 동적 바인딩
    • 선언 : win32com.client.Dispatch(ID)
    • 특징 : pyInstaller로 실행파일을 만들었을 때 genCache와 달리 오류하지 않음
    • 단점 : 인텔리센스로 내부구조를 알 수 없다

창 켜고 숨기기(win32gui / win32con)

작동하는 화면을 계속 보고 있을수도 없거니와, 창이 계속 떠있는 상태로 작동하면 아무래도 작업에 방해가 되기 마련이다. 물론 정작 오류날까봐 화면을 닫지 못하긴 하지만... 창을 안보이게 처리하는 방법은 아래와 같다.

import win32com.client as win32
import win32gui
import win32con
hwp = win32.Dispatch("HWPFrame.HwpObject")
    핸들값 = win32gui.FindWindow(클래스명, 작업표시줄 제목) #핸들값은 int값으로 나타남
win32gui.ShowWindow(핸들값, win32con.SW_HIDE) #창 숨기기
win32gui.ShowWindow(핸들값, win32con.SW_SHOW) #창 표시하기
  • 여기서 FindWindow의 클래스명은 일반적으로 None으로 기재한다(알기 어렵기 때문)
  • SW_HIDE는 상수값 0, SHOW는 상수값 5이며, 심볼릭 대신 1~5를 입력하면 각각에 해당하는 고유형태로 gui가 변경된다(1 : 작업표시줄에 보이기, 3: 최대화 등)

 

엑셀과 한글에서 라이브러리 적용법 차이

  • 엑셀은 excel.Visible = True 만으로 gui 숨기고 켜기가 가능하다.
  • 한글은 Dispatch만으로 gui가 드러나며, Visible 속성은 별도로 존재하지 않는다.
  • 종료 메서드 : 엑셀의 경우 .quit() / 한글의 경우 .Quit()으로 대소문자 차이가 있다.
반응형