基于Openpyxl实现同ID最后行额外打印任务的需求与优化
使用Openpyxl处理Excel时,在同一ID的最后一行执行额外任务
我需要用Openpyxl读取Excel文件,要求:
- 每行的Value重复打印3次
- 处理到同一ID的最后一行(或唯一行)时,执行额外的打印任务
现有代码已经能实现每行Value的3次重复打印,但无法触发同一ID最后一行的额外任务,相关信息如下:
示例表格
| ID | Value |
|---|---|
| 111/111 | A1 |
| 222/222 | B1 |
| 222/222 | B8 |
| 222/222 | B3 |
| 333/333 | C4 |
| 333/333 | C1 |
| 444/444 | D4 |
期望输出
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")
关键改动说明
- ID分组逻辑优化:移除冗余的
print_values标记,改为直接跟踪前一个ID,确保新ID出现时仅打印一次ID。 - 重复打印简化:通过直接输出+循环补打的方式,实现符合期望格式的3次重复打印。
- 最后一行判定逻辑:
- 先判断当前行是否为整个表格的最后一行
- 否则检查下一行ID是否与当前ID不同,以此确定是否为当前ID的最后一行
- 额外任务触发:一旦判定为当前ID的最后一行,立即执行额外打印任务。
- 代码精简:删除原代码中未使用的变量,优化流程逻辑,提升可读性。
内容的提问来源于stack exchange,提问作者Be Kind
相关产品推荐
相关产品推荐

