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

Python自动化Excel薪资计算:循环遇0值终止问题求助

薪资计算自动化脚本问题排查

你的问题根源出在while循环的终止条件上:在Python中,数值0会被视为布尔值False,所以当工时单元格的值为0时,while ws.cell(row=hour_row, column=11).value: 这个条件直接不成立,循环提前终止,导致后续员工的工时数据都没被读取。

修正步骤:

  1. 修改循环判断条件
    将两个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
    
  2. 移除错误的跳过逻辑
    你之前添加的if hour == 0: continue会直接丢掉0工时的员工记录,这不是你需要的,直接删掉这段代码即可。

  3. 优化数据对应关系(可选但推荐)
    目前分开存储姓名和工时列表的方式,存在数据错位的风险(比如某员工有姓名但工时单元格为空,导致两个列表长度不一致)。建议按员工为单位读取数据,确保姓名和工时一一对应:

    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 10:06:26