"""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