如何实现每次运行函数时打印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
相关产品推荐
相关产品推荐

