Python自动化Excel薪资计算:循环遇0值终止问题求助
薪资计算自动化脚本问题排查
你的问题根源出在while循环的终止条件上:在Python中,数值0会被视为布尔值False,所以当工时单元格的值为0时,while ws.cell(row=hour_row, column=11).value: 这个条件直接不成立,循环提前终止,导致后续员工的工时数据都没被读取。
修正步骤:
修改循环判断条件
将两个while循环的判断逻辑从依赖值的布尔结果,改为明确判断单元格值不为None(只有当单元格完全没有内容时才停止循环):# 读取姓名的循环 while ws.cell(row=start_row, column=3).value is not None: name = ws.cell(row=start_row, column=3).value names.append(name) start_row += 22 # 读取工时的循环 while ws.cell(row=hour_row, column=11).value is not None: hour = ws.cell(row=hour_row, column=11).value hours.append(hour) hour_row +=22移除错误的跳过逻辑
你之前添加的if hour == 0: continue会直接丢掉0工时的员工记录,这不是你需要的,直接删掉这段代码即可。优化数据对应关系(可选但推荐)
目前分开存储姓名和工时列表的方式,存在数据错位的风险(比如某员工有姓名但工时单元格为空,导致两个列表长度不一致)。建议按员工为单位读取数据,确保姓名和工时一一对应:from openpyxl import load_workbook wb = load_workbook('payrollvalues.xlsx') ws = wb.active employees = [] current_name_row = 5 # 每个员工的工时行比姓名行多17行(22-5=17),根据你的表格结构调整 hour_row_offset = 17 while ws.cell(row=current_name_row, column=3).value is not None: name = ws.cell(row=current_name_row, column=3).value hour_cell = ws.cell(row=current_name_row + hour_row_offset, column=11) hour = hour_cell.value if hour_cell.value is not None else 0 employees.append({"name": name, "hour": hour}) current_name_row +=22 ws.delete_rows(1, ws.max_row) # 写入处理后的数据 for idx, emp in enumerate(employees, start=2): ws.cell(row=idx, column=1, value=emp["name"]) ws.cell(row=idx, column=2, value=emp["hour"])
关键说明
Python中,0、""(空字符串)、None都会被判定为布尔值False,所以直接用单元格值作为while循环的条件,会在遇到这些值时提前终止循环。只有明确判断value is not None,才能确保读取完所有有姓名/工时的员工记录。
内容的提问来源于stack exchange,提问作者Jhinny
相关产品推荐
相关产品推荐

