夜雨聆风学习资料网

ARTICLE · 1251333

Python 操作 Excel:把每周 3 小时的重复劳动,压缩成 30 秒

Python 操作 Excel:把每周 3 小时的重复劳动,压缩成 30 秒

每个办公室都有一类人:每周五下午,准时打开七八个 Excel,复制、粘贴、透视、汇总、调格式——2~3 小时的机械劳动,内容固定、步骤固定、下周继续。这一类活,恰恰是 Python 自动化最擅长的领域:读表、合并、计算、汇总、写回、发邮件,全流程 30 秒跑完。

这篇对标的是「完全没写过程序的办公族」和「会点 Python 但没系统用过 openpyxl/pandas 的人」——六个最高频场景,每个给可直接抄的代码模板。读这篇文章不需要编程基础,只需要你会把代码粘进编辑器改几个文件名。

一、装备:两个库,5 分钟装好

pip install pandas openpyxl
pandas:数据处理的主力(读表/筛选/汇总/合并/透视)openpyxl:精细控制 Excel 本身(格式/样式/图表/单元格)分工:数据计算用 pandas,颜值和格式用 openpyxl

二、场景 1:合并多个 Excel(每月最痛的活)

30 个门店各自交一张表,要合并成一张总表——手工是 30 次复制粘贴:

import pandas as pdfrom pathlib import Pathfolder = Path("门店报表")                     # 改成你的文件夹名frames = []for file in folder.glob("*.xlsx"):    df = pd.read_excel(file)                  # 逐个读取    df["来源文件"] = file.stem                 # 记下来自哪张表    frames.append(df)total = pd.concat(frames, ignore_index=True)  # 纵向拼接total.to_excel("总表.xlsx", index=False)      # 写出print(f"合并完成:{len(frames)} 张表,共 {len(total)} 行")

改一个文件夹名就能用——这段模板值回全部学习成本。

三、场景 2:按条件筛选 + 汇总(透视表的代码版)

import pandas as pddf = pd.read_excel("销售明细.xlsx")mask = (df["区域"] == "华东") & (df["金额"] > 1000)result = df[mask]summary = (result.groupby(["区域", "产品"])                 .agg(销量=("数量", "sum"),                      总金额=("金额", "sum"),                      订单数=("订单号", "count"))                 .reset_index()                 .sort_values("总金额", ascending=False))summary.to_excel("汇总.xlsx", index=False)

groupby + agg 就是透视表的代码版——写一次,每月复用,列名改成你的。

四、场景 3:多表关联(VLOOKUP 的代码版,但更强)

import pandas as pdorders = pd.read_excel("订单.xlsx")       # 有一列"客户ID"clients = pd.read_excel("客户名单.xlsx")  # 有"客户ID"和"客户等级"merged = orders.merge(clients[["客户ID", "客户等级"]],                      on="客户ID", how="left")merged["客户等级"] = merged["客户等级"].fillna("未知")merged.to_excel("订单含等级.xlsx", index=False)

merge 比 VLOOKUP 强在:百万行不卡死、多列关联一行搞定、找不到不报错只标记。

五、场景 4:格式与美化(openpyxl 登场)

pandas 写出的表是「素颜」的,发给老板前要加个表头底色和列宽:

from openpyxl import load_workbookfrom openpyxl.styles import PatternFill, Font, Alignmentwb = load_workbook("汇总.xlsx")ws = wb.activeheader_fill = PatternFill("solid", fgColor="4472C4")for cell in ws[1]:    cell.font = Font(bold=True, color="FFFFFF")    cell.fill = header_fill    cell.alignment = Alignment(horizontal="center")for column in ws.columns:    width = max(len(str(c.value or "")) for c in column) + 4    ws.column_dimensions[column[0].column_letter].width = min(width, 40)wb.save("汇总-美化版.xlsx")

六、场景 5:定时自动运行(自动化=无人值守)

手动跑脚本还差一步——让它自己定时跑(Windows 任务计划程序 / Linux cron):

Windows:任务计划程序 → 创建基本任务 → 触发器选「每周五 17:00」         → 操作选「启动程序」→ 程序填 python,参数填脚本路径Linux/Mac:crontab -e 加一行         0 17 * * 5 cd /path/to/scripts && python merge_report.py

配上前面的合并+汇总+美化,就是一条每周五下午自动生成、自动格式化的完整流水线——你周报里的数据部分,从此零手工。

七、避坑四条(新手最常撞的墙)

坑 1:合并单元格的表头读出来是 NaN——      读取前先把 Excel 里的合并单元格拆开,      或读的时候指定 header 行(pd.read_excel(file, header=2))坑 2:日期读成了一串数字(45000 之类)——      这是 Excel 的日期序列号,处理:      pd.to_datetime(df["日期列"], origin="1899-12-30", unit="D")      (或读的时候就用 openpyxl 按单元格格式读)坑 3:数字被读成了文本——"1,000" 带千分位的字符串:      df["金额"] = df["金额"].astype(str).str.replace(",", "").astype(float)坑 4:写回时把公式覆盖掉了——pandas 写出会抹掉公式,      需要「保留公式只改数据」的场景用 openpyxl      逐单元格写入,别用 to_excel 整表覆盖

Excel 自动化是 Python 应用的性价比之王:学习成本一两天,回报是每周固定省下的几小时。给你的起步建议:挑你手里重复次数最多的那张表(一定有一张),按场景 1 或 2 的模板改个文件名跑一遍——第一次跑通的那个瞬间,你会开始用「这个能不能自动化」的眼光重新审视手头所有工作。工具的价值从来不在于多高级,在于它替你守住的那几个小时——省下来的时间,才是你学 Python 的第一笔利息。

相关学习资料