编程学习网 > 编程语言 > Python > Python办公软件自动化,5分钟掌握openpyxl操作!
2026
09-07

Python办公软件自动化,5分钟掌握openpyxl操作!


一个 Excel,三千多行数据,要把未付款的订单筛出来,算逾期天数,再把金额异常的单元格标红。

这种活要是让我手工点筛选、拖公式、改颜色,我基本不会动手。

不是做不了,是这种操作一旦第二天再来一份表,你昨天干的全是一次性劳动。

Python 处理 Excel,我平时用得最多的还是 openpyxl。它不适合把 Excel 玩出花来,但读数据、改数据、加公式、调格式、批量生成报表,办公场景基本够了。

安装就一条:

pip install openpyxl

假设财务给过来一个 orders.xlsx,第一件事不是研究什么 WorkbookWorksheet 对象,我一般直接把文件打开。

from openpyxl import load_workbook
book = load_workbook("orders.xlsx")
sheet = book["订单明细"]
print(sheet.max_row, sheet.max_column)
print(sheet["A2"].value)

book 是整个 Excel 文件,sheet 就是一张工作表。

平时真正用得多的,无非两种取值方式:

order_no = sheet["A2"].value
amount = sheet.cell(row=2, column=5).value

知道这两个,单元格读取基本就够用了。

但实际工作没人一格一格读。

比如我要检查整张订单表,第 4 列是付款状态,第 5 列是订单金额:

for row in sheet.iter_rows(min_row=2):
    order_no = row[0].value
    pay_status = row[3].value
    amount = row[4].value
    if pay_status == "未付款":
        print(order_no, amount)

这里我更喜欢 iter_rows(),比自己拿 range(2, sheet.max_row + 1) 再不断 cell() 看着舒服一点。

而且后面改数据也顺手。

比如财务要求新增一列风险标记,金额超过 5 万并且还没付款的订单标出来:

sheet["F1"] = "风险标记"
for row in sheet.iter_rows(min_row=2):
    status_cell = row[3]
    amount_cell = row[4]
    amount = amount_cell.value or 0
    if status_cell.value == "未付款" and amount >= 50000:
        sheet.cell(row=amount_cell.row, column=6, value="重点跟进")

这就是我觉得 openpyxl 好用的地方。

Excel 在它手里不是办公软件,就是一张可以循环处理的数据表。

新增数据也一样简单。

比如每天跑完对账脚本,需要把异常记录追加到另一张 Sheet

warn_sheet = book["异常记录"]
warn_sheet.append([
    "SO20260817023",
    "客户A",
    "未付款",
    68000,
    "金额超过阈值"
])

append() 这个方法我用得不少。做导入结果、失败明细、数据校验报告时,比自己算最后一行省事。

当然,只把数据写进去还不太像一份能直接交出去的 Excel

办公自动化最后通常都逃不过给它收拾一下

比如异常金额标红、标题加粗:

from openpyxl.styles import Font, PatternFill
header_font = Font(bold=True)
warn_fill = PatternFill(fill_type="solid", fgColor="FFD9D9")
for cell in sheet[1]:
    cell.font = header_font
for row in sheet.iter_rows(min_row=2):
    if row[5].value == "重点跟进":
        row[4].fill = warn_fill

颜色、字体这些东西别配太多。

我见过脚本生成的 Excel,红黄蓝绿什么都有,看着比手工表还累。自动化报表首先得能看,不是展示 openpyxl 会多少样式。

列宽也顺手调一下:

sheet.column_dimensions["A"].width = 20
sheet.column_dimensions["B"].width = 18
sheet.column_dimensions["F"].width = 16
sheet.freeze_panes = "A2"
sheet.auto_filter.ref = sheet.dimensions

冻结首行、加筛选,这两个细节很值。

数据几百行以上,没有冻结标题,往下翻一会儿就不知道自己看的是什么列。

还有一个办公场景很常见:写公式。

比如 E 列是单价,F 列是数量,G 列计算金额:

for row_no in range(2, sheet.max_row + 1):
    sheet[f"G{row_no}"] = f"=E{row_no}*F{row_no}"

这里有个坑我一般会提前提醒。

openpyxl 能把公式写进 Excel,但它自己不会像 Excel 那样执行公式计算。

也就是说,你写进去的是:

=E2*F2

真正的结果通常要等 ExcelWPS 或其他支持公式计算的软件打开文件后重新计算。

如果只是想读取 Excel 上一次保存时已经计算好的结果,可以这样:

book = load_workbook("orders.xlsx", data_only=True)

但用了 data_only=True,你读到的主要就是缓存结果,不是原公式。

这个地方第一次用很容易绕进去。

最后保存:

book.save("orders_checked.xlsx")

一套最常见的 Excel 自动化,到这里其实已经跑通了:

读取原始表格,循环检查数据,修改单元格,追加异常记录,设置样式,再输出一个新文件。

再给一个我平时更愿意写的完整版本。比如每天把业务导出的订单表跑一遍:

from openpyxl import load_workbook
from openpyxl.styles import PatternFill
source_file = "orders.xlsx"
result_file = "orders_checked.xlsx"
book = load_workbook(source_file)
sheet = book["订单明细"]
risk_fill = PatternFill(fill_type="solid", fgColor="FFE5E5")
sheet["F1"] = "检查结果"
for row_no in range(2, sheet.max_row + 1):
    status = sheet.cell(row_no, 4).value
    amount = sheet.cell(row_no, 5).value or 0
    if status == "未付款" and amount >= 50000:
        sheet.cell(row_no, 6, "待人工确认")
        sheet.cell(row_no, 5).fill = risk_fill
    else:
        sheet.cell(row_no, 6, "正常")
sheet.freeze_panes = "A2"
sheet.auto_filter.ref = sheet.dimensions
book.save(result_file)
print(f"处理完成:{result_file}")

别看代码不长,这种脚本在办公室里其实比写一个复杂算法实用得多。

销售日报、财务对账、库存盘点、批量改字段、名单校验、数据导入前清洗,我基本都会先想一下:这个 Excel 是不是能直接让 Python 跑掉。

如果每天都要打开同一个表,点同样的几个按钮,再复制粘贴同样的数据,那就已经不是 Excel 操作问题了。

该写脚本了。

以上就是“Python办公软件自动化,5分钟掌握openpyxl操作!的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。  

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取