ARTICLE · 1074614
Python 操作 Excel 实战:4 个场景把报表活交给脚本

配图由 AI 生成 · 仅作视觉示意
① 先选对库:openpyxl 还是 pandas
② 场景一:批量读取与改写
③ 场景二:合并几十个表格
合并几十个 Excel、批量改格式、一键美化成交差报表、顺手生成图表——这些每月重复到吐的表活,用 openpyxl 几十行脚本就能交给机器。本文按真实工作场景拆解 4 个高频用法,附可直接套用的代码,并点出 openpyxl 几个最容易踩的坑。
import openpyxl # 精细控制单元格:样式、图表、公式,适合"造报表"
import pandas as pd # 批量数据计算、清洗,适合"算数据",但样式能力弱
import openpyxl
wb = openpyxl.load_workbook("销售表.xlsx")
ws = wb.active
for row in ws.iter_rows(min_row=2): # 跳过表头
if row[2].value: # C 列是订单号
row[2].value = f"ORD-{row[2].value}"
wb.save("销售表_新.xlsx") # 另存,不覆盖原文件
import openpyxl, os
target = openpyxl.Workbook()
t = target.active
t.append(["分公司", "月份", "销售额"]) # 先写表头
for f in os.listdir("各分公司"):
if not f.endswith(".xlsx"):
continue
s = openpyxl.load_workbook(f"各分公司/{f}").active
for row in s.iter_rows(values_only=True):
t.append(row) # 整行追加
target.save("全年汇总.xlsx")
from openpyxl.styles import Font, PatternFill, Border, Side
head_fill = PatternFill("solid", fgColor="2B6CB0") # 靛蓝表头
head_font = Font(bold=True, color="FFFFFF", size=11)
thin = Side(style="thin", color="D0D7E2")
border = Border(left=thin, right=thin, top=thin, bottom=thin)
for cell in ws[1]: # 表头行
cell.fill = head_fill
cell.font = head_font
for row in ws.iter_rows(): # 全表加边框
for cell in row:
cell.border = border
ws.column_dimensions["A"].width = 16 # 列宽
ws.column_dimensions["C"].width = 12
ws.freeze_panes = "A2" # 滚动时表头不动
ws["D2"] = "=SUM(C2:C100)" # 总计,Excel 打开即生效
from openpyxl.chart import BarChart, Reference
chart = BarChart()
data = Reference(ws, min_col=3, min_row=1, max_row=100) # C 列数据
chart.add_data(data, titles_from_data=True)
ws.add_chart(chart, "F2") # 图表放 F2 起
wb.save("带图表.xlsx")
2. 老格式 .xls 不支持:openpyxl 只认 .xlsx。老文件先用 Excel 另存为 xlsx,或走 pandas + xlrd。
4. 路径含中文:Python 3 默认 UTF-8 没问题,但要确认文件真在那个路径。建议用 pathlib.Path 拼路径,跨系统不踩雷。
读取改写用 iter_rows,合并用遍历 + 追加
美化靠 PatternFill / Font / Border / freeze_panes
守住四坑:图表会丢、不认 xls、大文件用只读、中文路径用 pathlib
你在使用中踩过什么坑?或者对今天的内容有不同看法?欢迎在评论区聊聊,咱们一起讨论 👇
01 Python 办公自动化实战:6 步流程让重复工作自动跑