财务每个月要合并几十个分公司的报表,人事每月要统计上百人的考勤数据......这些重复性高、耗时长的工作,真的只能手动做吗?
答案当然是——用 Python 自动化。
本文精选 5 个财务和人事的真实工作场景,每个案例都配有完整的 Python 代码。不需要编程基础,照着抄、改一改文件路径就能直接用。
本文案例速览
案例一:批量合并多个 Excel 文件 案例二:银行流水与账单自动核对 案例三:自动生成月度利润表 案例四:考勤数据自动统计 案例五:工资条自动生成并发邮件
批量合并多个 Excel 文件
适用:财务报表汇总、各部门数据整合
场景描述:每到月末,财务需要把 10 多个分公司的销售报表合并成一张总表。手动复制粘贴要花半天时间,还容易漏行错列。
解决思路:用 Python 读取指定文件夹下所有 Excel 文件,自动识别表头行,将数据追加合并,最终输出一张总表。
Python 代码
# 案例一:批量合并多个Excel文件# 适用:pandas + openpyxlimport pandas as pd import os # 设置文件夹路径(改成你自己的) folder_path = r"D:\报表\各分公司" output_file = r"D:\报表\合并总表.xlsx"# 获取所有xlsx文件 files = [f for f in os.listdir(folder_path) if f.endswith('.xlsx')] # 逐个读取并合并 all_data = [] for file in files: df = pd.read_excel( os.path.join(folder_path, file)) # 添加来源列,方便追溯 df['来源分公司'] = file.replace('.xlsx', '') all_data.append(df) # 合并所有数据并保存 result = pd.concat(all_data, ignore_index=True) result.to_excel(output_file, index=False) print(f"合并完成!共 {len(files)} 个文件,"f"{len(result)} 条记录")使用提示
把 folder_path 改成你存放 Excel 的文件夹路径即可。代码会自动添加"来源分公司"列,方便后续追溯每条数据的出处。需要安装依赖:pip install pandas openpyxl
场景描述:财务每月要把银行流水和内部账单逐笔核对,找出金额一致和有差异的记录。几百条数据手动比对,眼睛都要看花。
解决思路:用 Python 将两份数据按金额+日期进行匹配,自动标记"已匹配""金额差异""未匹配"三种状态。
Python 代码
# 案例二:银行流水与账单自动核对import pandas as pd # 读取银行流水和内部账单 bank = pd.read_excel(r"D:\对账\银行流水.xlsx") internal = pd.read_excel(r"D:\对账\内部账单.xlsx") # 标准化列名(根据实际情况修改) bank.columns = ['日期', '摘要', '金额', '对方户名'] internal.columns = ['日期', '摘要', '金额', '客户名称'] # 按金额+日期匹配 matched = pd.merge( bank, internal, on=['金额', '日期'], how='outer', indicator=True ) # 标记匹配状态defget_status(row): if row['_merge'] == 'both': return'已匹配'elif row['_merge'] == 'left_only': return'银行有/账单无'else: return'账单有/银行无' matched['核对结果'] = matched.apply(get_status, axis=1) matched.drop(columns=['_merge'], inplace=True) # 筛选有差异的记录 diff = matched[matched['核对结果'] != '已匹配'] diff.to_excel(r"D:\对账\差异记录.xlsx", index=False) print(f"核对完成!共 {len(matched)} 条,"f"差异 {len(diff)} 条")使用提示
代码中的列名(日期、金额等)需要根据你实际 Excel 的表头修改。匹配逻辑是"金额+日期完全一致",如果需要模糊匹配(如金额近似),可以把金额取整后再匹配。
自动生成月度利润表
适用:财务报表自动生成、经营分析
场景描述:每月财务要从明细账中汇总收入、成本、费用,手动计算毛利率、净利润率等指标,再填入利润表模板。整个过程繁琐且容易出错。
解决思路:Python 自动从明细账中按科目分类汇总,计算各项指标,并按标准利润表格式输出。
Python 代码
# 案例三:自动生成月度利润表import pandas as pd from openpyxl import Workbook from openpyxl.styles import Font, Alignment # 读取明细账 detail = pd.read_excel(r"D:\财务\明细账.xlsx") # 按科目大类汇总 revenue = detail[detail['科目类别'] == '收入']['金额'].sum() cost = detail[detail['科目类别'] == '成本']['金额'].sum() expense = detail[detail['科目类别'] == '费用']['金额'].sum() # 计算关键指标 gross_profit = revenue - cost net_profit = gross_profit - expense gross_rate = gross_profit / revenue * 100if revenue else0 net_rate = net_profit / revenue * 100if revenue else0# 创建利润表 wb = Workbook() ws = wb.active ws.title = "利润表"# 表头 ws.merge_cells('A1:C1') ws['A1'] = "月度利润表" ws['A1'].font = Font(bold=True, size=16) ws['A1'].alignment = Alignment(horizontal='center') # 数据行 rows = [ ("项目", "金额(元)", "占比"), ("营业收入", revenue, "100.00%"), ("营业成本", cost, f"{cost/revenue*100:.2f}%"if revenue else"0%"), ("毛利润", gross_profit, f"{gross_rate:.2f}%"), ("期间费用", expense, f"{expense/revenue*100:.2f}%"if revenue else"0%"), ("净利润", net_profit, f"{net_rate:.2f}%"), ] for i, (a, b, c) in enumerate(rows, 3): ws[f'A{i}'] = a ws[f'B{i}'] = b ws[f'C{i}'] = c # 设置列宽 ws.column_dimensions['A'].width = 20 ws.column_dimensions['B'].width = 18 ws.column_dimensions['C'].width = 12 wb.save(r"D:\财务\月度利润表.xlsx") print("利润表生成完成!")使用提示
前提是你的明细账 Excel 中有"科目类别"和"金额"两列。科目类别分为"收入""成本""费用"三类即可。如果你的科目体系不同,修改分类条件即可。
场景描述:人事每月要从打卡系统中导出原始考勤数据,统计每个人的出勤天数、迟到次数、早退次数、请假天数。几百人的数据手动统计简直是噩梦。
解决思路:Python 读取打卡记录,按员工分组统计各项考勤指标,自动标记异常记录,输出统计汇总表。
Python 代码
# 案例四:考勤数据自动统计import pandas as pd # 读取考勤原始数据 df = pd.read_excel(r"D:\人事\考勤原始数据.xlsx") # 假设列:员工姓名、日期、上班打卡、下班打卡、状态# 状态值:正常、迟到、早退、缺勤、请假、旷工# 统计每个人的考勤情况 stats = df.groupby('员工姓名').agg( 应出勤天数=('日期', 'nunique'), 正常出勤=('状态', lambda x: (x == '正常').sum()), 迟到次数=('状态', lambda x: (x == '迟到').sum()), 早退次数=('状态', lambda x: (x == '早退').sum()), 请假天数=('状态', lambda x: (x == '请假').sum()), 旷工天数=('状态', lambda x: (x == '旷工').sum()), ).reset_index() # 计算出勤率 stats['出勤率'] = ( stats['正常出勤'] / stats['应出勤天数' * 100 ).round(2) # 标记异常员工(迟到>=3次或旷工>0) stats['异常标记'] = stats.apply( lambda row: '需关注'if row['迟到次数'] >= 3or row['旷工天数'] > 0else'正常', axis=1) # 按异常优先排序 stats = stats.sort_values( by='异常标记', ascending=False) stats.to_excel(r"D:\人事\考勤统计汇总.xlsx", index=False) print(f"统计完成!共 {len(stats)} 名员工,"f"异常 {len(stats[stats['异常标记']=='需关注'])} 人")使用提示
需要你的考勤数据中有"员工姓名""日期""状态"三列。"状态"列的值(正常/迟到/早退/请假/旷工)根据你们公司实际情况修改。异常标准(迟到>=3次)也可以按需调整。
工资条自动生成并发邮件
适用:人事薪酬发放、工资条推送
场景描述:人事每月发工资后,要给每个人单独生成工资条,再逐个发到员工邮箱。几十号人就要发几十封邮件,纯体力活。
解决思路:Python 读取工资表,为每位员工单独生成工资条图片/Excel,再通过邮箱自动发送到对应员工邮箱。
Python 代码
# 案例五:工资条自动生成并发邮件import pandas as pd import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication import os # 读取工资表(含员工姓名和邮箱列) salary = pd.read_excel(r"D:\人事\工资表.xlsx") # 邮箱配置(以QQ邮箱为例) SMTP_SERVER = "smtp.qq.com" SMTP_PORT = 465 SENDER = "your_email@qq.com" PASSWORD = "你的授权码"# 非登录密码defsend_payslip(name, email, row_data): """为单个员工生成工资条并发送邮件"""# 生成个人工资条Excel payslip = pd.DataFrame([row_data]) temp_file = f"D:\\人事\\工资条\\{name}_工资条.xlsx" payslip.to_excel(temp_file, index=False) # 构建邮件 msg = MIMEMultipart() msg['Subject'] = f"{name},你的本月工资条已到达" msg['From'] = SENDER msg['To'] = email body = f""" <h3>{name},你好:</h3> <p>附件是你 {pd.Timestamp.now().strftime('%Y年%m月')} 的工资条,</p> <p>请查收。如有疑问请联系人事部。</p> """ msg.attach(MIMEText(body, 'html', 'utf-8')) # 附件with open(temp_file, 'rb') as f: part = MIMEApplication(f.read()) part.add_header( 'Content-Disposition', 'attachment', filename=(f'utf-8', '', f'{name}_工资条.xlsx')) msg.attach(part) # 发送with smtplib.SMTP_SSL( SMTP_SERVER, SMTP_PORT) as server: server.login(SENDER, PASSWORD) server.send_message(msg) print(f"已发送:{name} - {email}") # 遍历工资表,逐个发送 os.makedirs(r"D:\人事\工资条", exist_ok=True) for _, row in salary.iterrows(): try: send_payslip( row['员工姓名'], row['邮箱'], row.to_dict()) except Exception as e: print(f"发送失败:{row['员工姓名']} - {e}") print("全部工资条发送完成!")使用提示
需要将 SENDER 和 PASSWORD 替换为你自己的邮箱和授权码。QQ邮箱、163邮箱均可,需提前开启 SMTP 服务并获取授权码。工资表中需有"员工姓名"和"邮箱"两列。建议先用 1-2 条数据测试,确认无误后再批量发送。
写在最后
以上 5 个案例覆盖了财务和人事最常见的高频重复工作。核心思路其实就三个字:自动化。
不需要你是程序员,不需要懂算法,只需要把文件路径改成你自己的,照着运行就能看到效果。
如果你也想系统学习 Python 办公自动化,欢迎关注我们的AI办公提效课程,从零基础到实战落地,手把手带你掌握。
觉得有用?点个「在看」吧 转发给身边还在手动做报表的同事