Python 自动化办公,适合处理规则明确、重复频繁、输入输出格式相对稳定的任务,例如:

适合自动化的流程通常有清楚的输入、固定的处理规则和可检查的输出。需要人工判断的环节,例如审批、合同条款解释、异常数据取舍,仍应由人确认。开始前先把现有流程写成几步:输入文件在哪里、怎样判断有效数据、要生成什么结果、遇到异常怎么办。规则越明确,程序越容易维护。
先安装适合当前操作系统的 Python。Windows 安装时可勾选将 Python 添加到 PATH;安装后在终端确认:
python --version
有些系统需要使用 python3。建议每个项目单独创建虚拟环境,避免不同项目依赖互相影响。
mkdir office_task
cd office_task
**Windows**
python -m venv .venv
.venv\Scripts\activate
**macOS 或 Linux**
python3 -m venv .venv
source .venv/bin/activate
激活环境后安装需要的库:
python -m pip install --upgrade pip
python -m pip install pandas openpyxl python-docx
不同任务选择不同工具:
| 任务 | 常用工具 |
|---|---|
| 路径、文件名和目录 | Python 标准库 pathlib、shutil |
| CSV | 标准库 csv,或 pandas |
| Excel 数据清洗、统计、合并 | pandas |
| Excel 单元格、样式和工作表操作 | openpyxl |
| Word 文档 | python-docx |
| 网页交互 | Playwright |
依赖安装后,可以把项目依赖记录下来,方便在另一台电脑上复现:
python -m pip freeze > requirements.txt
在新环境中按文件安装:
python -m pip install -r requirements.txt
文件整理常是最容易上手的自动化任务。使用 pathlib 处理路径,比自己拼接斜杠更适合跨平台。批量修改前,先打印计划结果;确认无误后再执行。
下面的例子把目录中的图片按文件名添加统一前缀。它会跳过目标文件已经存在的情况,避免覆盖:
from pathlib import Path
folder = Path("待整理")
prefix = "归档_"
for path in folder.iterdir:
if not path.is_file:
continue
new_path = path.with_name(prefix + path.name)
if new_path.exists:
print(f"跳过,目标已存在:{new_path.name}")
continue
print(f"计划:{path.name} -> {new_path.name}")
# 确认计划无误后,取消下一行注释
# path.rename(new_path)
如果要按文件创建时间、编号或表格中的映射关系改名,应先检查是否有重名、目标文件是否已存在,以及是否会发生“新旧文件名互相占用”。复杂批量改名通常要先生成完整的改名清单,再分两步执行:先改为临时名称,再改成最终名称。
整理目录时建议遵循几个习惯:
.pdf 或 .xlsx 文件。如果需要按列筛选、汇总、连接多个工作簿,pandas 更方便;如果需要保留或修改单元格样式、批注、合并单元格等,则通常用 openpyxl。两者的 Excel 读写能力和适用格式有差别,可按任务选择,pandas 的 Excel 支持说明见官方文档。
假设每个工作簿都有“日期、部门、金额”三列,下面的程序读取指定目录下的 .xlsx 文件,合并后清理空行和金额格式,并输出汇总结果:
from pathlib import Path
import pandas as pd
source_dir = Path("输入表格")
output_dir = Path("输出")
output_dir.mkdir(exist_ok=True)
frames = []
for file_path in source_dir.glob("*.xlsx"):
if file_path.name.startswith("~$"):
continue
try:
df = pd.read_excel(file_path, sheet_name="明细")
df["来源文件"] = file_path.name
frames.append(df)
except Exception as exc:
print(f"读取失败:{file_path.name},原因:{exc}")
if not frames:
raise SystemExit("没有读取到有效工作簿")
all_data = pd.concat(frames, ignore_index=True)
**统一列名两侧空格,避免“金额 ”与“金额”被当成两列**
all_data.columns = all_data.columns.astype(str).str.strip
required = {"日期", "部门", "金额"}
missing = required - set(all_data.columns)
if missing:
raise ValueError(f"缺少必要列:{sorted(missing)}")
all_data = all_data.dropna(subset=["部门", "金额"])
all_data["日期"] = pd.to_datetime(all_data["日期"], errors="coerce")
all_data["金额"] = pd.to_numeric(all_data["金额"], errors="coerce")
all_data = all_data.dropna(subset=["日期", "金额"])
summary = (
all_data.groupby("部门", as_index=False)["金额"]
.sum
.sort_values("金额", ascending=False)
)
with pd.ExcelWriter(output_dir / "合并结果.xlsx") as writer:
all_data.to_excel(writer, sheet_name="明细", index=False)
summary.to_excel(writer, sheet_name="部门汇总", index=False)
真实工作表往往存在表头行数不一致、列名有别名、日期格式混杂、金额中带货币符号等情况。正式处理前最好统一字段名,并把不符合规则的行单独输出,供人工复核,而不是悄悄丢弃。
如果要编辑已有工作簿的单元格或样式,可以使用 openpyxl:
from openpyxl import load_workbook
workbook = load_workbook("输入.xlsx")
sheet = workbook["Sheet1"]
sheet["D1"] = "处理状态"
sheet["D2"] = "已处理"
workbook.save("输出.xlsx")
要注意, 写 CSV 时也要明确换行和编码: 如果 CSV 会被 Excel 打开,包含 固定格式的通知、确认单、汇报材料等,可以用 Word 模板加数据生成。 如果文档要求统一字体、页眉页脚、页边距或公司标识,建议先在 Word 中制作好模板,再让程序填入内容。逐个生成文档后要检查长文本换行、表格分页、中文字体和文件命名;程序能写入内容,不代表最终版式一定符合使用要求。 能通过正式 API 或直接下载的文件,通常优先用接口或文件处理。只有需要登录、点击页面控件、处理前端动态加载内容时,才考虑浏览器自动化。自动化访问应遵守目标网站的使用规则和访问频率限制,不要绕过权限验证或访问无权处理的数据。openpyxl 不会像 Excel 一样计算公式。以 data_only=True 打开时读取的是文件中上次由电子表格软件保存的公式结果缓存;如果缓存不存在或过期,读到的值可能为空或旧值。另有一些工作簿对象可能无法被完整保留,修改重要文件前应先备份,并对输出文件做抽查。相关行为和限制可见import csv
from pathlib import Path
csv_path = Path("名单.csv")
with csv_path.open("r", encoding="utf-8-sig", newline="") as file:
reader = csv.DictReader(file)
for row in reader:
print(row)
utf-8-sig 可以兼容带 UTF-8 签名的文件。有些由办公软件导出的中文 CSV 使用本地编码;如果打开后乱码,应先确认文件实际编码,再使用相应编码读取,不要反复尝试后就把乱码数据当作有效内容。import csv
rows = [
{"姓名": "林青", "部门": "财务"}
{"姓名": "周宁", "部门": "采购"}
]
with open("名单输出.csv", "w", encoding="utf-8-sig", newline="") as file:
writer = csv.DictWriter(file, fieldnames=["姓名", "部门"])
writer.writeheader
writer.writerows(rows)=, +, -, @ 等开头的用户输入可能被识别为公式。对于来自外部的文本字段,应评估是否需要将其作为纯文本处理,尤其是将数据提供给他人打开时。用模板生成 Word 文档
python-docx 支持创建和修改 .docx 文档,可添加段落、表格和标题样式;其基本用法见from docx import Document
records = [
{"姓名": "林青", "部门": "财务", "事项": "费用报销"}
{"姓名": "周宁", "部门": "采购", "事项": "供应商对账"}
]
for record in records:
doc = Document
doc.add_heading("事项办理通知", level=1)
doc.add_paragraph(f"姓名:{record['姓名']}")
doc.add_paragraph(f"部门:{record['部门']}")
doc.add_paragraph(f"办理事项:{record['事项']}")
doc.add_paragraph("请按内部流程办理。")
output_path = f"通知_{record['姓名']}.docx"
doc.save(output_path)
网页自动化要先判断是否真的需要浏览器