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

基于Openpyxl实现同ID最后行额外打印任务的需求与优化

使用Openpyxl处理Excel时,在同一ID的最后一行执行额外任务

我需要用Openpyxl读取Excel文件,要求:

  • 每行的Value重复打印3次
  • 处理到同一ID的最后一行(或唯一行)时,执行额外的打印任务

现有代码已经能实现每行Value的3次重复打印,但无法触发同一ID最后一行的额外任务,相关信息如下:

示例表格

IDValue
111/111A1
222/222B1
222/222B8
222/222B3
333/333C4
333/333C1
444/444D4

期望输出

111/111  
repeats 3 x print: A1  
...here will be some additional job...  
222/222  
repeats 3 x print: B1  
repeats 3 x print: B8  
repeats 3 x print: B3  
...here will be some additional job...  
333/333  
repeats 3 x print: C4  
repeats 3 x print: C1  
...here will be some additional job...  
444/444  
repeats 3 x print: D4  
...here will be some additional job...

end of the program

当前代码输出

ID: 111/111

>>>>>>>>>>>>>>>>>>>>
尝试: 1 / 3
这是第一个值: A1
----------------x
尝试: 2 / 3
这是第一个值: A1
----------------x
尝试: 3 / 3
这是第一个值: A1
----------------x
程序继续

...(其余ID输出格式类似)
Finished processing all rows.

现有代码

import time
import openpyxl

# Link na súbor v exceli
wb = openpyxl.load_workbook(
    'file_path')

# Aktívny hárok v exceli
sheet = wb['sheet1']

# Start z druhého riadku (hlavičky)
row_num = 2

previous_valueRČ = None
print_values = True

while row_num <= sheet.max_row:
    try:
        current_valueRČ = sheet.cell(row=row_num, column=2).value
        value_ŠUKL = sheet.cell(row=row_num, column=3).value
    except Exception as e:
        print(f"Problem reading value in cell: {e}")

    print("")        
    print(f"ID: {current_valueRČ}")    

    if current_valueRČ != previous_valueRČ or not print_values:
        # Reset printing flag and print new ID if necessary
        print_values = True
        if current_valueRČ != previous_valueRČ:
            print("")
            print(">>>>>>>>>>>>>>>>>>>>")
            #print(f"Rodné číslo: {current_valueRČ}")

        # Východzia pozícia pre 3x opakovanie ŠUKL a určenie status ak sa hodnoty zhodujú
            pokusy = 0
            match_found = False
            
            # Vnútorný loop pre repeat ŠUKL 3x
            while pokusy < 3 and not match_found:
                # Vytlačí číslo pokusu z troch opakovaní
                print(f"Pokus: {pokusy + 1} / 3")
                print(f"Toto je prvá hodnota: {value_ŠUKL}")

                # Statusy pre určenie zhody
                status1 = ("MATCH")
                status2 = ("NO MATCH")
                progr_pokr_True = ">>>> Program pokračuje..."
                progr_pokr_Presk = "Položka nebola 3x nájdená; PRESKAKUJEM !!!"
                progr_pokr_False = ">>>> Opakujem položku..."

                # Ukončenie sekcie výstupu (print) jednej položky
                print("----------------x")

                # Move to the next row ŠUKL (OK)
                # Interval pokusov musí byť na tejto intendácii!!!(5)
                pokusy += 1

            time.sleep(0.5)
            print("Program pokračuje")

            # Update printing flag after successful printing
            if value_ŠUKL is not None:
                1
                print_values = False  # Stop printing for this ID if a value is found

            # Posúva sa na ďalšie RČ (OK)
            row_num += 1

#Zavrie excelovský súbor
wb.close()

# Exit the program
print("Finished processing all rows.")

优化后的代码

import time
import openpyxl

# 加载Excel文件
wb = openpyxl.load_workbook('file_path')
sheet = wb['sheet1']

# 从第二行开始(跳过表头)
row_num = 2
max_row = sheet.max_row
previous_id = None

while row_num <= max_row:
    try:
        current_id = sheet.cell(row=row_num, column=2).value
        value = sheet.cell(row=row_num, column=3).value
    except Exception as e:
        print(f"读取单元格出错: {e}")
        row_num += 1
        continue

    # 首次遇到新ID时打印ID
    if current_id != previous_id:
        print(f"\n{current_id}")
        previous_id = current_id

    # 重复打印当前Value 3次
    print(f"repeats 3 x print: {value}")
    for _ in range(2):  # 已打印1次,补充2次完成3次重复
        print(f"repeats 3 x print: {value}")

    # 判断是否是当前ID的最后一行
    is_last_row = False
    # 若为表格最后一行,直接判定为当前ID的最后一行
    if row_num == max_row:
        is_last_row = True
    else:
        # 检查下一行ID是否与当前ID一致
        next_id = sheet.cell(row=row_num + 1, column=2).value
        if next_id != current_id:
            is_last_row = True

    # 触发额外任务
    if is_last_row:
        print("...here will be some additional job...")

    row_num += 1

# 关闭文件
wb.close()
print("\nend of the program")

关键改动说明

  1. ID分组逻辑优化:移除冗余的print_values标记,改为直接跟踪前一个ID,确保新ID出现时仅打印一次ID。
  2. 重复打印简化:通过直接输出+循环补打的方式,实现符合期望格式的3次重复打印。
  3. 最后一行判定逻辑:
    • 先判断当前行是否为整个表格的最后一行
    • 否则检查下一行ID是否与当前ID不同,以此确定是否为当前ID的最后一行
  4. 额外任务触发:一旦判定为当前ID的最后一行,立即执行额外打印任务。
  5. 代码精简:删除原代码中未使用的变量,优化流程逻辑,提升可读性。

内容的提问来源于stack exchange,提问作者Be Kind

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 01:56:04