Python 自动化办公:用 openpyxl 批量处理 Excel 报表的 5 个实用技巧
【摘要】 每月月底都要从十几个分公司收上来的 Excel 报表里做汇总,手动复制粘贴既费时又容易出错。其实用 Python 的 openpyxl 库,几十行代码就能把这些重复劳动全部自动化。本文整理了实际工作中最常用的 5 个技巧,从合并、拆分到美化,一次讲清楚。 环境准备openpyxl 只处理 .xlsx 格式,如果手里还有老的 .xls 文件,可以先转换格式。安装很简单:pip install ...
每月月底都要从十几个分公司收上来的 Excel 报表里做汇总,手动复制粘贴既费时又容易出错。其实用 Python 的 openpyxl 库,几十行代码就能把这些重复劳动全部自动化。本文整理了实际工作中最常用的 5 个技巧,从合并、拆分到美化,一次讲清楚。
环境准备
openpyxl 只处理 .xlsx 格式,如果手里还有老的 .xls 文件,可以先转换格式。安装很简单:
pip install openpyxl
技巧一:批量合并多个工作簿
假设 reports 目录下有各分公司的月报,格式相同,都是"姓名 / 部门 / 销售额"三列,第 1 行是表头:
import os
from openpyxl import load_workbook, Workbook
src_dir = "reports"
merged = Workbook()
ws = merged.active
ws.title = "汇总"
ws.append(["姓名", "部门", "销售额"])
for name in os.listdir(src_dir):
# 跳过非 xlsx 文件和 Excel 打开时产生的临时文件
if not name.endswith(".xlsx") or name.startswith("~$"):
continue
wb = load_workbook(os.path.join(src_dir, name), read_only=True)
for row in wb.active.iter_rows(min_row=2, values_only=True):
ws.append(row)
wb.close()
merged.save("汇总.xlsx")
两个细节值得注意:
- read_only=True 用流式方式读取,文件再大内存占用也很低;
- 一定要过滤 ~$ 开头的临时文件,否则源文件正被打开时会报错。
技巧二:按部门拆分成多个工作表
合并的逆操作。先把数据按部门分组,再分别写入:
from collections import defaultdict
from openpyxl import Workbook, load_workbook
wb = load_workbook("汇总.xlsx")
ws = wb.active
headers = [c.value for c in ws[1]]
groups = defaultdict(list)
for row in ws.iter_rows(min_row=2, values_only=True):
groups[row[1]].append(row)
out = Workbook()
out.remove(out.active)
for dept, rows in groups.items():
sheet = out.create_sheet(dept[:31]) # 工作表名最长 31 个字符
sheet.append(headers)
for r in rows:
sheet.append(r)
out.save("按部门拆分.xlsx")
技巧三:一键美化表头
交给领导看的报表,表头至少要有底色、白字加粗、居中:
from openpyxl.styles import Alignment, Font, PatternFill
header_fill = PatternFill("solid", fgColor="4472C4")
header_font = Font(color="FFFFFF", bold=True)
for cell in ws[1]:
cell.fill = header_fill
cell.font = header_font
cell.alignment = Alignment(horizontal="center", vertical="center")
# 列宽按内容长度自适应(按字符数估算)
for column_cells in ws.columns:
length = max(len(str(c.value)) for c in column_cells if c.value is not None)
ws.column_dimensions[column_cells[0].column_letter].width = length + 4
技巧四:写入公式,让 Excel 自己算
openpyxl 不仅可以写数据,也可以像手工输入一样写公式,文件打开时公式会自动计算:
ws["E1"] = "总计"
ws["E2"] = "=SUM(D2:D100)"
ws["E3"] = '=AVERAGEIF(C2:C100,"华东区",D2:D100)'
注意:如果源文件是在 read_only 模式下写入公式的,公式结果需要 Excel/WPS 打开后才会计算,程序直接读取公式单元格拿到的只是公式字符串本身。
技巧五:每天定时自动出报表
把前面的逻辑封装成 make_report() 之后,配合系统自带的定时任务就能无人值守运行:
- Windows:任务计划程序 → 新建任务 → 每天 08:00 执行 python make_report.py;
- Linux/Mac:crontab -e 添加一行 0 8 * * * /usr/bin/python3 /path/make_report.py。
还可以在脚本结尾加上邮件发送(smtplib)或企业微信/钉钉机器人推送,把报表自动发到群里,彻底解放双手。
小结
| 场景 | 关键 API |
|---|---|
| 合并工作簿 | load_workbook(read_only=True) + iter_rows(values_only=True) |
| 拆分数据 | create_sheet() |
| 美化样式 | PatternFill / Font / Alignment |
| 写公式 | 直接对单元格赋 =SUM(…) 字符串 |
| 定时执行 | 任务计划程序 / crontab |
自动化办公的核心思路是:把"人做的事"翻译成"数据流",合并、清洗、统计、输出每一步都可以代码化。希望这 5 个技巧能帮你把每周几小时的机械劳动压缩成一条命令。如果你有更复杂的场景(多级表头、透视表、图表),欢迎在评论区交流。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)