diff --git a/main.py b/main.py index 9dfd77d..cd54c5d 100644 --- a/main.py +++ b/main.py @@ -16,11 +16,26 @@ P_LIMIT = 6 # 最大晋升次数 P_START = 10 # 晋升记录开始行 H_START = 15 + P_LIMIT # 历史记录开始行 -nowtime = datetime.now() +NOWTIME = datetime.now() + +# 全局变量 + +## 通过函数读取 +BaseData = pd.DataFrame() +Promote = pd.DataFrame() +Rule_Role = [] +Rule_Level = [] +Rule_RoleName = [] +Level_Limit = pd.DataFrame() +Promote_Level = pd.DataFrame() +Promote_verify = pd.DataFrame() + +## 统计量 +max_promote = 0 +max_history = 0 # 工具函数 -# 自定义日期解析函数 def custom_date_parser(x): try: return datetime.strptime(x, '%Y-%m-%d') @@ -53,89 +68,105 @@ def split_level(level:str): except: raise Exception(f"职级[{level}]格式错误") -# 读取员工数据 +# 读取信息 -BaseData = pd.read_excel("原数据.xlsx", sheet_name="入职信息") +def read_base_data(): # 读取员工数据 + global BaseData + BaseData = pd.read_excel("原数据.xlsx", sheet_name="入职信息") + for col in ["出生年月","任职年月","原职时间","参加工作时间","入职时间", "晋档起始", "晋级起始", "日期2"]: + BaseData[col] = BaseData[col].apply(custom_date_parser) + for col in ["晋档起始", "晋级起始"]: + BaseData[col] = BaseData[col].apply(lambda x: datetime(x.year, 1, 1) if isinstance(x, datetime) else x) + BaseData["Latest_Role"] = None + BaseData["Latest_Prom"] = None + BaseData["工龄调增"] = BaseData["工龄调增"].apply(to_int) + BaseData["工龄调减"] = BaseData["工龄调减"].apply(to_int) + BaseData["学龄"] = BaseData["学龄"].apply(to_int) + BaseData["工龄"] = BaseData.apply(lambda row: NOWTIME.year-row["参加工作时间"].year+row["工龄调增"]-row["工龄调减"]+1, axis=1) -for col in ["出生年月","任职年月","原职时间","参加工作时间","入职时间", "晋档起始", "晋级起始", "日期2"]: - BaseData[col] = BaseData[col].apply(custom_date_parser) -for col in ["晋档起始", "晋级起始"]: - BaseData[col] = BaseData[col].apply(lambda x: datetime(x.year, 1, 1) if isinstance(x, datetime) else x) +def read_promote(): # 读取晋升记录 + global Promote + Promote = pd.read_excel("原数据.xlsx", sheet_name="职务变动") + for col in ["任职时间","工资执行时间"]: + Promote[col] = Promote[col].apply(custom_date_parser) -BaseData["工龄调增"] = BaseData["工龄调增"].apply(to_int) -BaseData["工龄调减"] = BaseData["工龄调减"].apply(to_int) -BaseData["学龄"] = BaseData["学龄"].apply(to_int) -BaseData["工龄"] = BaseData.apply(lambda row: nowtime.year-row["参加工作时间"].year+row["工龄调增"]-row["工龄调减"]+1, axis=1) +def read_rule_role(): # 读取职位规则 + global Rule_Role + col = 4 + while True: + try: + rule = pd.read_excel("原数据.xlsx", sheet_name="职位规则",usecols=f"{get_column_letter(col)}:{get_column_letter(col+1)}", header=None) + Rule_Role.append({ + "start":rule.iloc[0,1], + "end":rule.iloc[1,1], + "rule":pd.read_excel("原数据.xlsx", sheet_name="职位规则",usecols=f"{get_column_letter(col)}:{get_column_letter(col+1)}",skiprows=2, names=["role","salary"]) + }) + col += 2 + except: + break + Rule_Role = sorted(Rule_Role, key=lambda x: x['start']) -# 读取晋升记录 +def read_rule_level(): # 读取职级规则 + global Rule_Level + col = 1 + while True: # 职级规则 + try: + rule = pd.read_excel("原数据.xlsx", sheet_name="职级规则",usecols=f"{get_column_letter(col)}:{get_column_letter(col+1)}", header=None) + Rule_Level.append({ + "start":rule.iloc[0,1], + "end":rule.iloc[1,1], + "rule":pd.read_excel("原数据.xlsx", sheet_name="职级规则",usecols=f"{get_column_letter(col)}:{get_column_letter(col+1)}",skiprows=2, names=["level","salary"]) + }) + col += 2 + except: + break + Rule_Level = sorted(Rule_Level, key=lambda x: x['start']) -Promote = pd.read_excel("原数据.xlsx", sheet_name="职务变动") # +def read_rule_role_name(): # 读取名称变化规则 + global Rule_RoleName + col = 1 + while True: # 名称变化 + try: + rule = pd.read_excel("原数据.xlsx", sheet_name="名称变化",usecols=f"{get_column_letter(col)}:{get_column_letter(col+1)}", header=None) + Rule_RoleName.append({ + "start":rule.iloc[0,1], + "end":rule.iloc[1,1], + "rule":pd.read_excel("原数据.xlsx", sheet_name="名称变化",usecols=f"{get_column_letter(col)}:{get_column_letter(col+1)}",skiprows=2) + }) + col += 2 + except: + break + Rule_RoleName = sorted(Rule_RoleName, key=lambda x: x['start']) -for col in ["任职时间","工资执行时间"]: - Promote[col] = Promote[col].apply(custom_date_parser) +def read_level_limit(): # 读取职位对应的级别限制 + global Level_Limit, Promote_Level + Level_Limit_tmp = pd.read_excel("原数据.xlsx", sheet_name="职位规则", usecols="A:A", skiprows=2, names=["limit"]) + Promote_Level_tmp = pd.read_excel("原数据.xlsx", sheet_name="职位规则", usecols="B:C", skiprows=2, names=["级别","档次"]) + Level_Limit = {} + Promote_Level = {} + for rule in Rule_Role: + for index, row in rule["rule"].iterrows(): + Level_Limit[row["role"]] = Level_Limit_tmp.iloc[index]["limit"] + Promote_Level[row["role"]] = (Promote_Level_tmp.iloc[index]["级别"], Promote_Level_tmp.iloc[index]["档次"]) -logging.info("人员信息加载完成") +def read_promote_verify(): # 读取晋升校验 + global Promote_verify + Promote_verify = pd.read_excel("原数据.xlsx", sheet_name="晋升校验", usecols="A:B") -# 读取规则 +def load_people(): + read_base_data() + read_promote() + logging.info("人员信息加载完成") -Rule_Role = [] -col = 4 -while True: # 职位规则 - try: - rule = pd.read_excel("原数据.xlsx", sheet_name="职位规则",usecols=f"{get_column_letter(col)}:{get_column_letter(col+1)}", header=None) - Rule_Role.append({ - "start":rule.iloc[0,1], - "end":rule.iloc[1,1], - "rule":pd.read_excel("原数据.xlsx", sheet_name="职位规则",usecols=f"{get_column_letter(col)}:{get_column_letter(col+1)}",skiprows=2, names=["role","salary"]) - }) - col += 2 - except: - break -Rule_Level = [] -col = 1 -while True: # 职级规则 - try: - rule = pd.read_excel("原数据.xlsx", sheet_name="职级规则",usecols=f"{get_column_letter(col)}:{get_column_letter(col+1)}", header=None) - Rule_Level.append({ - "start":rule.iloc[0,1], - "end":rule.iloc[1,1], - "rule":pd.read_excel("原数据.xlsx", sheet_name="职级规则",usecols=f"{get_column_letter(col)}:{get_column_letter(col+1)}",skiprows=2, names=["level","salary"]) - }) - col += 2 - except: - break -Rule_RoleName = [] -col = 1 -while True: # 名称变化 - try: - rule = pd.read_excel("原数据.xlsx", sheet_name="名称变化",usecols=f"{get_column_letter(col)}:{get_column_letter(col+1)}", header=None) - Rule_RoleName.append({ - "start":rule.iloc[0,1], - "end":rule.iloc[1,1], - "rule":pd.read_excel("原数据.xlsx", sheet_name="名称变化",usecols=f"{get_column_letter(col)}:{get_column_letter(col+1)}",skiprows=2) - }) - col += 2 - except: - break +def load_rule(): + read_rule_role() + read_rule_level() + read_rule_role_name() + read_level_limit() + read_promote_verify() + logging.info("规则加载完成") -# 读取职位对应的级别限制 -Level_Limit_tmp = pd.read_excel("原数据.xlsx", sheet_name="职位规则", usecols="A:A", skiprows=2, names=["limit"]) -Promote_Level_tmp = pd.read_excel("原数据.xlsx", sheet_name="职位规则", usecols="B:C", skiprows=2, names=["级别","档次"]) -Level_Limit = {} -Promote_Level = {} -for rule in Rule_Role: - for index, row in rule["rule"].iterrows(): - Level_Limit[row["role"]] = Level_Limit_tmp.iloc[index]["limit"] - Promote_Level[row["role"]] = (Promote_Level_tmp.iloc[index]["级别"], Promote_Level_tmp.iloc[index]["档次"]) - -# 晋升校验 -Promote_verify = Level_Limit_tmp = pd.read_excel("原数据.xlsx", sheet_name="晋升校验", usecols="A:B") - -logging.info("规则加载完成") - -Rule_Role = sorted(Rule_Role, key=lambda x: x['start']) -Rule_Level = sorted(Rule_Level, key=lambda x: x['start']) -Rule_RoleName = sorted(Rule_RoleName, key=lambda x: x['start']) +# 获取配置类函数 def role_salary(role:str, time): for rule in Rule_Role: @@ -167,8 +198,7 @@ def role_limit(role:str): logging.warning(f"职位[{role}]不存在职级上限规则") return -1 -max_promote = 0 -max_history = 0 +# 填充类辅助函数 def fill_basic_info(ws, row):# 填充基本信息 ws.cell(row=2, column=1, value=f"部门:{row['部门']} 职务:{row['职务']}") @@ -218,155 +248,160 @@ def fill_history_info(ws, History_pd):# 填充历史记录 ws.cell(row=H_START+index, column=7, value=hrow["变动原因"]) # ws.cell(row=H_START+index, column=8, value=index) # Debug -BaseData["Latest_Role"] = None -BaseData["Latest_Prom"] = None +def main(): -# 创建一个空的DataFrame来存储所有历史记录 -all_history = pd.DataFrame(columns=["身份证号码", "姓名", "时间", "职务", "职务工资", "级别档次", "级别工资", "工资合计", "变动原因", "晋升备注"]) + load_people() + load_rule() -for index, row in BaseData.iterrows(): - try: - logging.info(f"台账:第[{index+1}]共[{BaseData.shape[0]}]现在是[{row['身份证号码']}]") - BaseData.at[index, "Latest_Role"] = row["初始职务"] - BaseData.at[index, "Latest_Prom"] = row["入职时间"] - wb = load_workbook("模板/个人台账.xlsx") - ws = wb.active - fill_basic_info(ws, row)# 填充基本信息 + # 创建一个空的DataFrame来存储所有历史记录 + all_history = pd.DataFrame(columns=["身份证号码", "姓名", "时间", "职务", "职务工资", "级别档次", "级别工资", "工资合计", "变动原因", "晋升备注"]) - # 查找晋升信息 - promote = Promote[Promote["身份证号"] == row["身份证号码"]] - if not promote.empty: - promote = promote.sort_values(by=["工资执行时间", "任职时间"], ascending=[False, False]).reset_index(drop=True) - BaseData.at[index, "Latest_Role"] = promote.iloc[0]["新职务"] - BaseData.at[index, "Latest_Prom"] = promote.iloc[0]["任职时间"] - # 把原职务取出来 - if promote.shape[0] > 1: - BaseData.at[index, "职务2"] = promote.iloc[1]["新职务"] - BaseData.at[index, "日期2"] = promote.iloc[1]["任职时间"] - else: - BaseData.at[index, "职务2"] = row["初始职务"] - BaseData.at[index, "日期2"] = row["入职时间"] - - promote = promote.sort_values(by=["工资执行时间", "任职时间"]).reset_index(drop=True) - fill_prompt_info(ws, promote)# 填充晋升信息 - - # 根据规则匹配职级薪资 - History_pd = pd.DataFrame(columns=["时间", "职务", "职务工资", "级别档次", "级别工资", "工资合计", "变动原因", "晋升备注"]) - # 添加入职记录 - History_pd.loc[len(History_pd)] = [row["入职时间"], row["初始职务"], "", row["入职时的初始级别"], "", "", "套改/定级", ""] - for index, prow in promote.iterrows(): # 添加晋升记录 - History_pd.loc[len(History_pd)] = [prow["工资执行时间"]+relativedelta(hours=prow["任职时间"].month,minutes=prow["任职时间"].day), prow["新职务"], "", "", "", "", "晋升", f"任{prow['新职务']} {prow['变动批注'] if pd.notna(prow['变动批注']) else ''}"] + for index, row in BaseData.iterrows(): try: - calctime=row["晋档起始"] + relativedelta(minute=1) - while True: # 添加晋档记录 - calctime += relativedelta(years=row["晋档间隔"]) - if calctime > nowtime: - break - History_pd.loc[len(History_pd)] = [calctime, "", "", "", "", "", "两年晋档", ""] - calctime=row["晋级起始"] - while True: # 添加晋级记录 - calctime += relativedelta(years=row["晋级间隔"]) - if calctime > nowtime: - break - History_pd.loc[len(History_pd)] = [calctime, "", "", "", "", "", "五年晋级", ""] - except: - raise Exception(f"晋级、档起始或间隔时间格式错误:{row['晋级起始']}-{row['晋档起始']}-{row['晋级间隔']}-{row['晋档间隔']}") - for rule in Rule_Level: # 工资调标 - if row["入职时间"] < rule["start"]: - History_pd.loc[len(History_pd)] = [rule["start"], "", "", "", "", "", "工资调标", ""] - History_pd = History_pd.sort_values(by="时间").reset_index(drop=True) + logging.info(f"台账:第[{index+1}]共[{BaseData.shape[0]}]现在是[{row['身份证号码']}]") + BaseData.at[index, "Latest_Role"] = row["初始职务"] + BaseData.at[index, "Latest_Prom"] = row["入职时间"] + wb = load_workbook("模板/个人台账.xlsx") + ws = wb.active + fill_basic_info(ws, row)# 填充基本信息 - if History_pd.at[0,"时间"] != row["入职时间"]: - raise Exception(f"入职时间晚于其他时间:{row['入职时间']} < {History_pd.at[0,'时间']} ({History_pd.at[0,'变动原因']})") - for index, hrow in History_pd.iterrows(): # 数据计算 - # 调整职务职级 - if index > 0 and hrow["职务"] == "": - History_pd.at[index, "职务"] = History_pd.iloc[index-1]["职务"] - for rule in Rule_RoleName: # 名称变化 - if rule["start"] <= hrow["时间"] <= rule["end"]: - if History_pd.iloc[index]["职务"] in rule["rule"]["原名称"].values: - History_pd.at[index, "职务"] = rule["rule"][rule["rule"]["原名称"] == History_pd.iloc[index]["职务"]]["现名称"].values[0] - if index > 0 and hrow["级别档次"] == "": - jb, dc = split_level(History_pd.iloc[index-1]["级别档次"]) - if hrow["变动原因"] == "两年晋档": - History_pd.at[index, "级别档次"] = f"{jb}-{dc+1}" - elif hrow["变动原因"] == "五年晋级": - if jb-1 < 1 or jb-1 < role_limit(History_pd.iloc[index]["职务"]): + # 查找晋升信息 + promote = Promote[Promote["身份证号"] == row["身份证号码"]] + if not promote.empty: + promote = promote.sort_values(by=["工资执行时间", "任职时间"], ascending=[False, False]).reset_index(drop=True) + BaseData.at[index, "Latest_Role"] = promote.iloc[0]["新职务"] + BaseData.at[index, "Latest_Prom"] = promote.iloc[0]["任职时间"] + # 把原职务取出来 + if promote.shape[0] > 1: + BaseData.at[index, "职务2"] = promote.iloc[1]["新职务"] + BaseData.at[index, "日期2"] = promote.iloc[1]["任职时间"] + else: + BaseData.at[index, "职务2"] = row["初始职务"] + BaseData.at[index, "日期2"] = row["入职时间"] + + promote = promote.sort_values(by=["工资执行时间", "任职时间"]).reset_index(drop=True) + fill_prompt_info(ws, promote)# 填充晋升信息 + + # 根据规则匹配职级薪资 + History_pd = pd.DataFrame(columns=["时间", "职务", "职务工资", "级别档次", "级别工资", "工资合计", "变动原因", "晋升备注"]) + # 添加入职记录 + History_pd.loc[len(History_pd)] = [row["入职时间"], row["初始职务"], "", row["入职时的初始级别"], "", "", "套改/定级", ""] + for index, prow in promote.iterrows(): # 添加晋升记录 + History_pd.loc[len(History_pd)] = [prow["工资执行时间"]+relativedelta(hours=prow["任职时间"].month,minutes=prow["任职时间"].day), prow["新职务"], "", "", "", "", "晋升", f"任{prow['新职务']} {prow['变动批注'] if pd.notna(prow['变动批注']) else ''}"] + try: + calctime=row["晋档起始"] + relativedelta(minute=1) + while True: # 添加晋档记录 + calctime += relativedelta(years=row["晋档间隔"]) + if calctime > NOWTIME: + break + History_pd.loc[len(History_pd)] = [calctime, "", "", "", "", "", "两年晋档", ""] + calctime=row["晋级起始"] + while True: # 添加晋级记录 + calctime += relativedelta(years=row["晋级间隔"]) + if calctime > NOWTIME: + break + History_pd.loc[len(History_pd)] = [calctime, "", "", "", "", "", "五年晋级", ""] + except: + raise Exception(f"晋级、档起始或间隔时间格式错误:{row['晋级起始']}-{row['晋档起始']}-{row['晋级间隔']}-{row['晋档间隔']}") + for rule in Rule_Level: # 工资调标 + if row["入职时间"] < rule["start"]: + History_pd.loc[len(History_pd)] = [rule["start"], "", "", "", "", "", "工资调标", ""] + History_pd = History_pd.sort_values(by="时间").reset_index(drop=True) + + if History_pd.at[0,"时间"] != row["入职时间"]: + raise Exception(f"入职时间晚于其他时间:{row['入职时间']} < {History_pd.at[0,'时间']} ({History_pd.at[0,'变动原因']})") + for index, hrow in History_pd.iterrows(): # 数据计算 + # 调整职务职级 + if index > 0 and hrow["职务"] == "": + History_pd.at[index, "职务"] = History_pd.iloc[index-1]["职务"] + for rule in Rule_RoleName: # 名称变化 + if rule["start"] <= hrow["时间"] <= rule["end"]: + if History_pd.iloc[index]["职务"] in rule["rule"]["原名称"].values: + History_pd.at[index, "职务"] = rule["rule"][rule["rule"]["原名称"] == History_pd.iloc[index]["职务"]]["现名称"].values[0] + if index > 0 and hrow["级别档次"] == "": + jb, dc = split_level(History_pd.iloc[index-1]["级别档次"]) + if hrow["变动原因"] == "两年晋档": History_pd.at[index, "级别档次"] = f"{jb}-{dc+1}" - else: - History_pd.at[index, "级别档次"] = f"{jb-1}-{dc-1}" - elif hrow["变动原因"] == "工资调标": - History_pd.at[index, "级别档次"] = f"{jb}-{dc}" - elif hrow["变动原因"] == "晋升": - role = History_pd.iloc[index]["职务"] - if role in Promote_Level.keys(): - new_jb = jb + Promote_Level[role][0] - new_dc = dc + Promote_Level[role][1] - if pd.isna(new_jb) or pd.isna(new_dc): - print(Promote_Level[role][1]) - raise Exception(f"级别档次计算出现NaN值:[{new_jb}]-[{new_dc}]({role})") - else: - new_jb = int(new_jb) - new_dc = int(new_dc) - if (History_pd.iloc[index-1]["职务"] in Promote_verify.iloc[:,0].values and - role in Promote_verify.iloc[:,1].values): - logging.info(f"[{row['身份证号码']}]命中晋升校验规则[{History_pd.iloc[index-1]['职务']}]->[{role}]") - History_pd.at[index, "级别档次"] = f"{jb}-{dc}" - elif new_jb < role_limit(role): + elif hrow["变动原因"] == "五年晋级": + if jb-1 < 1 or jb-1 < role_limit(History_pd.iloc[index]["职务"]): History_pd.at[index, "级别档次"] = f"{jb}-{dc+1}" - elif new_jb < 1 or new_dc < 1: - raise Exception(f"级别档次小于0:[{new_jb}]-[{new_dc}]") else: - History_pd.at[index, "级别档次"] = f"{new_jb}-{new_dc}" - else: - logging.warning(f"职位[{role}]不存在职级上限规则") - # 计算工资 - History_pd.at[index, "职务工资"] = role_salary(History_pd.iloc[index]["职务"], hrow["时间"]) - History_pd.at[index, "级别工资"] = level_salary(History_pd.iloc[index]["级别档次"], hrow["时间"]) - History_pd.at[index, "工资合计"] = to_int(History_pd.iloc[index]["职务工资"]) + to_int(History_pd.iloc[index]["级别工资"]) + History_pd.at[index, "级别档次"] = f"{jb-1}-{dc-1}" + elif hrow["变动原因"] == "工资调标": + History_pd.at[index, "级别档次"] = f"{jb}-{dc}" + elif hrow["变动原因"] == "晋升": + role = History_pd.iloc[index]["职务"] + if role in Promote_Level.keys(): + new_jb = jb + Promote_Level[role][0] + new_dc = dc + Promote_Level[role][1] + if pd.isna(new_jb) or pd.isna(new_dc): + print(Promote_Level[role][1]) + raise Exception(f"级别档次计算出现NaN值:[{new_jb}]-[{new_dc}]({role})") + else: + new_jb = int(new_jb) + new_dc = int(new_dc) + if (History_pd.iloc[index-1]["职务"] in Promote_verify.iloc[:,0].values and + role in Promote_verify.iloc[:,1].values): + logging.info(f"[{row['身份证号码']}]命中晋升校验规则[{History_pd.iloc[index-1]['职务']}]->[{role}]") + History_pd.at[index, "级别档次"] = f"{jb}-{dc}" + elif new_jb < role_limit(role): + History_pd.at[index, "级别档次"] = f"{jb}-{dc+1}" + elif new_jb < 1 or new_dc < 1: + raise Exception(f"级别档次小于0:[{new_jb}]-[{new_dc}]") + else: + History_pd.at[index, "级别档次"] = f"{new_jb}-{new_dc}" + else: + logging.warning(f"职位[{role}]不存在职级上限规则") + # 计算工资 + History_pd.at[index, "职务工资"] = role_salary(History_pd.iloc[index]["职务"], hrow["时间"]) + History_pd.at[index, "级别工资"] = level_salary(History_pd.iloc[index]["级别档次"], hrow["时间"]) + History_pd.at[index, "工资合计"] = to_int(History_pd.iloc[index]["职务工资"]) + to_int(History_pd.iloc[index]["级别工资"]) - fill_history_info(ws, History_pd)# 填充历史记录 - - # 将当前人员的历史记录添加到总表中 - History_pd["身份证号码"] = row["身份证号码"] - History_pd["姓名"] = row["姓名"] - all_history = pd.concat([all_history, History_pd], ignore_index=True) - - wb.save(f"个人台账/{row['身份证号码']}_{row['姓名']}.xlsx") - except Exception as e: - logging.error(f"{row['身份证号码']}:{e}") + fill_history_info(ws, History_pd)# 填充历史记录 + + # 将当前人员的历史记录添加到总表中 + History_pd["身份证号码"] = row["身份证号码"] + History_pd["姓名"] = row["姓名"] + all_history = pd.concat([all_history, History_pd], ignore_index=True) + + wb.save(f"个人台账/{row['身份证号码']}_{row['姓名']}.xlsx") + except Exception as e: + logging.error(f"{row['身份证号码']}:{e}") -# 保存所有历史记录到Excel文件 -all_history["时间"] = all_history["时间"].apply(lambda x: format_time(x, "历史记录时间")) -all_history.to_excel("所有人员历史记录.xlsx", index=False) -logging.info("所有人员历史记录已保存到'所有人员历史记录.xlsx'") + # 保存所有历史记录到Excel文件 + all_history["时间"] = all_history["时间"].apply(lambda x: format_time(x, "历史记录时间")) + all_history.to_excel("所有人员历史记录.xlsx", index=False) + logging.info("所有人员历史记录已保存到'所有人员历史记录.xlsx'") -wb = load_workbook("模板/汇总名册.xlsx") -ws = wb.active -for index, row in BaseData.iterrows(): # 汇总 - try: - logging.info(f"汇总:第[{index+1}]共[{BaseData.shape[0]}]现在是[{row['身份证号码']}]") - for col in range(1,16): - ws.cell(row=6+index, column=col)._style = ws.cell(row=6, column=col)._style - ws.cell(row=6+index, column=1, value=index+1) - ws.cell(row=6+index, column=2, value=row["姓名"]) - ws.cell(row=6+index, column=3, value=row["性别"]) - ws.cell(row=6+index, column=4, value=format_time(row["出生年月"], "出生年月")) - ws.cell(row=6+index, column=5, value=format_time(row["参加工作时间"], "参加工作时间")) - ws.cell(row=6+index, column=6, value=fallback([row["现学历"],row["学历"]])) - ws.cell(row=6+index, column=7, value=row['工龄']+row["学龄"]) - ws.cell(row=6+index, column=8, value=row['工龄']) - ws.cell(row=6+index, column=9, value=row["学龄"]) - ws.cell(row=6+index, column=10, value=row["工龄调减"]) - ws.cell(row=6+index, column=11, value=row["Latest_Role"]) - ws.cell(row=6+index, column=12, value=format_time(row["Latest_Prom"], "Latest_Prom")) - ws.cell(row=6+index, column=13, value=row["职务2"]) - ws.cell(row=6+index, column=14, value=format_time(row["日期2"], "日期2")) - except Exception as e: - logging.error(f"{row['身份证号码']}:{e}") -wb.save("汇总名册.xlsx") # 保存汇总 + wb = load_workbook("模板/汇总名册.xlsx") + ws = wb.active + for index, row in BaseData.iterrows(): # 汇总 + try: + logging.info(f"汇总:第[{index+1}]共[{BaseData.shape[0]}]现在是[{row['身份证号码']}]") + for col in range(1,16): + ws.cell(row=6+index, column=col)._style = ws.cell(row=6, column=col)._style + ws.cell(row=6+index, column=1, value=index+1) + ws.cell(row=6+index, column=2, value=row["姓名"]) + ws.cell(row=6+index, column=3, value=row["性别"]) + ws.cell(row=6+index, column=4, value=format_time(row["出生年月"], "出生年月")) + ws.cell(row=6+index, column=5, value=format_time(row["参加工作时间"], "参加工作时间")) + ws.cell(row=6+index, column=6, value=fallback([row["现学历"],row["学历"]])) + ws.cell(row=6+index, column=7, value=row['工龄']+row["学龄"]) + ws.cell(row=6+index, column=8, value=row['工龄']) + ws.cell(row=6+index, column=9, value=row["学龄"]) + ws.cell(row=6+index, column=10, value=row["工龄调减"]) + ws.cell(row=6+index, column=11, value=row["Latest_Role"]) + ws.cell(row=6+index, column=12, value=format_time(row["Latest_Prom"], "Latest_Prom")) + ws.cell(row=6+index, column=13, value=row["职务2"]) + ws.cell(row=6+index, column=14, value=format_time(row["日期2"], "日期2")) + except Exception as e: + logging.error(f"{row['身份证号码']}:{e}") + wb.save("汇总名册.xlsx") # 保存汇总 -if max_promote > 0: - logging.warning(f"最多有[{max_promote}]条晋升信息,需要调整模板。记得同时调整薪资历史的起始行和个人评价结果。") -if max_history > 0: - logging.warning(f"最多有[{max_history}]条薪资历史,需要调整模板。") \ No newline at end of file + if max_promote > 0: + logging.warning(f"最多有[{max_promote}]条晋升信息,需要调整模板。记得同时调整薪资历史的起始行和个人评价结果。") + if max_history > 0: + logging.warning(f"最多有[{max_history}]条薪资历史,需要调整模板。") + +if __name__ == "__main__": + main() \ No newline at end of file