Appia의 IT세상

파이썬[Python] Project01-04 DBC_Loader, DBC를 Excel로 추출하기 본문

Python/Python 응용

파이썬[Python] Project01-04 DBC_Loader, DBC를 Excel로 추출하기

Appia 2020. 1. 14. 07:24
반응형

이번 포스팅에서는 앞서 DBC_Base를 바탕으로 DBC 정보를 Excel로 추출하는 부분입니다. 실제 이 부분에서는 많은 구설이 있을 수 있습니다만, 관련해서 저의 생각대로 해볼 의향입니다. 각 부분들에 대해서 간단히 설명을 하고 나서 메인 부분으로 들어가도록 하겠습니다. 

파이썬[Python] Project01-02 DBC_Base Message/Siganl Class

 

파이썬[Python] Project01-02 DBC_Base Message/Siganl Class

앞서 포스팅에서 언급한 바와 같이 이번 포스팅에서는 DBC_Base부분으로 구성을 해볼까 합니다. DBC 파일을 읽어와서, Message, Signal 부분으로 나누어 저장하는 부분으로 구성이 됩니다. 전체적인 구성은 다음과..

appia.tistory.com

 

먼저, 앞서서 다른 위의 링크에서 생성한 DBC_Base라는 모듈을 Import 해야 합니다. 또한, 엑셀를 읽어오기 위해서, win32com를 읽어옵니다. 

from DBC_Base import *
import win32com.client

 

Connection_Excel

엑셀를 연결하는 부분입니다. 여기에서는 엑셀을 활성화 하고, 관련된 Sheet를 추가합니다. 이 부분을 반환하는 합수입니다. 

def Connection_Excel():
    Targetexcel = win32com.client.Dispatch("Excel.Application")
    Targetexcel.Visible = False
    Excel_Data = Targetexcel.Workbooks.Add()
    BD_Sheet = Excel_Data.Worksheets("Sheet1")
    BD_Sheet.Name = "DBC_File_Description"
    return BD_Sheet,Excel_Data,Targetexcel

 

Template

이 부분은 엑셀의 템플릿을 생성하는 부분입니다. 모든 부분들은 Signal을 바탕으로 돌아갑니다. 메시지 또한 표시를 하지만, 대부분 동작들은 Signal단위로 돌아갑니다. 

def Template(Sheet):
    #Cells(Row,Column)
    Sheet.Cells(1,1).Value = "Index"
    Sheet.Cells(1,2).Value = "MessageName"
    Sheet.Cells(1,3).Value = "MessageID"
    Sheet.Cells(1,4).Value = "TxNode"
    Sheet.Cells(1,5).Value = "Comment"
    Sheet.Cells(1,6).Value = "SignalName"
    Sheet.Cells(1, 7).Value = 'value_type'
    Sheet.Cells(1, 8).Value = 'byte_order'
    Sheet.Cells(1, 9).Value = 'start_bit'
    Sheet.Cells(1, 10).Value = 'signal_size'
    Sheet.Cells(1, 11).Value = 'factor'
    Sheet.Cells(1, 12).Value = 'offset'
    Sheet.Cells(1, 13).Value = 'minValue'
    Sheet.Cells(1, 14).Value = 'maxValue'
    Sheet.Cells(1, 15).Value = 'unit'
    Sheet.Cells(1, 16).Value = 'recevieNode'
    Sheet.Cells(1, 17).Value = 'commnet'

위의 파일로 생성한 템플릿 파일은 다음과 같습니다. 

Sample.XLSX
0.01MB

 

Write_Data

이 부분은 위의 Template를 바탕으로, 생성된 Class에서 각 데이터들을 엑셀에 명기하는 부분입니다. 

def Write_Data(Sheet,Data):
    i = 2
    for tMessage in Data:
        Sheet.Cells(i, 2).Value = tMessage.MessageName
        Sheet.Cells(i, 3).Value = tMessage.MessageID
        Sheet.Cells(i, 4).Value = tMessage.TxNode
        Sheet.Cells(i, 5).Value = tMessage.Commnet
        for signal in tMessage.signals :
            Sheet.Cells(i, 1).Value = i - 1
            Sheet.Cells(i, 6).Value = signal['signalName']
            Sheet.Cells(i, 7).Value = signal['value_type']
            Sheet.Cells(i, 8).Value = signal['byte_order']
            Sheet.Cells(i, 9).Value = signal['start_bit']
            Sheet.Cells(i, 10).Value = signal['signal_size']
            Sheet.Cells(i, 11).Value = signal['factor']
            Sheet.Cells(i, 12).Value = signal['offset']
            Sheet.Cells(i, 13).Value = signal['minValue']
            Sheet.Cells(i, 14).Value = signal['maxValue']
            Sheet.Cells(i, 15).Value = signal['unit']
            Sheet.Cells(i, 16).Value = signal['recevieNode']
            Sheet.Cells(i, 17).Value = signal['commnet']
            i = i + 1

다음과 같은 형태로 생성을 합니다. 

처음 Signal에 메시지에 대해 표시를 하고, 나머지 Signal들에서는 message에 표시를 하지 않습니다. 

 

Save_Excel

위의 명시된 파일을 excel파일로 정하는 부분입니다. 

def Save_Excel(Targetexcel,Excel_Data):
    PATH = "D:Data\DBC_"
    VSLogfile = PATH + "EXPORT_DATA.XLSX"

    Excel_Data.SaveAs(VSLogfile)
    Excel_Data.Close()
    Targetexcel.Application.Quit()

 

그럼, 전체 코드에 대해서 명시하겠습다. 

from DBC_Base import *
import win32com.client

def Connection_Excel():
    Targetexcel = win32com.client.Dispatch("Excel.Application")
    Targetexcel.Visible = False
    Excel_Data = Targetexcel.Workbooks.Add()
    BD_Sheet = Excel_Data.Worksheets("Sheet1")
    BD_Sheet.Name = "DBC_File_Description"
    return BD_Sheet,Excel_Data,Targetexcel

def Save_Excel(Targetexcel,Excel_Data):
    PATH = "D:Data\DBC_"
    VSLogfile = PATH + "EXPORT_DATA.XLSX"
    Excel_Data.SaveAs(VSLogfile)
    Excel_Data.Close()
    Targetexcel.Application.Quit()

def Template(Sheet):
    #Cells(Row,Column)
    Sheet.Cells(1,1).Value = "Index"
    Sheet.Cells(1,2).Value = "MessageName"
    Sheet.Cells(1,3).Value = "MessageID"
    Sheet.Cells(1,4).Value = "TxNode"
    Sheet.Cells(1,5).Value = "Comment"
    Sheet.Cells(1,6).Value = "SignalName"
    Sheet.Cells(1, 7).Value = 'value_type'
    Sheet.Cells(1, 8).Value = 'byte_order'
    Sheet.Cells(1, 9).Value = 'start_bit'
    Sheet.Cells(1, 10).Value = 'signal_size'
    Sheet.Cells(1, 11).Value = 'factor'
    Sheet.Cells(1, 12).Value = 'offset'
    Sheet.Cells(1, 13).Value = 'minValue'
    Sheet.Cells(1, 14).Value = 'maxValue'
    Sheet.Cells(1, 15).Value = 'unit'
    Sheet.Cells(1, 16).Value = 'recevieNode'
    Sheet.Cells(1, 17).Value = 'commnet'

def Write_Data(Sheet,Data):
    i = 2
    for tMessage in Data:
        Sheet.Cells(i, 2).Value = tMessage.MessageName
        Sheet.Cells(i, 3).Value = tMessage.MessageID
        Sheet.Cells(i, 4).Value = tMessage.TxNode
        Sheet.Cells(i, 5).Value = tMessage.Commnet
        for signal in tMessage.signals :
            Sheet.Cells(i, 1).Value = i - 1
            Sheet.Cells(i, 6).Value = signal['signalName']
            Sheet.Cells(i, 7).Value = signal['value_type']
            Sheet.Cells(i, 8).Value = signal['byte_order']
            Sheet.Cells(i, 9).Value = signal['start_bit']
            Sheet.Cells(i, 10).Value = signal['signal_size']
            Sheet.Cells(i, 11).Value = signal['factor']
            Sheet.Cells(i, 12).Value = signal['offset']
            Sheet.Cells(i, 13).Value = signal['minValue']
            Sheet.Cells(i, 14).Value = signal['maxValue']
            Sheet.Cells(i, 15).Value = signal['unit']
            Sheet.Cells(i, 16).Value = signal['recevieNode']
            Sheet.Cells(i, 17).Value = signal['commnet']
            i = i + 1

if __name__ == '__main__':
    DBCFile = r'D:\Test\chassis.dbc'
    Value = Load_DBC(DBCFile)
    BD_Sheet, Excel_Data, Targetexcel = Connection_Excel()
    Template(BD_Sheet)
    Write_Data(BD_Sheet,Value)
    Save_Excel(Targetexcel, Excel_Data)

 

이번 포스팅에서는 Excel로 데이터 값을 쓰는 방법에 대해서 표시해 봤습니다. 이 부분분들은 마음껏 활용해서 원하시는 데로 수정해보시길 권장합니다. 

반응형
Comments