page contents

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

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

attachments-2026-10-LmgLIwTZ6adeafb3a015c.png

每个办公室都有一类人:每周五下午,准时打开七八个 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 pd
from pathlib import Path

folder = 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 pd

df = 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 pd

orders = 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_workbook
from openpyxl.styles import PatternFill, Font, Alignment

wb = load_workbook("汇总.xlsx")
ws = wb.active

header_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 的第一笔利息。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

 

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

2541 篇文章

作家榜 »

  1. Pack 2541 文章
  2. 轩辕小不懂 2403 文章
  3. 小柒 2228 文章
  4. Nen 576 文章
  5. 王昭君 216 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章