副标题:10 个真实场景,让你的财务工作从手忙脚乱到游刃有余
写在前面
小李是某制造企业的财务专员,每月末的那几天,她的桌上总是堆满了密密麻麻的 Excel 表格。手动核对银行流水、合并各部门报销单、汇总各子公司利润表……加班到深夜是常态。
直到有一天,她的同事小张给她看了一段 Python 代码,不到 30 秒,3000 行的银行流水核对完毕,精准无误。
小李愣了半分钟,然后问:「这是 AI 帮你写的?」
「对,我就跟 AI 说了一下需求,它就给了我代码。」小张淡淡地说。
这就是本文想告诉你的:你不需要精通编程,只需要会描述问题,AI 就能帮你写出让工作效率翻倍的 Python 代码。
陈会计在一家连锁餐饮公司做出纳,每个月要核对公司银行账户与财务系统之间的流水差异。银行导出的是 Excel,财务系统导出的是另一个 Excel,格式完全不同——日期格式、金额正负号、摘要描述都不一样。
以前她要花整整两天来手动比对,眼睛都看花了,还经常漏掉几笔。老板催着要对账结果,她急得直冒汗。

她把需求告诉了 AI:「帮我写一个 Python 脚本,把银行流水 Excel 和财务系统流水 Excel 做自动比对,找出未匹配的记录。」
AI 给出了这段代码:
import pandas as pd
# 读取银行流水和账务系统数据
bank_df = pd.read_excel('bank_statement.xlsx')
sys_df = pd.read_excel('system_records.xlsx')
# 统一日期格式
bank_df['date'] = pd.to_datetime(bank_df['交易日期'])
sys_df['date'] = pd.to_datetime(sys_df['记账日期'])
# 统一金额(绝对值匹配)
bank_df['amount'] = bank_df['交易金额'].abs()
sys_df['amount'] = sys_df['借贷金额'].abs()
# 生成匹配 key(日期 + 金额)
bank_df['key'] = bank_df['date'].dt.strftime('%Y-%m-%d') + '_' + bank_df['amount'].astype(str)
sys_df['key'] = sys_df['date'].dt.strftime('%Y-%m-%d') + '_' + sys_df['amount'].astype(str)
# 找出未匹配记录
bank_only = bank_df[~bank_df['key'].isin(sys_df['key'])].copy()
sys_only = sys_df[~sys_df['key'].isin(bank_df['key'])].copy()
# 写出结果
with pd.ExcelWriter('reconciliation_result.xlsx') as writer:
bank_only.to_excel(writer, sheet_name='银行有_系统无', index=False)
sys_only.to_excel(writer, sheet_name='系统有_银行无', index=False)
print(f'银行单边: {len(bank_only)} 笔,系统单边: {len(sys_only)} 笔')
print('对账结果已保存至 reconciliation_result.xlsx')
效果: 原来两天的工作,现在 30 秒完成。陈会计说:「我现在月末最轻松的活就是对账了。」
王财务在集团财务部,负责汇总 12 个部门每月提交的报销明细。每个部门用的 Excel 模板格式略有差异——有的叫「报销金额」,有的叫「实报金额」,有的合并了单元格,有的没有表头……
以前她要先手动统一格式,再复制粘贴,每次至少花 4 小时,还容易出错。

她问 AI:「帮我写一个 Python 脚本,读取一个文件夹里所有部门的报销 Excel,自动汇总到一张总表,并按部门统计合计金额。」
import pandas as pd
from pathlib import Path
# 字段名映射
COLUMN_MAP = {
'报销金额': 'amount', '实报金额': 'amount',
'费用金额': 'amount', '金额': 'amount',
'部门': 'dept', '申请部门': 'dept',
'费用类型': 'category', '报销类型': 'category',
'费用说明': 'description', '事由': 'description',
}
all_records = []
for file in Path('reports/').glob('*.xlsx'):
try:
df = pd.read_excel(file)
df.rename(columns={k: v for k, v in COLUMN_MAP.items() if k in df.columns}, inplace=True)
df['source_file'] = file.name
if 'amount' in df.columns:
df['amount'] = pd.to_numeric(df['amount'], errors='coerce')
all_records.append(df)
except Exception as e:
print(f'读取 {file.name} 失败: {e}')
combined = pd.concat(all_records, ignore_index=True)
summary = combined.groupby('dept')['amount'].agg(['sum', 'count']).reset_index()
summary.columns = ['部门', '报销总额', '报销笔数']
with pd.ExcelWriter('expense_summary.xlsx') as writer:
combined.to_excel(writer, sheet_name='明细汇总', index=False)
summary.to_excel(writer, sheet_name='部门统计', index=False)
print(f'共汇总 {len(all_records)} 个文件,{len(combined)} 笔记录')
效果: 12 个文件、400 多条记录,10 秒汇总完毕,原来 4 小时的工作量瞬间消失。
刘总监所在的公司每月处理 500 张以上增值税发票,财务团队要逐一核对发票号码、金额、税率。纯手工操作不仅效率极低,还因录入出错差点引发税务风险。
她让 AI 写代码从 PDF 发票中批量提取关键信息:
import pdfplumber, re, pandas as pd
from pathlib import Path
def extract_invoice_info(pdf_path):
info = {'file': Path(pdf_path).name, 'invoice_no': '',
'invoice_date': '', 'buyer': '', 'seller': '', 'total': ''}
try:
with pdfplumber.open(pdf_path) as pdf:
text = ''.join(p.extract_text() or '' for p in pdf.pages)
patterns = {
'invoice_no': r'发票号码[::]\s*(\d+)',
'invoice_date': r'开票日期[::]\s*([\d年月日]+)',
'buyer': r'购\s*买\s*方.*?名\s*称[::]\s*(.+)',
'seller': r'销\s*售\s*方.*?名\s*称[::]\s*(.+)',
'total': r'合\s*计.*?[¥¥]\s*([\d,]+\.?\d*)',
}
for key, pat in patterns.items():
m = re.search(pat, text)
if m:
info[key] = m.group(1).strip().replace(',', '')
except Exception as e:
info['error'] = str(e)
return info
results = [extract_invoice_info(f) for f in Path('invoices/').glob('*.pdf')]
df = pd.DataFrame(results)
df.to_excel('invoice_list.xlsx', index=False)
print(f'共提取 {len(df)} 张发票信息')
效果: 500 张发票 5 分钟提取完毕,准确率 95%+,剩余 5% 自动标注需人工复核。刘总监说:「以前这活要两天,现在交给实习生跑个脚本就行了。」
赵经理是某上市公司子公司财务负责人,每月要向集团汇报利润表,还要与上月、去年同期做对比分析,手动写备注说明差异原因,每月加班两个晚上。
import pandas as pd, openpyxl
from openpyxl.styles import Font, PatternFill, Alignment
from openpyxl.utils import get_column_letter
current = pd.read_excel('profit_current.xlsx', index_col=0)
last_m = pd.read_excel('profit_last_month.xlsx', index_col=0)
last_y = pd.read_excel('profit_last_year.xlsx', index_col=0)
df = pd.DataFrame({'本月': current['金额'], '上月': last_m['金额'], '去年同期': last_y['金额']})
df['环比变动'] = df['本月'] - df['上月']
df['环比变动率%'] = (df['环比变动'] / df['上月'].abs() * 100).round(2)
df['同比变动'] = df['本月'] - df['去年同期']
df['同比变动率%'] = (df['同比变动'] / df['去年同期'].abs() * 100).round(2)
wb = openpyxl.Workbook()
ws = wb.active
ws.title = '利润对比分析'
headers = ['科目','本月','上月','去年同期','环比变动','环比变动率%','同比变动','同比变动率%']
h_fill = PatternFill(fill_type='solid', fgColor='1F4E79')
for col, h in enumerate(headers, 1):
c = ws.cell(row=1, column=col, value=h)
c.fill = h_fill
c.font = Font(bold=True, color='FFFFFF')
c.alignment = Alignment(horizontal='center')
red = PatternFill(fill_type='solid', fgColor='FFCCCC')
green = PatternFill(fill_type='solid', fgColor='CCFFCC')
for r, (idx, row) in enumerate(df.iterrows(), 2):
ws.cell(row=r, column=1, value=idx)
for c, val in enumerate(row, 2):
cell = ws.cell(row=r, column=c, value=round(val,2) if pd.notna(val) else '')
if c in [5,6,7,8] and isinstance(val, (int,float)):
cell.fill = red if val < 0 else (green if val > 0 else cell.fill)
for col in range(1, len(headers)+1):
ws.column_dimensions[get_column_letter(col)].width = 16
wb.save('profit_analysis.xlsx')
print('利润对比分析报告已生成')
效果: 原来两个晚上的工作,现在 1 分钟自动生成带颜色标注的对比分析表。赵经理说:「现在我终于有时间分析数字背后的原因了。」
周财务在一家贸易公司,手头有 2000 多条应收账款记录,老板每周要看账龄分析(30天内、30-60天、60-90天、90-180天、180天以上各有多少)。以前用 VLOOKUP + SUMIF 写一堆公式,每次刷新都战战兢兢怕出错。
import pandas as pd
df = pd.read_excel('ar_records.xlsx')
df['due_date'] = pd.to_datetime(df['到期日期'])
df['outstanding'] = pd.to_numeric(df['未收金额'], errors='coerce')
today = pd.Timestamp.today()
df['days_overdue'] = (today - df['due_date']).dt.days
def classify_aging(d):
if d <= 0: return '未到期'
elif d <= 30: return '1-30天'
elif d <= 60: return '31-60天'
elif d <= 90: return '61-90天'
elif d <= 180: return '91-180天'
else: return '180天以上'
df['账龄'] = df['days_overdue'].apply(classify_aging)
aging_order = ['未到期','1-30天','31-60天','61-90天','91-180天','180天以上']
summary = df.groupby('账龄')['outstanding'].agg(['sum','count']).reindex(aging_order)
summary.columns = ['金额合计','笔数']
summary['占比%'] = (summary['金额合计'] / summary['金额合计'].sum() * 100).round(2)
by_customer = df.groupby(['客户名称','账龄'])['outstanding'].sum().unstack(fill_value=0)
by_customer['合计'] = by_customer.sum(axis=1)
by_customer = by_customer.sort_values('合计', ascending=False)
with pd.ExcelWriter('ar_aging_report.xlsx') as writer:
summary.to_excel(writer, sheet_name='账龄汇总')
by_customer.to_excel(writer, sheet_name='客户明细')
df.to_excel(writer, sheet_name='原始数据', index=False)
print('账龄分析报告已生成')
print(summary)
效果: 2000 条记录 3 秒完成,还自动按客户拆分了明细。周财务说:「以前做这个要花半天,现在老板要看随时都能给。」
林会计所在的公司有 600 多项固定资产,每月要计提折旧。以前她在 Excel 里一个个公式下拉,一旦有资产报废或新增,就要重新核查所有公式,经常搞错。
她让 AI 帮她写一个折旧批量计算脚本:
import pandas as pd
from dateutil.relativedelta import relativedelta
df = pd.read_excel('fixed_assets.xlsx')
df['purchase_date'] = pd.to_datetime(df['购入日期'])
df['original_value'] = pd.to_numeric(df['原值'], errors='coerce')
df['residual_rate'] = pd.to_numeric(df['残值率'], errors='coerce').fillna(0.05)
df['useful_life_years'] = pd.to_numeric(df['使用年限'], errors='coerce')
today = pd.Timestamp.today()
def calc_depreciation(row):
if row['资产状态'] == '已报废':
return 0
depreciable = row['original_value'] * (1 - row['residual_rate'])
monthly_dep = depreciable / (row['useful_life_years'] * 12)
# 已折旧月数
months_used = (today.year - row['purchase_date'].year) * 12 + (today.month - row['purchase_date'].month)
total_months = int(row['useful_life_years'] * 12)
if months_used >= total_months:
return 0 # 已折旧完毕
return round(monthly_dep, 2)
df['本月折旧额'] = df.apply(calc_depreciation, axis=1)
# 按资产类别汇总
summary = df.groupby('资产类别')['本月折旧额'].sum().reset_index()
summary.columns = ['资产类别', '折旧合计']
with pd.ExcelWriter('depreciation_report.xlsx') as writer:
df.to_excel(writer, sheet_name='明细', index=False)
summary.to_excel(writer, sheet_name='汇总', index=False)
total_dep = df['本月折旧额'].sum()
print(f'本月合计折旧: ¥{total_dep:,.2f}')
print(summary)
效果: 600 项资产一秒计算完毕,自动跳过已报废和已折旧完毕的资产,还按类别汇总了折旧总额。林会计说:「这个脚本给我省了每月至少 3 小时的时间,关键是再也不会算错了。」
蒋总助在公司负责费用管控,每个月要对比各部门的预算执行情况,超支的要及时预警,并发邮件给各部门负责人。以前这件事要手动查数据、写邮件,往往等发完邮件,已经是下午了。
import pandas as pd
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# 读取预算与实际数据
budget = pd.read_excel('budget_2026.xlsx')
actual = pd.read_excel('actual_ytd.xlsx')
merged = budget.merge(actual, on=['部门', '费用科目'], suffixes=('_预算', '_实际'))
merged['执行率%'] = (merged['金额_实际'] / merged['金额_预算'] * 100).round(2)
merged['超支金额'] = merged['金额_实际'] - merged['金额_预算']
# 识别预警项:执行率 > 90% 或已超支
warning = merged[(merged['执行率%'] >= 90)].copy()
warning['状态'] = warning['执行率%'].apply(
lambda x: '【严重超支】' if x > 100 else '【接近上限】'
)
# 按部门分组发邮件
dept_contacts = {
'销售部': 'sales@company.com',
'研发部': 'rd@company.com',
'运营部': 'ops@company.com',
}
def send_alert_email(dept, rows, to_email):
body = f"您好,以下是 {dept} 截至本月的费用预算预警情况:
"
for _, r in rows.iterrows():
body += (f" {r['状态']} {r['费用科目']}:预算 {r['金额_预算']:,.0f} 元,"
f"已用 {r['金额_实际']:,.0f} 元,执行率 {r['执行率%']:.1f}%
")
body += "
请及时关注并控制后续支出。
财务部"
msg = MIMEMultipart()
msg['Subject'] = f'【费用预警】{dept} 费用预算预警通知'
msg['From'] = 'finance@company.com'
msg['To'] = to_email
msg.attach(MIMEText(body, 'plain', 'utf-8'))
# 实际发送时取消注释
# with smtplib.SMTP('smtp.company.com', 587) as s:
# s.starttls()
# s.login('finance@company.com', 'password')
# s.send_message(msg)
print(f'预警邮件已准备 -> {to_email}')
print(body)
for dept, email in dept_contacts.items():
dept_warnings = warning[warning['部门'] == dept]
if not dept_warnings.empty:
send_alert_email(dept, dept_warnings, email)
warning.to_excel('budget_warning.xlsx', index=False)
print(f'共 {len(warning)} 条预警记录已导出')
效果: 预算监控从半天手工操作变成 1 分钟自动跑完,还能自动发邮件预警。蒋总助说:「以前我每月搞这个搞得很烦,现在都是自动的,我只需要看结果就行了。」
郑财务兼管公司合同台账,一共 200 多份合同,付款节点、到期日期五花八门。以前全靠手动在 Excel 里打标记,经常有合同到期了才发现,差点影响续签。
import pandas as pd
from datetime import datetime, timedelta
df = pd.read_excel('contracts.xlsx')
df['start_date'] = pd.to_datetime(df['合同开始日期'])
df['end_date'] = pd.to_datetime(df['合同到期日期'])
df['payment_date'] = pd.to_datetime(df['下次付款日期'], errors='coerce')
today = pd.Timestamp.today()
# 合同状态
def contract_status(end_date):
days_left = (end_date - today).days
if days_left < 0: return '已过期'
elif days_left <= 30: return '即将到期(30天内)'
elif days_left <= 90: return '即将到期(90天内)'
else: return '正常'
df['合同状态'] = df['end_date'].apply(contract_status)
df['剩余天数'] = (df['end_date'] - today).dt.days
# 付款提醒
def payment_alert(pay_date):
if pd.isna(pay_date): return ''
days = (pay_date - today).days
if days < 0: return '付款已逾期!'
elif days <= 7: return f'7天内需付款({days}天后)'
elif days <= 30: return f'30天内需付款({days}天后)'
return ''
df['付款提醒'] = df['payment_date'].apply(payment_alert)
# 导出预警列表
expiring = df[df['合同状态'].str.contains('即将到期|已过期')]
payment_due = df[df['付款提醒'] != '']
with pd.ExcelWriter('contract_alerts.xlsx') as writer:
expiring.to_excel(writer, sheet_name='到期合同', index=False)
payment_due.to_excel(writer, sheet_name='付款提醒', index=False)
df.to_excel(writer, sheet_name='全量台账', index=False)
print(f'即将到期合同: {len(expiring)} 份')
print(f'近期需付款合同: {len(payment_due)} 份')
效果: 200 多份合同的到期和付款情况一目了然,不再有遗漏。郑财务说:「现在每周一早上跑一遍,把提醒发给业务部门,再也没有漏过合同了。」
汪副总每月要向董事会汇报财务情况,以前都是 PPT 里贴表格,枯燥无味。她希望能有一个动态图表,让董事会看了一目了然。
import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots
# 模拟月度数据
months = ['1月','2月','3月','4月','5月','6月',
'7月','8月','9月','10月','11月','12月']
revenue = [1200,1350,1180,1420,1580,1650,1700,1550,1800,1920,2100,2350]
cost = [820, 900, 810, 950, 1020,1080,1100,1010,1150,1230,1340,1500]
profit = [r-c for r, c in zip(revenue, cost)]
margin = [round(p/r*100, 1) for p, r in zip(profit, revenue)]
fig = make_subplots(
rows=2, cols=2,
subplot_titles=('月度收入与成本', '月度净利润', '利润率趋势', '收入构成')
)
# 子图1:收入与成本柱图
fig.add_trace(go.Bar(name='收入', x=months, y=revenue, marker_color='#2196F3'), row=1, col=1)
fig.add_trace(go.Bar(name='成本', x=months, y=cost, marker_color='#FF5722'), row=1, col=1)
# 子图2:净利润折线图(正负着色)
colors = ['#4CAF50' if p >= 0 else '#F44336' for p in profit]
fig.add_trace(go.Bar(name='净利润', x=months, y=profit, marker_color=colors), row=1, col=2)
# 子图3:利润率折线
fig.add_trace(go.Scatter(name='利润率%', x=months, y=margin,
mode='lines+markers', line=dict(color='#9C27B0', width=2)), row=2, col=1)
# 子图4:全年收入饼图(按季度)
quarters = ['Q1','Q2','Q3','Q4']
q_rev = [sum(revenue[i*3:(i+1)*3]) for i in range(4)]
fig.add_trace(go.Pie(labels=quarters, values=q_rev, hole=0.4), row=2, col=2)
fig.update_layout(
title_text='2026年度财务数据仪表盘',
title_font_size=20,
height=700,
showlegend=True,
barmode='group'
)
fig.write_html('finance_dashboard.html')
fig.show()
print('财务仪表盘已生成:finance_dashboard.html')
效果: 生成一个交互式 HTML 仪表盘,包含 4 个图表,董事会看了直呼「一目了然」。汪副总说:「以前我在 PPT 里贴了 10 张表,现在一个页面全搞定,还能鼠标悬停看具体数据。」
梁税务专员每月要在企业申报系统填写增值税申报表,数据来自财务系统导出的多张报表。以前人工核对,总担心数据填错,出了问题要被罚款甚至补税。
她让 AI 帮她写一个核查脚本,在填报前自动比对各数据来源的一致性:
import pandas as pd
# 读取三个数据源
sales = pd.read_excel('sales_ledger.xlsx') # 销售台账
purchase = pd.read_excel('purchase_ledger.xlsx') # 采购台账
invoice = pd.read_excel('invoice_summary.xlsx') # 发票汇总
# 统一金额格式
for df in [sales, purchase, invoice]:
for col in df.select_dtypes(include='object').columns:
try:
df[col] = pd.to_numeric(df[col].str.replace(',',''), errors='ignore')
except:
pass
# 核查1:销售台账含税合计 vs 发票开具合计
sales_total = sales['含税金额'].sum()
invoice_total = invoice[invoice['类型']=='销项']['价税合计'].sum()
diff1 = sales_total - invoice_total
# 核查2:进项发票合计 vs 采购台账
purchase_total = purchase['含税金额'].sum()
input_total = invoice[invoice['类型']=='进项']['价税合计'].sum()
diff2 = purchase_total - input_total
# 核查3:应交增值税计算
output_tax = invoice[invoice['类型']=='销项']['税额'].sum()
input_tax = invoice[invoice['类型']=='进项']['税额'].sum()
tax_payable = output_tax - input_tax
# 输出核查报告
print('=' * 50)
print('增值税申报前数据核查报告')
print('=' * 50)
print(f'【核查1】销售台账 vs 销项发票')
print(f' 销售台账含税合计: ¥{sales_total:>15,.2f}')
print(f' 销项发票价税合计: ¥{invoice_total:>15,.2f}')
print(f' 差异: ¥{diff1:>15,.2f} {"【OK】" if abs(diff1) < 1 else "【需核查!】"}')
print()
print(f'【核查2】采购台账 vs 进项发票')
print(f' 采购台账含税合计: ¥{purchase_total:>15,.2f}')
print(f' 进项发票价税合计: ¥{input_total:>15,.2f}')
print(f' 差异: ¥{diff2:>15,.2f} {"【OK】" if abs(diff2) < 1 else "【需核查!】"}')
print()
print(f'【本月应交增值税预估】')
print(f' 销项税额: ¥{output_tax:>15,.2f}')
print(f' 进项税额: ¥{input_tax:>15,.2f}')
print(f' 应交税额: ¥{tax_payable:>15,.2f}')
print('=' * 50)
# 导出核查报告
report = pd.DataFrame([
{'核查项目': '销售台账 vs 销项发票', '台账金额': sales_total,
'发票金额': invoice_total, '差异': diff1, '状态': 'OK' if abs(diff1)<1 else '需核查'},
{'核查项目': '采购台账 vs 进项发票', '台账金额': purchase_total,
'发票金额': input_total, '差异': diff2, '状态': 'OK' if abs(diff2)<1 else '需核查'},
])
report.to_excel('tax_check_report.xlsx', index=False)
print('核查报告已保存')
效果: 3 个数据源的核查,10 秒完成,自动标注有差异的项目。梁税务专员说:「现在申报前跑一遍这个脚本,心里就踏实多了,再也不担心填错数了。」
通过上面 10 个案例,我们看到了一个共同的模式:
工作类型 | 传统耗时 | AI+Python | 效率提升 |
|---|---|---|---|
银行对账 | 2天 | 30秒 | 200倍+ |
报销汇总 | 4小时 | 10秒 | 1440倍+ |
发票提取 | 2天 | 5分钟 | 576倍+ |
利润分析 | 2晚 | 1分钟 | 960倍+ |
账龄分析 | 半天 | 3秒 | 7200倍+ |
折旧计算 | 3小时 | 1秒 | 10800倍+ |
预算预警 | 半天 | 1分钟 | 240倍+ |
合同台账 | 持续跟踪 | 每周1分钟 | - |
财务可视化 | 半天PPT | 2分钟 | 150倍+ |
税务核查 | 2小时 | 10秒 | 720倍+ |
这 10 个案例里的代码,没有一行是财务人员自己手写的——全部由 AI 生成。
财务人员只需要:
第一步:安装 Python(从 python.org 下载,一键安装)
第二步:安装常用库
pip install pandas openpyxl pdfplumber plotly
第三步:打开 AI(ChatGPT/文心一言/通义千问),描述你的问题
第四步:把代码复制到文件,运行
python my_script.py
第五步:遇到报错?把报错信息粘给 AI,让它帮你修复
结语
技术不是财务人的壁垒,而是财务人的翅膀。
当你第一次看到 Python 脚本在 30 秒内完成了你两天的工作,你会发现:原来那些重复性的工作,本来就不该由人来做。
把机械的工作交给代码,把宝贵的时间留给思考、分析和决策——这才是财务人在 AI 时代应有的姿态。