使用Python+openpyxl处理Excel报表:同步同测试用例long分区的Temp1-Temp5值至对应行
使用Python+openpyxl处理Excel报表:同步同测试用例long分区的Temp1-Temp5值至对应行
需求说明
你要处理的Excel报表场景很明确:
- 每个测试用例(对应Scenario列的同一个值,比如
A1.results.0.test1)会有多条数据行,分别对应不同的Partition类型(比如long、short) - 需要把同一个测试用例下,Partition为
long的那一行的Temp1到Temp5列的值,同步到该测试用例的其他所有行的对应Temp列中,最终让同一个测试用例的所有行Temp值都和long行保持一致
实现思路
要完成这个需求,我们可以分成两步来做,这样逻辑更清晰也更高效:
- 预收集数据:先遍历源表格,把每个测试用例(Scenario值)对应的long分区Temp1-Temp5值存在一个字典里——键是Scenario的值,值是对应的Temp列数值列表
- 写入并同步数据:再次遍历源表格,把每一行数据写入新报表的同时,对非long分区的行,根据它的Scenario值从字典里取出对应的Temp值,替换掉原行的Temp列内容
补全后的完整代码实现
下面是补全了你原有代码逻辑的完整版本,关键位置都加了注释说明:
import openpyxl as op import os import datetime input_file_path = r"C:\deleteme_flat" result_filename = "Report_Summary_" + datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S') + ".xlsx" result_file_path = os.path.join(input_file_path, result_filename) def job_summary_gen(): extension = '.xlsx' file_list = [] header_written = False new_wb = op.Workbook() new_wb['Sheet'].title = "Summary" ws2 = new_wb['Summary'] # 初始化目标表格的起始行 new_row = ws2.max_row if ws2.max_row == 1 else ws2.max_row + 1 # 存储每个测试用例对应的long分区Temp值:key=Scenario值,value=Temp1-Temp5的数值列表 scenario_temp_map = {} for root, dirs_list, files_list in os.walk(input_file_path): for file_name in files_list: if os.path.splitext(file_name)[-1] == extension and file_name == 'testReport.xlsx': file_name_path = os.path.join(root, file_name) print(f"正在处理文件:{file_name_path}") file_dir = os.path.dirname(file_name_path) folder_name = os.path.basename(file_dir) print(f"文件所属文件夹:{folder_name}") wb1 = op.load_workbook(file_name_path) ws1 = wb1['Summary'] # 第一步:自动识别表头列位置,避免硬编码列索引 scenario_col = None partition_col = None temp_cols = [] # 存储Temp1到Temp5的列索引(从1开始) # 遍历找表头行 for row_num, row in enumerate(ws1.iter_rows(values_only=True), start=1): row_str = str(row).lower() if 'scenario' in row_str and 'partition' in row_str: # 找到表头行,记录各列位置 for col_num, cell_val in enumerate(row, start=1): if cell_val and 'scenario' in str(cell_val).lower(): scenario_col = col_num elif cell_val and 'partition' in str(cell_val).lower(): partition_col = col_num elif cell_val and 'temp' in str(cell_val).lower(): temp_cols.append(col_num) break # 收集所有测试用例的long分区Temp值 for row in ws1.iter_rows(min_row=row_num + 1, values_only=False): scenario_val = row[scenario_col - 1].value partition_val = row[partition_col - 1].value if scenario_val and partition_val and 'long' in str(partition_val).lower(): # 提取当前行的Temp1-Temp5值 temp_values = [row[col - 1].value for col in temp_cols] scenario_temp_map[scenario_val] = temp_values # 第二步:写入表头(仅第一次处理文件时写入) if not header_written: ws2.cell(row=new_row, column=1).value = "File Name" for x in range(2, ws1.max_column + 1): cell_value = ws1.cell(row=row_num, column=x).value ws2.cell(row=new_row, column=x).value = cell_value new_row += 1 header_written = True # 遍历源表格数据行,写入目标表格并同步Temp值 for row in ws1.iter_rows(min_row=row_num + 1, values_only=False): scenario_val = row[scenario_col - 1].value partition_val = row[partition_col - 1].value # 写入文件名到第一列 ws2.cell(row=new_row, column=1).value = folder_name # 先复制当前行的所有原始数据 for x in range(2, ws1.max_column + 1): ws2.cell(row=new_row, column=x).value = row[x - 1].value # 如果当前行不是long分区,就用预存的Temp值替换 if scenario_val in scenario_temp_map and not ('long' in str(partition_val).lower()): for col_idx, temp_val in zip(temp_cols, scenario_temp_map[scenario_val]): ws2.cell(row=new_row, column=col_idx).value = temp_val new_row += 1 # 保存最终结果文件 new_wb.save(result_file_path) print(f"结果文件已成功保存至:{result_file_path}") job_summary_gen()
代码关键亮点
- 自动识别列位置:不再硬编码列索引,而是通过表头自动匹配Scenario、Partition和Temp列,适配表头位置变化的情况
- 预收集数据提升效率:只需要遍历一次源表格收集long分区的Temp值,后续写入时直接从字典取值,避免重复查找
- 逻辑清晰易维护:把数据收集和写入同步拆成两步,每一步的职责明确,后续修改需求也更方便
备注:内容来源于stack exchange,提问作者user2077648
相关产品推荐
相关产品推荐

