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

如何实现每次运行函数时打印openpyxl中Excel的下一行数据?

逐行读取Excel数据并依次输出

项目场景

我正在做一个项目,用openpyxl读取Excel特定行列的值,填充网页表单,保存后再用下一行数据生成新表单。Excel数据如下:

First Name         Last Name         DOB

George             Hill              9/9/99
Sam                Genius            8/8/88
Bill               Smith             7/7/77

问题描述

我尝试多次运行代码(或函数),期望每次输出下一行的First Name,但当前代码每次都输出George,无法依次获取后续行的数据。

当前尝试的函数代码

def AddFirstName():
     for i in range(3):
       for row in ws.iter_rows(min_row=1, min_col=1, max_row=3,max_col=1):
         for cell in row:
            print(cell.value)
                
            break
       break  # 试图用break让循环只执行一次

AddFirstName()
AddFirstName()
AddFirstName()

当前尝试的非函数代码

for i in range(3):
   for row in ws.iter_rows(min_row=1, min_col=1, max_row=3,max_col=1):
     for cell in row:
        print(cell.value)
            
        break
   break  # 试图用break让循环只执行一次

当前输出

George
George
George

期望输出

George             
Sam                
Bill 

问题原因

每次调用函数或执行代码时,ws.iter_rows()都会从头开始迭代,所以每次都取到第一行的George。要实现逐行输出,必须保存迭代的状态,让下一次调用能接着上一次的位置继续读取。

解决方案

方案1:使用生成器(推荐,简洁优雅)

生成器会自动保存迭代位置,每次调用next()即可获取下一个值:

# 提前创建生成器,遍历First Name列(跳过表头,从第2行到第4行)
first_name_generator = (cell.value for row in ws.iter_rows(min_row=2, min_col=1, max_row=4, max_col=1) for cell in row)

def AddFirstName():
    print(next(first_name_generator))

# 三次调用依次输出三行数据
AddFirstName()
AddFirstName()
AddFirstName()

方案2:用全局变量维护行索引

通过全局变量记录当前读取的行号,每次调用后更新索引:

current_row = 2  # 从第2行开始,跳过表头

def AddFirstName():
    global current_row
    # 读取当前行第1列的值
    print(ws.cell(row=current_row, column=1).value)
    current_row += 1

AddFirstName()
AddFirstName()
AddFirstName()

方案3:类封装状态(适合复杂项目)

如果项目需要扩展更多读取逻辑,用类来封装状态更清晰:

class ExcelFormFiller:
    def __init__(self, worksheet):
        self.ws = worksheet
        self.current_row = 2  # 初始化从第2行开始
    
    def add_first_name(self):
        # 读取并打印当前行的First Name
        print(self.ws.cell(row=self.current_row, column=1).value)
        self.current_row += 1

# 实例化后调用
filler = ExcelFormFiller(ws)
filler.add_first_name()
filler.add_first_name()
filler.add_first_name()

以上三种方案都能实现期望的输出,根据项目复杂度选择即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:31:08