
一个 Excel,三千多行数据,要把“未付款”的订单筛出来,算逾期天数,再把金额异常的单元格标红。
这种活要是让我手工点筛选、拖公式、改颜色,我基本不会动手。
不是做不了,是这种操作一旦第二天再来一份表,你昨天干的全是一次性劳动。
Python 处理 Excel,我平时用得最多的还是 openpyxl。它不适合把 Excel 玩出花来,但读数据、改数据、加公式、调格式、批量生成报表,办公场景基本够了。
安装就一条:
pip install openpyxl
假设财务给过来一个 orders.xlsx,第一件事不是研究什么 Workbook、Worksheet 对象,我一般直接把文件打开。
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
真正的结果通常要等 Excel、WPS 或其他支持公式计算的软件打开文件后重新计算。
如果只是想读取 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教程欢迎持续关注编程学习网。
扫码二维码 获取免费视频学习资料

- 本文固定链接: http://www.phpxs.com/post/14489/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料