资讯动态

Python自动化办公教程:从周报整理到定时任务,掌握Excel、Word、PDF批量处理

发布时间:2026/10/16 1:16:41 来源:尧图企业网站定制
简介这是一份面向职场办公人员与编程初学者的Python自动化办公课程资源围绕用代码替代重复手工操作这一目标展开技能层级由入门语法逐步过渡到实战应用。内容覆盖Python基础语法、Excel读写与图表、Word与PDF文档处理、PPT制作、邮件收发、数据库增删改查、网络爬虫及系统文件与进程线程管理等模块并配有习题与实操案例便于边学边练。资源包为1个docx文档约1.84MB以图文教程形式系统梳理各章节知识点目录按模块划分清晰方便按需检索。目前已有1141人学习适合希望提升日常办公效率、减少重复劳动或想系统入门Python自动化方向的读者参考使用。1. 从手动整理 300 份周报到一键生成python自动化办公教程到底在教什么每周一早上某公司的运营岗 A 同学都要做同一件事打开邮箱把 12 个部门发来的周报附件逐个下载统一改名成「部门-日期」格式再把里面的关键数据摘出来填进汇总表。这套动作她做了两年平均耗时 3 小时偶尔漏掉一个附件还得返工。python自动化办公教程要解决的就是这类「重复、有规律、但手动做又累又容易错」的桌面任务。它不是什么高深技术核心就三件事用 Python 读写文件、操控 Excel/Word/PDF、批量处理目录和邮件。适合每天被表格和文档淹没的行政、运营、财务、测试岗也适合想从脚本开始接触编程的新手。学完能落地的标志很明确——你能把一件每周重复 2 小时以上的事压缩成双击一次、10 秒跑完的脚本。这一章先把边界划清楚后面几章再拆具体怎么做、参数怎么调、哪里会翻车。2. 环境与工具链把 python自动化办公教程的第一块砖铺稳很多人卡在第一步不是不会写代码而是环境装完就报错。这一章把最小可用环境搭起来顺带说清每个库为什么选它。2.1 解释器、编辑器与虚拟环境的三件套Python 版本建议 3.10 以上原因是 3.10 起对类型提示和错误信息做了明显优化调试脚本时能少猜很多。编辑器用 VS Code 或 PyCharm 社区版都行前者轻、后者补全强新手我更推荐 VS Code装个 Python 扩展就能跑。虚拟环境是必须的不是可选项。系统级装库一旦版本冲突排查起来就是黑匣子。用 venv 建一个独立环境# 创建名为 office 的虚拟环境 python -m venv office # Windows 激活 office\Scripts\activate # macOS / Linux 激活 source office/bin/activate # 激活后命令行前缀会出现 (office)说明生效激活后所有 pip 安装都只影响这个环境删掉文件夹就等于卸载干净。这一步的收益在后期当你同时维护三个脚本、依赖不同版本的库时不会互相打架。2.2 四个核心库的选型与安装自动化办公绕不开四类文件Excel、Word、PDF、目录与邮件。对应库和选择理由如下任务类型推荐库选它的理由Excel 读写openpyxl支持 .xlsx 读写、公式、样式纯 Python 无外部依赖Excel 数据分析pandas批量统计、透视、合并比手写循环快一个量级Word 文档python-docx段落、表格、样式都能操作API 直观PDF 处理pypdf合并、拆分、提取文本稳定纯 Python目录与文件pathlib标准库跨平台路径处理比 os.path 更清爽邮件收发imaplib / smtplib标准库无需额外依赖够用安装命令一次装齐pip install openpyxl pandas python-docx pypdf提示pandas 在 Windows 上如果装得慢是编译依赖的问题直接装预编译 wheel 即可不要手动编译。2.3 用 pathlib 统一管理文件路径新手最容易翻车的地方是路径拼接。Windows 用反斜杠、macOS 用正斜杠硬编码字符串换台机器就崩。pathlib 把路径当对象处理跨平台自动适配from pathlib import Path # 当前脚本所在目录 base Path(__file__).parent # 拼接子目录/ 运算符由 pathlib 重载 data_dir base / data # 遍历目录下所有 xlsx 文件 for f in data_dir.glob(*.xlsx): print(f.name, f.stat().st_size) # 文件名与字节大小glob(*.xlsx)只匹配当前层要递归子目录用rglob(*.xlsx)。f.stat().st_size返回字节数用来做文件大小过滤很实用比如跳过 0 字节的空文件。把路径统一成 Path 对象后后面所有读写都传它代码可移植性直接上一个台阶。3. Excel 批量处理python自动化办公教程里最高频的落地场景Excel 是办公自动化的主战场。这一章从单文件读写讲到多文件合并再到格式保留每一步都能直接抄。3.1 openpyxl 读写单元格与保留格式openpyxl 的优势是能保留原文件的样式、公式和合并单元格。读一个工作簿from openpyxl import load_workbook # data_onlyTrue 读取公式的计算结果而非公式本身 wb load_workbook(report.xlsx, data_onlyTrue) ws wb.active # 默认第一个工作表 # 按行遍历values_only 直接拿值不拿单元格对象 for row in ws.iter_rows(min_row2, values_onlyTrue): name, amount, date row[0], row[1], row[2] print(name, amount, date)min_row2跳过表头values_onlyTrue返回元组而非 Cell 对象速度快很多。写回时如果要保留原格式用load_workbook打开再改不要用Workbook()新建wb load_workbook(template.xlsx) ws wb[汇总] ws[B2] 12345 # 写入值 ws[B2].number_format #,##0.00 # 设置千分位格式 wb.save(template_filled.xlsx)number_format的取值遵循 Excel 格式代码#,##0.00是千分位加两位小数。这一步的坑在于如果原单元格是合并单元格只有左上角那个格能写值写其他格会报错。3.2 pandas 合并多表与去重统计当目录下有几十个结构相同的表pandas 的concat比手写循环快得多import pandas as pd from pathlib import Path files Path(data).glob(*.xlsx) # 列表推导读入所有表ignore_index 重排索引 df pd.concat([pd.read_excel(f) for f in files], ignore_indexTrue) # 按「部门」分组求金额合计 summary df.groupby(部门, as_indexFalse)[金额].sum() # 按「订单号」去重保留第一条 dedup df.drop_duplicates(subset订单号, keepfirst) summary.to_excel(汇总.xlsx, indexFalse)ignore_indexTrue很关键不加的话每个文件的索引会重复后续按索引取值会错乱。groupby的as_indexFalse让分组键保留为普通列导出时不会变成索引。drop_duplicates的keep参数可选first/last/FalseFalse表示只要重复就全删。3.3 一个可复用的「多表合并 汇总」脚本把上面两步串起来加异常处理和日志就是一个能长期用的脚本import logging import pandas as pd from pathlib import Path logging.basicConfig(levellogging.INFO, format%(asctime)s %(message)s) DATA Path(data) OUT Path(output) OUT.mkdir(exist_okTrue) frames [] for f in DATA.glob(*.xlsx): try: df pd.read_excel(f) df[来源文件] f.name # 标记数据来源便于追溯 frames.append(df) logging.info(已读入 %s%d 行, f.name, len(df)) except Exception as e: logging.error(读取 %s 失败%s, f.name, e) if frames: all_df pd.concat(frames, ignore_indexTrue) result all_df.groupby(部门, as_indexFalse)[金额].sum() result.to_excel(OUT / 汇总.xlsx, indexFalse) logging.info(汇总完成共 %d 行, len(result))df[来源文件] f.name这行是血泪经验合并后如果数据对不上没有来源标记就得逐个文件翻。try/except保证单个文件损坏不会中断整个批次。OUT.mkdir(exist_okTrue)让输出目录不存在时自动创建exist_okTrue避免重复运行时抛异常。4. Word 与 PDF 自动化python自动化办公教程的文档流水线Excel 之外文档类任务同样高频。这一章讲怎么批量生成 Word、怎么合并拆分 PDF。4.1 python-docx 批量生成合同与报告python-docx 的核心对象是 Document、Paragraph、Table。批量生成时通常先做一个模板再用数据替换占位符from docx import Document doc Document(template.docx) # 遍历所有段落替换占位符 for p in doc.paragraphs: if {name} in p.text: for run in p.runs: run.text run.text.replace({name}, 张三) doc.save(output/张三.docx)这里有个细节Word 里一段文字可能被拆成多个 run比如你中途改过字体直接改p.text是只读的必须遍历p.runs逐个替换。如果占位符跨了 run替换会失败稳妥做法是先把整段文本读出来判断再重建段落。表格填充类似table doc.tables[0] table.cell(1, 1).text 2024-06-01 # 第2行第2列cell(row, col)从 0 开始计数第 0 行通常是表头。4.2 pypdf 合并、拆分与提取文本PDF 的常见需求是合并多个文件、按页拆分、提取文字做检索from pypdf import PdfReader, PdfWriter # 合并 writer PdfWriter() for f in [a.pdf, b.pdf, c.pdf]: writer.append(f) writer.write(merged.pdf) writer.close() # 拆分把第 1-3 页单独存一个文件 reader PdfReader(merged.pdf) part PdfWriter() for i in range(3): part.add_page(reader.pages[i]) part.write(part1.pdf) part.close() # 提取文本 text .join(page.extract_text() for page in reader.pages)append直接接文件路径比先读再写省内存。extract_text()对扫描件无效扫描件是图片需要 OCR这是两套技术路线别混。拆分时range(3)对应第 0、1、2 页即文档的第 1 到第 3 页索引从 0 开始这点要记牢。4.3 文档批处理的目录约定与命名规范批量处理最怕文件乱放。我一般约定三层结构input/放原始文件output/放结果archive/放处理完的备份。命名统一用「日期_类型_序号」比如20240601_合同_001.docx。这样脚本里用glob(*.docx)就能稳定匹配排序也不会乱。处理完自动归档import shutil from pathlib import Path src Path(input) done Path(archive) done.mkdir(exist_okTrue) for f in src.glob(*.docx): shutil.move(str(f), done / f.name)shutil.move跨磁盘也能用比os.rename稳。归档前建议先确认输出文件已生成否则原始文件移走了、结果没出来就得从备份找这种翻车我见过不止一次。5. 避坑与排查python自动化办公教程里没人明说的 5 个坑这一章全是踩过的坑按「现象 → 原因 → 解决」写遇到问题直接对号入座。5.1 文件被占用导致 PermissionError现象脚本报PermissionError: [Errno 13] Permission denied明明路径没错。原因目标 Excel 或 Word 文件正被 Office 打开Windows 会锁文件。解决处理前先确认文件已关闭或在脚本里捕获异常并提示批量场景下可以先复制一份到临时目录再操作避开锁。5.2 中文路径与编码乱码现象读取含中文的 CSV 时报UnicodeDecodeError或写入后打开是乱码。原因CSV 默认编码在不同系统不一致Windows 常用 GBK其他平台常用 UTF-8。解决读写时显式指定encodingutf-8-sigutf-8-sig带 BOMExcel 打开不乱码df pd.read_csv(data.csv, encodingutf-8-sig) df.to_csv(out.csv, indexFalse, encodingutf-8-sig)5.3 日期格式被 pandas 读成字符串现象合并后按日期排序结果顺序是乱的。原因Excel 里日期存的是序列号pandas 读进来可能是字符串或数字。解决读入后用pd.to_datetime显式转换errorscoerce把无法解析的置为 NaT便于排查df[日期] pd.to_datetime(df[日期], errorscoerce)5.4 大文件一次性读入内存爆掉现象处理几万行的表时脚本卡死或内存溢出。原因read_excel默认全量加载。解决用chunksize分块读或先过滤列再读for chunk in pd.read_excel(big.xlsx, chunksize5000): process(chunk) # 每 5000 行处理一次5.5 脚本在别人电脑上跑不起来现象自己机器正常同事一跑就报模块找不到。原因依赖没固化或用了绝对路径。解决用pip freeze requirements.txt导出依赖对方pip install -r requirements.txt即可路径全部用Path(__file__).parent相对定位不写死盘符。6. 从脚本到定时任务让 python自动化办公教程真正省下时间脚本写完只是半成品能自动跑才算闭环。这一章讲怎么把脚本变成定时任务以及怎么验证它真的在干活。6.1 用 schedule 做进程内定时最简单的定时方式是在脚本里挂一个调度器适合常驻运行的场景import schedule import time def job(): print(开始执行汇总...) # 这里调用你的汇总函数 schedule.every().day.at(08:30).do(job) schedule.every().monday.at(09:00).do(job) while True: schedule.run_pending() time.sleep(30) # 每 30 秒检查一次every().day.at(08:30)是每天 8:30 执行every().monday是每周一。time.sleep(30)控制检查频率太短浪费 CPU太长会错过精确时间点30 到 60 秒是常见取值。这个方案的局限是脚本必须一直开着关机就停。6.2 系统级定时Windows 任务计划与 cron要脱离终端常驻用系统自带调度。Windows 用「任务计划程序」创建基本任务触发器选每天操作选「启动程序」程序填 python.exe 路径参数填脚本路径。macOS 和 Linux 用 crontab# 编辑当前用户的定时任务 crontab -e # 每天 8:30 执行日志追加到 run.log 30 8 * * * /usr/bin/python3 /path/to/script.py /path/to/run.log 21五个星号依次是分、时、日、月、周。 run.log 21把标准输出和错误都写进日志出问题时有据可查。注意 cron 的环境变量和登录 shell 不同脚本里尽量用绝对路径或在 crontab 顶部显式设置 PATH。6.3 验证脚本真的在跑日志与退出码定时任务最坑的是「以为在跑其实早挂了」。验证手段有三个一是看日志文件有没有新内容二是看输出目录的文件修改时间三是看退出码。在脚本末尾加import sys import logging logging.basicConfig( filenamerun.log, levellogging.INFO, format%(asctime)s %(levelname)s %(message)s ) try: main() logging.info(任务完成) sys.exit(0) # 0 表示成功 except Exception as e: logging.exception(任务失败) sys.exit(1) # 非 0 表示失败调度器可据此告警sys.exit(0)和sys.exit(1)的区别在系统级调度里很重要任务计划程序可以根据退出码判断成败并触发通知。日志用logging.exception会连堆栈一起记比print强太多。6.4 一个我坚持了三年的习惯我自己的习惯是任何自动化脚本上线前先手动跑三遍确认输出一致再故意制造一次异常比如删掉一个输入文件看它是否优雅报错而不是静默跳过。静默失败是自动化最大的敌人——它不报错你以为一切正常等到月底对账才发现少了几百条数据。脚本可以写得丑但日志和退出码不能省。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑