회사에서 업무 자동화 목적으로 코딩을 하려는데, 보안 문제로 openpyxl을 사용하기가 어려웠습니다. Logic상에서 마지막 행의 번호가 필요했는데, Openpyxl에 있는 max_row을 사용하기 어려워서 곤란했습니다. 오늘은 저와 같은 상황에 놓인 분들을 위해 win32를 활용해 max_row와 유사한 기능을 구현하는 방법을 알아보겠습니다.
1. openpyxl 활용해서 행 번호 찾는 방법
Python에서 excel을 다룰 수 있는 module은 여러 가지가 있습니다. 가장 대표적인 것이 openpyxl인데, 범용성이 뛰어납니다.
openpyxl을 통해서 마지막 행을 찾는 방법은 간단합니다. 우선 import를 통해 module을 불러오고, wb과 ws를 객체로 형성한 뒤, "max_row"를 활용하면 됩니다.
#module import
import openpyxl
#wb, ws 활성화
wb = openpyxl.load_workbook(r"test.xlsx")
ws = wb.active
#최대 행값 or 최대 열값 구하기
col_max = ws.max_column
row_max = ws.max_row
#출력하기
print("최대 행 값: ", row_max)
print("최대 열 값: ", col_max)
하지만 openpyxl은 "DRM" 즉, 데이터 보안이 걸려있는 파일에 대한 접근성이 떨어지는 단점이 있습니다. 그래서 보안이 심한 회사에서 엑셀 자동화를 사용할 경우 Openpyxl은 적절하지 않을 수 있습니다.
2. win32.com을 활용하여 마지막 행 번호 찾는 방법
그래서 보안이 철저한 회사에서는 Openpyxl보다는 win32나 xlwings를 활용하는 것을 추천합니다. 오늘은 win32를 통해 최대 행 번호를 찾는 것을 알아보겠습니다.
목표는 아래 같이, data가 기입된 행의 마지막 번호를 python으로 찾는 것을 목표로 합니다. 이를 위해선 1) 모듈을 import 하고 2) wb과 ws를 활성화 3) UsedRange와 length를 활용하면 됩니다.
이를 코딩으로 풀어보면 아래와 같습니다. "UsedRange"에 대한 사용법은 여기 wikidocs의 2번째 내용을 참조하길 바랍니다.
#module import
import win32com.client
#excel 실행
excel = win32com.client.Dispatch("Excel.Application")
excel.Visible = True
#Wb과 Ws 활성화
wb = excel.Workbooks.Open("test.xlsx")
ws = wb.ActiveSheet
#ws에서 data가 기입된 범위 tuple로 반환
data = ws.UsedRange()
#length를 통해서 마지막 행 번호 출력
print(lenght(data))
위의 예시에서 이를 실행하게 되면 303이 출력됩니다. 이를 응용한다면, win32의 또 다른 기능인 오름차순 정렬을 한 뒤, 반복문을 활용하여 11번째 값부터 끝까지는 삭제하거나, 특정 값 이하로는 삭제하는 등의 기능을 구현할 수 있습니다.
win32는 다른 excel module에는 거의 없는 기능들도 보유하고 있어서, 굉장히 실용적인 module이라고 생각합니다. 물론, DRM이 걸려있지 않은 일반 컴퓨터에서는 범용적인 openpyxl을 추천합니다.
그러나 저와 같이 보안이 심한 회사에서 코딩을 할 계획이라면 openpyxl보다는 조금 어렵더라도 xlwings나 win32를 사용하길 추천드립니다.
함께 보면 좋은 글
댓글