夜雨聆风学习资料网

ARTICLE · 1074614

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

Python 操作 Excel 实战:4 个场景把报表活交给脚本
Python 办公自动化 · 第 2 篇Python 操作 Excel 实战:4 个场景把报表活交给脚本

配图由 AI 生成 · 仅作视觉示意

本篇你将 get 到

① 先选对库:openpyxl 还是 pandas
② 场景一:批量读取与改写
③ 场景二:合并几十个表格

内容摘要

合并几十个 Excel、批量改格式、一键美化成交差报表、顺手生成图表——这些每月重复到吐的表活,用 openpyxl 几十行脚本就能交给机器。本文按真实工作场景拆解 4 个高频用法,附可直接套用的代码,并点出 openpyxl 几个最容易踩的坑。

1.先选对库:openpyxl 还是 pandas
重点:要"造报表、调样式、出图表"用 openpyxl;要"算数据、做清洗"用 pandas。
很多人一上来就 pandas,结果想给表头上个色发现不会。两者分工很明确:

import openpyxl   # 精细控制单元格:样式、图表、公式,适合"造报表"

import pandas as pd  # 批量数据计算、清洗,适合"算数据",但样式能力弱

记住一句:openpyxl 动的是"单元格长什么样",pandas 动的是"数据怎么算"。本文四个场景,全用 openpyxl。
2.场景一:批量读取与改写
正确:用 iter_rows 逐行遍历,别用下标硬点。
最典型的活:给某列统一加前缀、把文本转大写、按规则改值。比如给订单号批量加"ORD-"前缀:

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")                  # 另存,不覆盖原文件

读用 load_workbook,写用 wb.save。永远另存成新文件,原文件留着当备份。
3.场景二:合并几十个表格
停下来想一想:你手头是不是也有一堆"分公司表""每日表"等着手动拼?
12 个分公司的表结构一模一样,合并就是遍历 + 追加:

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")

values_only=True 直接拿值不拿样式,合并又快又干净。结构一致才能这么拼,结构乱的得先对齐再合。
4.场景三:一键美化成交差的报表
重点:机器生成的表能跑,但"能交差"得靠样式。
合并完的表灰扑扑,发给老板像草稿。openpyxl 调样式就几行:表头蓝底白字、列宽、边框、冻结首行。

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"                      # 滚动时表头不动

颜色值用十六进制,不带 #。freeze_panes="A2" 让首行固定,几百行也不晕。
5.场景四:写公式 + 顺手出图表
正确:公式直接写字符串,Excel 打开自己算;别在 Python 里先算好再填。
求和、占比这类,让 Excel 算更稳(别人改数据会自动更新):

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")

注意:openpyxl 写公式没问题,但它读不出公式的计算结果(读出来是字符串 =SUM(...))。要拿结果得用 data_only=True 且文件被 Excel 打开过一次。
6.4 个最容易踩的坑
openpyxl 动的是数据层,原表里有些东西它会"看不见"。
1. 图表和图片会丢:load_workbook 只认数据,原表的图表、图片、宏读不进来,save 后就没了。要保原样,先复制模板再改。
2. 老格式 .xls 不支持:openpyxl 只认 .xlsx。老文件先用 Excel 另存为 xlsx,或走 pandas + xlrd。
3. 大文件卡内存:几万行用 load_workbook(filename, read_only=True) 只读模式,省内存跑得快。
4. 路径含中文:Python 3 默认 UTF-8 没问题,但要确认文件真在那个路径。建议用 pathlib.Path 拼路径,跨系统不踩雷。
停下来想一想:这 4 个坑你踩过几个?卡在哪条,评论区说,我挑典型的下篇拆解。
✍️ 小结
造报表、调样式、出图用 openpyxl;算数据用 pandas
读取改写用 iter_rows,合并用遍历 + 追加
美化靠 PatternFill / Font / Border / freeze_panes
公式让 Excel 自己算,图表用 BarChart 直接画
守住四坑:图表会丢、不认 xls、大文件用只读、中文路径用 pathlib
点个「在看」鼓励一下
💬 评论区聊两句

你在使用中踩过什么坑?或者对今天的内容有不同看法?欢迎在评论区聊聊,咱们一起讨论 👇

#Python#办公自动化#Excel#openpyxl#Python办公自动化
本系列还有

01 Python 办公自动化实战:6 步流程让重复工作自动跑

本文为个人经验整理,仅供参考。代码以 Python 3.11 + openpyxl 3.x 为准。

相关学习资料