arxml文件导出接口信息并转为Excel格式存储

autosar arxml文件导出接口信息并转为Excel格式存储

import pandas as pd
from lxml import etree
from pathlib import Path
from openpyxl.utils import get_column_letter

def parse_arxml(arxml_file):
    """
    解析 ARXML 文件,提取 Port 和所属模块信息
    """
    # 加https://chat.deepseek.com/a/chat/s/6fbb6e79-c702-41c4-97e4-c7c8636e0484载并解析 ARXML 文件
    tree = etree.parse(arxml_file)
    root = tree.getroot()
    
    # 定义命名空间(根据实际ARXML文件调整)
    ns = {
        'ns': 'http://autosar.org/schema/r4.0',
        'xsi': 'http://www.w3.org/2001/XMLSchema-instance'
    }
    
    # 初始化结果列表
    ports_data = []
    
    # 查找所有包含 Port 的模块
    # 这里以查找 SW-Component 为例,实际可能需要根据ARXML结构调整
    for component in root.findall('.//ns:SW-COMPONENT-TYPE', ns):
        component_name = component.find('ns:SHORT-NAME', ns).text
        
        # 查找 P-Ports
        for p_port in component.findall('.//ns:P-PORT-PROTOTYPE', ns):
            port_name = p_port.find('ns:SHORT-NAME', ns).text
            ports_data.append({
                'Module': component_name,
                'Port Name': port_name,
                'Port Type': 'P-Port',
                'Interface': p_port.find('.//ns:PROVIDED-INTERFACE-TREF', ns).text if p_port.find('.//ns:PROVIDED-INTERFACE-TREF', ns) is not None else 'N/A'
            })
        
        # 查找 R-Ports
        for r_port in component.findall('.//ns:R-PORT-PROTOTYPE', ns):
            port_name = r_port.find('ns:SHORT-NAME', ns).text
            ports_data.append({
                'Module': component_name,
                'Port Name': port_name,
                'Port Type': 'R-Port',
                'Interface': r_port.find('.//ns:REQUIRED-INTERFACE-TREF', ns).text if r_port.find('.//ns:REQUIRED-INTERFACE-TREF', ns) is not None else 'N/A'
            })
    
    return ports_data

def export_to_excel(data, output_file):
    """
    将数据导出到Excel文件
    """
    # 创建DataFrame
    df = pd.DataFrame(data,columns = ['Module', 'Port Name', 'Port Type', 'Interface'])
    #print(df)
    
    # 导出到Excel
    with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
        df.to_excel(writer, index=False, sheet_name='Ports')
        
        # 获取工作簿和工作表对象进行格式设置
        workbook = writer.book
        worksheet = writer.sheets['Ports']
        
        # 设置列宽
        for col in worksheet.columns:
            max_length = max(len(str(cell.value)) for cell in col)
            worksheet.column_dimensions[col[0].column].width = max_length + 2
        
        # 设置标题行样式
        for cell in worksheet[1]:
            cell.font = Font(bold=True)
            cell.fill = PatternFill(start_color="FFFF00", fill_type="solid")

def main():
    # 输入ARXML文件路径
    arxml_file = input("请输入ARXML文件路径: ").strip('"')
    
    # 验证文件是否存在
    if not Path(arxml_file).exists():
        print(f"错误: 文件 {arxml_file} 不存在")
        return
    
    # 解析ARXML文件
    print("正在解析ARXML文件...")
    try:
        ports_data = parse_arxml(arxml_file)
    except Exception as e:
        print(f"解析ARXML文件时出错: {str(e)}")
        return
    
    if not ports_data:
        print("警告: 未找到任何Port信息")
        return
    
    # 设置输出Excel文件路径
    output_file = Path(arxml_file).with_name(f"{Path(arxml_file).stem}_ports.xlsx")
    #print(ports_data)
    # 导出到Excel
    print(f"正在导出结果到 {output_file}...")
    export_to_excel(ports_data, output_file)
    
    print("处理完成!")

if __name__ == "__main__":
    from openpyxl.styles import Font, PatternFill
    main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值