124 lines
3.7 KiB
Python
124 lines
3.7 KiB
Python
"""MIL 测试用例 Excel 更新模块
|
|
|
|
主要功能:
|
|
- 比较新旧数据差异
|
|
- 添加新信号列或删除旧信号列
|
|
"""
|
|
import logging
|
|
from typing import Any
|
|
|
|
from .base import SignalData
|
|
from .exceptions import CaseDataError
|
|
from openpyxl import Workbook
|
|
from openpyxl.worksheet.worksheet import Worksheet
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def update_case_excel(filename: str, old_data: dict, new_data: dict) -> None:
|
|
"""更新 Excel 文件中的信号列
|
|
|
|
Args:
|
|
filename: Excel 文件路径
|
|
old_data: 旧数据字典
|
|
new_data: 新数据字典
|
|
|
|
Raises:
|
|
CaseDataError: 数据类型错误
|
|
"""
|
|
logger.info(f"开始更新 Excel 文件 {filename}")
|
|
|
|
old_wb = old_data.pop('wb')
|
|
old_sheet = old_data.pop('sheet')
|
|
old_source_row = old_data.pop('source_row')
|
|
|
|
new_data.pop('wb')
|
|
new_data.pop('sheet')
|
|
new_source_row = new_data.pop('source_row')
|
|
|
|
if not isinstance(old_wb, Workbook) or not isinstance(old_sheet, Worksheet):
|
|
logger.error("数据类型错误,Workbook 或 Worksheet 类型不匹配")
|
|
raise CaseDataError("数据异常,Workbook 或 Worksheet 类型错误")
|
|
|
|
add_input = _get_add_input(old_data, new_data)
|
|
del_input = _get_del_input(old_data, new_data)
|
|
datalog_len = _get_datalog_len(old_data)
|
|
|
|
for name, info in reversed(del_input.items()):
|
|
old_sheet.delete_cols(info['column'])
|
|
logger.info(f"删除第{info['column']}列\t信号名: {name}")
|
|
|
|
for name, info in add_input.items():
|
|
old_sheet.insert_cols(info['column'])
|
|
|
|
for index in range(1,old_source_row):
|
|
if index == old_source_row -1 :
|
|
old_sheet.cell(index, info['column']).value = info['attributes'][new_source_row - 1]
|
|
old_sheet.cell(index, info['column']).data_type = "str"
|
|
else:
|
|
old_sheet.cell(index, info['column']).value = info['attributes'][index]
|
|
old_sheet.cell(index, info['column']).data_type = "str"
|
|
|
|
for index in range(old_source_row + 1, datalog_len + old_source_row + 1):
|
|
try:
|
|
value = int(info['datalog'][0].value)
|
|
old_sheet.cell(index, info['column']).value = value
|
|
old_sheet.cell(index, info['column']).data_type = "int"
|
|
except (ValueError, TypeError):
|
|
value = str(info['datalog'][0].value)
|
|
old_sheet.cell(index, info['column']).value = value
|
|
old_sheet.cell(index, info['column']).data_type = "str"
|
|
logger.info(f"新增第{info['column']}列\t信号名: {name}")
|
|
|
|
old_wb.save(filename)
|
|
logger.info(f"更新 Excel 文件 {filename} 完成")
|
|
|
|
|
|
def _get_add_input(old_data: dict, new_data: dict) -> dict[str, SignalData]:
|
|
"""获取新增输入数据
|
|
|
|
Args:
|
|
old_data: 旧数据字典
|
|
new_data: 新数据字典
|
|
|
|
Returns:
|
|
新增信号字典
|
|
"""
|
|
add_input: dict[str, SignalData] = {}
|
|
|
|
for name in new_data.keys():
|
|
if name not in old_data.keys():
|
|
add_input[name] = new_data[name]
|
|
return add_input
|
|
|
|
|
|
def _get_del_input(old_data: dict, new_data: dict) -> dict[str, SignalData]:
|
|
"""获取删除输入数据
|
|
|
|
Args:
|
|
old_data: 旧数据字典
|
|
new_data: 新数据字典
|
|
|
|
Returns:
|
|
删除信号字典
|
|
"""
|
|
del_input: dict[str, SignalData] = {}
|
|
|
|
for name in old_data.keys():
|
|
if name not in new_data.keys():
|
|
del_input[name] = old_data[name]
|
|
return del_input
|
|
|
|
|
|
def _get_datalog_len(old_data: dict) -> int:
|
|
"""获取数据日志长度
|
|
|
|
Args:
|
|
old_data: 数据字典
|
|
|
|
Returns:
|
|
数据日志长度
|
|
"""
|
|
for name in old_data.keys():
|
|
return len(old_data[name]['datalog'])
|
|
return 0 |