You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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行保持一致

实现思路

要完成这个需求,我们可以分成两步来做,这样逻辑更清晰也更高效:

  1. 预收集数据:先遍历源表格,把每个测试用例(Scenario值)对应的long分区Temp1-Temp5值存在一个字典里——键是Scenario的值,值是对应的Temp列数值列表
  2. 写入并同步数据:再次遍历源表格,把每一行数据写入新报表的同时,对非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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 11:23:09