일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Android
- 비주얼베이직
- VBA
- 안드로이드
- 윈도우11
- Windows10
- 파이썬
- office
- python
- Excel
- 파이썬3
- 아웃룩
- 윈도우10
- git
- html
- Windows11
- 파워포인트
- python3
- windows
- pandas
- 엑셀
- matlab
- pythongui
- pyqt5
- 오피스
- 파이썬GUI
- 문자열
- 깃
- win32com
- Outlook
Appia의 IT세상
파이썬[Python] Project01-04 DBC_Loader, DBC를 Excel로 추출하기 본문
이번 포스팅에서는 앞서 DBC_Base를 바탕으로 DBC 정보를 Excel로 추출하는 부분입니다. 실제 이 부분에서는 많은 구설이 있을 수 있습니다만, 관련해서 저의 생각대로 해볼 의향입니다. 각 부분들에 대해서 간단히 설명을 하고 나서 메인 부분으로 들어가도록 하겠습니다.
파이썬[Python] Project01-02 DBC_Base Message/Siganl Class
먼저, 앞서서 다른 위의 링크에서 생성한 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'
위의 파일로 생성한 템플릿 파일은 다음과 같습니다.
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로 데이터 값을 쓰는 방법에 대해서 표시해 봤습니다. 이 부분분들은 마음껏 활용해서 원하시는 데로 수정해보시길 권장합니다.
'Python > Python 응용' 카테고리의 다른 글
파이썬[Python] 037 linked list 생성 및 활용 (0) | 2020.01.16 |
---|---|
파이썬[Python] 036 Array(배열) 사용하기 (0) | 2020.01.15 |
파이썬[Python] 036 py파일 - exe파일(실행파일) 만들기 (0) | 2020.01.13 |
파이썬[Python] 035 Container 타입의 Unpack (패킹/언패킹) (0) | 2020.01.11 |
파이썬[Python] Project01-03 DBC_Base Message/Siganl Class Commnet(주석) Parse 추가 (0) | 2020.01.10 |