arxml文件导出接口信息并转为Excel格式存储
autosar arxml文件导出接口信息并转为Excel格式存储
·
autosar arxml文件导出接口信息并转为Excel格式存储
import pandas as pd
from lxml import etree
from pathlib import Path
from openpyxl import Workbook
from openpyxl.utils import get_column_letter
import re
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_idx, col in enumerate(worksheet.columns, 1):
# 计算最大内容长度
max_length = max(
len(str(cell.value))
for cell in col
if cell.value is not None
)
# 获取列字母(兼容所有版本)
column_letter = get_column_letter(col_idx)
worksheet.column_dimensions[column_letter].width = min(max_length + 2, 50) # 限制最大50
# 设置标题行样式
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()
如果想每一个element的port放在单独的sheet页上,则导出Excel的函数可以改写为如下:
def export_to_excel(data, output_file):
"""
将数据导出到Excel文件
"""
#接口根据element的不同,分别建立sheet页面
# 创建Excel writer对象
with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
# 按模块名称分组
df = pd.DataFrame(data)
grouped = df.groupby('Module')
# 为每个模块创建Sheet
for module_name, group_data in grouped:
# 清理Sheet名称(Excel限制31字符且不能包含特殊字符)
sheet_name = str(module_name)[:31].replace(':', '').replace('\\', '').replace('/', '').replace('?', '').replace('*', '').replace('[', '').replace(']', '')
# 写入数据到Sheet
group_data.to_excel(
writer,
index=False,
sheet_name=sheet_name,
columns=['Port Name', 'Port Type', 'Interface'] # 不再显示Module列
)
# 获取工作簿和工作表对象进行格式设置
workbook = writer.book
worksheet = writer.sheets[sheet_name]
# 设置列宽
for col_idx, col in enumerate(worksheet.columns, 1):
# 计算最大内容长度
max_length = max(
len(str(cell.value))
for cell in col
if cell.value is not None
)
# 获取列字母(兼容所有版本)
column_letter = get_column_letter(col_idx)
worksheet.column_dimensions[column_letter].width = min(max_length + 2, 50) # 限制最大50
# 设置标题行样式
for cell in worksheet[1]:
cell.font = Font(bold=True)
cell.fill = PatternFill(start_color="FFFF00", fill_type="solid")
# 在第一列前插入模块名称列
worksheet.insert_cols(1)
worksheet.cell(row=1, column=1, value='Module').font = Font(bold=True)
worksheet.cell(row=1, column=1).fill = PatternFill(start_color="FFFF00", fill_type="solid")
for idx, row in enumerate(worksheet.iter_rows(min_row=2, max_col=1, max_row=worksheet.max_row), 2):
for cell in row:
cell.value = module_name
# 调整模块名列宽度
worksheet.column_dimensions['A'].width = len(module_name) + 2
如果想要实现不同element拆分为不同excel,可做如下处理:
import pandas as pd
from lxml import etree
from pathlib import Path
from openpyxl import Workbook
from openpyxl.utils import get_column_letter
import re
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_dir):
"""
将数据按模块输出到多个Excel文件
:param data: 解析得到的端口数据列表
:param output_dir: 输出目录路径
"""
df = pd.DataFrame(data)
grouped = df.groupby('Module')
# 确保输出目录存在
Path(output_dir).mkdir(parents=True, exist_ok=True)
for module_name, group_data in grouped:
# 清理文件名(移除特殊字符)
safe_name = re.sub(r'[\\/*?:"<>|]', "", str(module_name))
output_file = Path(output_dir) / f"{safe_name}.xlsx"
# 创建新工作簿
workbook = Workbook()
worksheet = workbook.active
worksheet.title = "Ports"
# 设置Sheet名(格式:模块名_Port)
sheet_name = f"{module_name}_Port"[:31] # Excel限制31个字符
worksheet.title = re.sub(r'[\\/*?:"<>|]', "", sheet_name)
# 写入数据
headers = ['Module', 'Port Name', 'Port Type', 'Interface']
worksheet.append(headers)
for _, row in group_data.iterrows():
worksheet.append([row['Module'], row['Port Name'], row['Port Type'], row['Interface']])
# 设置列宽样式
for col_idx, col in enumerate(worksheet.columns, 1):
# 计算最大内容长度
max_length = max(
len(str(cell.value))
for cell in col
if cell.value is not None
)
# 获取列字母(兼容所有版本)
column_letter = get_column_letter(col_idx)
worksheet.column_dimensions[column_letter].width = min(max_length + 2, 50) # 限制最大50
for cell in worksheet[1]:
cell.font = Font(bold=True)
cell.fill = PatternFill(start_color="FFFF00", fill_type="solid")
# 调整模块名列宽度
worksheet.column_dimensions['A'].width = len(module_name) + 2
# 保存文件
workbook.save(output_file)
print(f"已生成: {output_file}")
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
# 设置输出目录(改为目录而不是单个文件)
output_dir = Path(arxml_file).with_name(f"{Path(arxml_file).stem}_ports")
# 导出到Excel
print(f"正在导出结果到 {output_dir}...")
export_to_excel(ports_data, output_dir)
print("处理完成!")
if __name__ == "__main__":
from openpyxl.styles import Font, PatternFill
main()

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)