Appia의 IT세상

파이썬 [Python] 017 win32com 이용하여 Excel 제어하기 본문

Python/Python 응용

파이썬 [Python] 017 win32com 이용하여 Excel 제어하기

Appia 2019. 12. 29. 12:44
반응형

앞서 포스팅에서 pywin32 설치하는 방법에 대해서 살펴 보았습니다. 그럼 이번 포스팅에서는 엑셀을 다루어 보는 방법에 대해서 살펴보고자 합니다. 물론, 많은 분들이 엑셀 파일을 별도로 다루는 모듈들을 사용하고 계시는 걸로 알고 있습니다. 모듈들 또한 장단점이 있습니다. 하지만, 저의 경우 win32com 사용하는 명확한 이유는 바로 보안등의 경우에서도 피해 있다는 장점이 있습니다. 설치하는 방법은 하기 링크 부분에서 참고하시길 바랍니다. 

 

불러오는 중입니다...

 

예를 들면, 특정 모듈의 경우 엑셀 파일에 직접 접근하여 데이터를 읽어 옵니다. 부분에서 특정 회사의 경우 보안등으로 인해서 암호화가 되는 경우가 있고 이로 인해서 읽어 없습니다. 하지만, COM API 사용하면, 그런 부분에서 많이 해방될 있습니다. COM API 엑셀 파일을 직접 건드리지 않습니다. 엑셀을 제어하여 엑셀 파일을 읽어오는 형태입니다.

 

다음 부분에 대해서 살펴보도록 하겠습니다.

 

Win32com 모듈 불러 오기

import win32com.client

Import 통해서 win32com.client 부분을 불러오시기 바랍니다.

 

 

엑셀 연결하고 파일 불러 오기

excel=win32com.client.Dispatch("Excel.Application")

workbook=excel.Workbooks.Open("fileName")

sheet=workbook.Sheets("sheetName")

 

엑셀에서 데이터 읽어오기 (row(행), column(열) 숫자로 표시)

 

sheet.Cells(row,column).Value

 

엑셀에 데이터 쓰기

 

sheet.Cells(row,column).Value = "Happy" 

 

엑셀 화면에 표시하기

excel.Visible = True 

 

파일 저장하고 파일 닫기

 

workbook.Close(savechanges=1)

 

엑셀 종료하기

 

excel.quit()

 

상기 부분들을 바탕으로 작업을 하실 수 있습니다. 실제 다양한 이유로 엑셀을 쓰지만, 한가지 주의 해야할 점이 있습니다. 스크립트 도는 동안에는 엑셀 작업을 하시면 안됩니다. 

 

저의 경우 대부분 작업을 엑셀에서 파이썬 내부 변수로 저장한 후 작업을 합니다. 하기 예제를 검토해 보겠습니다.

class Information_Signal:
    def __init__(self, SigName, SigDirection, Sender, Receiver, Length, DataType, InitialValue, Min, Max):
        self.SigName = SigName
        self.SigDirection = SigDirection
        self.Sender = Sender
        self.Receiver = Receiver
        self.BitLen = Length
        self.DataType = DataType
        self.Init_Val = InitialValue
        self.Min = Min
        self.Max = Max

class Cell:
    def __init__(self, SheetN, RowN, SigName, SigDirection, Sender, Receiver, Length, DataType, InitialValue, Min, Max):
        self.SheetN = SheetN
        self.CellInfo = RowN
        self.DetailedI = Information_Signal(SigName, SigDirection, Sender, Receiver, Length, DataType, InitialValue,
                                            Min, Max)


def Load_excel(sheetT):
    inIsystem = 2
    inIsignal = 14
    Information_List = []
    for i in range(4, 200000):
        if sheetT.Cells(i, 1).Value == None:
            break
        else:
            Ts = Cell(i, sheetT.Cells(i, inIsystem).Value, sheetT.Cells(i, inIsystem + 2).Value,
                      sheetT.Cells(i, inIsystem + 4).Value, sheetT.Cells(i, inIsystem + 5).Value,
                      sheetT.Cells(i, inIsignal).Value, sheetT.Cells(i, inIsignal + 2).Value,
                      sheetT.Cells(i, inIsignal + 3).Value, sheetT.Cells(i, inIsignal + 6).Value,
                      sheetT.Cells(i, inIsignal + 7).Value, )
            Information_List.append(Ts)
    return Information_List
    

 

제가 보기 좋게 하기 위해서 함수 안에서는 엔터 키를 한번씩 더 입력하였습니다. 관련해서 따라해보실 때에 검토하시길 바랍니다. 

그럼 먼저 위의 코드에 해서 간히 보겠습니다. 전 대부분 데이터들을 엑셀에서 파이썬 내부 변수로 저장합니다. 그 저장할때 모두 클래스로 정의해서 저장합니다. 그래서 먼저 셀을을 읽어오는 함수를 만들기 전에 column에 맞춰서 맴버를 만들고 관련해서 정의했습니다. 

 

이 부분을 토대로 엑셀에서 4번째 열부터 20000번쨰 열까지 반복하게 해 놓았습니다. 하지만, 조건문을 보듯이 반드시 데이터 들어가야할 열에 데이가 없으면 멈추게 해놓았습니다. 이와 같이 하면 데이터가 없는 지점부터는 종료하게 하는 하나의 꿀팁입니다. 

 

위와 같이 클래스들을 하나의 리스트로 저장하고 그 리스트르 반환하도록 하였습니다. 실제 제가 예전에 DBC파일 관련된 작업을 할 때 썼던 부분에서 관련된 부분을 좀 수정하여 올립니다. 참고하시길 바랍니다. 

 

혹 문의 사항 있으시면 언제든지 댓글 및 방명록에 글 부탁드리겠습니다. 

반응형
Comments