Python 在自动化办公汇总和脚本示例

Python 在自动化办公中的应用非常广泛,可大幅减少重复性操作,提升办公效率。以下是一个全面的 Python 自动化办公详解 ,并附带多个常用场景的 代码示例,包括:


一、自动化办公能做什么?

任务类型 示例功能
文档处理(Word/Excel) 生成报告、批量修改、数据填充
邮件处理 自动发邮件、收邮件、附件下载
PDF 操作 拆分、合并、加密、提取文本
文件整理 批量重命名、分类移动、自动归档
数据采集与报表 从网页抓取数据,生成日报或周报
人工流程替代 自动点击、填表、模拟人工输入(结合 pyautogui)

二、Python 自动化常用库一览

库名 用途
openpyxl 操作 Excel(.xlsx
pandas 表格数据处理
docx 操作 Word 文档
smtplib 发送邮件
imaplib 接收邮件
pyautogui 模拟鼠标键盘操作
pdfplumber 提取 PDF 文本内容
PyPDF2 拆分/合并 PDF
schedule 定时任务

三、典型场景代码示例


1. 批量生成 Excel 报表(openpyxl)

python 复制代码
from openpyxl import Workbook

data = [
    ['姓名', '部门', '成绩'],
    ['张三', '销售部', 89],
    ['李四', '技术部', 95]
]

wb = Workbook()
ws = wb.active
ws.title = "员工成绩表"

for row in data:
    ws.append(row)

wb.save("员工成绩表.xlsx")
print(" Excel 报表已生成。")

2. 自动发送邮件(带附件)

python 复制代码
import smtplib
from email.message import EmailMessage

msg = EmailMessage()
msg['Subject'] = '日报 - 自动发送'
msg['From'] = 'your_email@example.com'
msg['To'] = 'receiver@example.com'
msg.set_content('请查收今日日报,见附件。')

# 添加附件
with open('日报.xlsx', 'rb') as f:
    msg.add_attachment(f.read(), maintype='application',
                       subtype='vnd.openxmlformats-officedocument.spreadsheetml.sheet',
                       filename='日报.xlsx')

# 发送邮件(使用QQ邮箱为例)
with smtplib.SMTP_SSL('smtp.qq.com', 465) as smtp:
    smtp.login('your_email@example.com', 'your_app_password')
    smtp.send_message(msg)

print(" 邮件已发送。")

3. 批量提取 PDF 文本(pdfplumber)

python 复制代码
import pdfplumber

with pdfplumber.open('文件.pdf') as pdf:
    all_text = ''
    for page in pdf.pages:
        all_text += page.extract_text() + '\n'

with open('提取内容.txt', 'w', encoding='utf-8') as f:
    f.write(all_text)

print(" PDF 文本已提取。")

4. 自动打开网页、模拟输入(pyautogui + webbrowser)

python 复制代码
import webbrowser
import pyautogui
import time

# 打开网页
webbrowser.open('https://www.google.com')
time.sleep(3)  # 等待页面加载

# 模拟输入搜索内容
pyautogui.write('Python automation', interval=0.1)
pyautogui.press('enter')

print(" 自动搜索已完成。")

5. 定时任务(schedule)

python 复制代码
import schedule
import time

def job():
    print("现在是:", time.strftime("%H:%M:%S"), " → 执行任务")

# 每天早上 9 点执行
schedule.every().day.at("09:00").do(job)

while True:
    schedule.run_pending()
    time.sleep(1)

四、组合案例:自动发送日报

假设你有一个 Excel 日报,每天生成并通过邮件发送:

  1. openpyxl 创建日报
  2. smtplib 发送邮件
  3. schedule 定时运行
  4. 也可打包为 .exe 实现傻瓜式执行(使用 pyinstaller

五、提升建议

  • 使用 logging 模块记录日志
  • 配合 TkinterPyQt 做可视化界面
  • 写成函数模块,支持定制化
  • 学会使用任务计划(Windows)或 crontab(Linux/macOS)

批量处理 Excel 文件是办公自动化中非常常见的需求,比如:

  • 读取多个 Excel 文件中的数据并合并
  • 批量修改单元格内容
  • 提取指定字段后导出为新表
  • 批量生成报表

一、适用场景

场景 示例
批量读取多个 Excel 文件 合并多个日报、月报文件为一个总表
批量修改某列 修改"状态"列中的"未完成"为"完成"
按条件提取或汇总数据 提取销售额大于 1 万的记录
批量写入、创建新表 每人生成一个专属工作表

二、常用库安装

bash 复制代码
pip install openpyxl pandas

三、批量处理 Excel 文件代码示例


示例 1:批量合并多个 Excel 表格

功能 :将某个文件夹下所有 .xlsx 文件合并为一个总表

python 复制代码
import pandas as pd
import os

folder = './excel_files'  # Excel 文件所在文件夹
output_file = '合并结果.xlsx'

all_data = []

for file in os.listdir(folder):
    if file.endswith('.xlsx'):
        file_path = os.path.join(folder, file)
        df = pd.read_excel(file_path)
        df['来源文件'] = file  # 可选:添加来源文件列
        all_data.append(df)

# 合并所有数据
merged_df = pd.concat(all_data, ignore_index=True)
merged_df.to_excel(output_file, index=False)

print(" 所有 Excel 文件已合并到:", output_file)

示例 2:批量修改某一列中的值(如"状态"列)

python 复制代码
import pandas as pd
import os

folder = './excel_files'

for file in os.listdir(folder):
    if file.endswith('.xlsx'):
        path = os.path.join(folder, file)
        df = pd.read_excel(path)

        # 修改 "状态" 列中的"未完成"为"完成"
        df['状态'] = df['状态'].replace('未完成', '完成')

        # 保存覆盖原文件
        df.to_excel(path, index=False)
        print(f" 已修改:{file}")

示例 3:按字段筛选并保存为新表

python 复制代码
import pandas as pd
import os

input_file = '员工信息表.xlsx'
df = pd.read_excel(input_file)

# 筛选工资大于10000的员工
filtered = df[df['工资'] > 10000]

filtered.to_excel('高薪员工.xlsx', index=False)
print(" 筛选结果已保存。")

示例 4:为每位员工生成单独 Excel 表

python 复制代码
import pandas as pd
import os

df = pd.read_excel('员工信息.xlsx')

output_dir = './员工报表'
os.makedirs(output_dir, exist_ok=True)

# 按"姓名"分组,每个员工一个文件
for name, group in df.groupby('姓名'):
    filename = os.path.join(output_dir, f'{name}_报表.xlsx')
    group.to_excel(filename, index=False)
    print(f" 已生成:{filename}")

四、进阶建议

  • Tkinter 加上文件夹选择、按钮,做成 GUI 工具
  • 加日志记录:每次处理记录时间、文件名
  • 使用定时器 + 自动邮件发送,形成完整自动报表流程
  • 使用 openpyxl 更细粒度控制样式、颜色、单元格合并等

自动清洗多个 Excel 表中的重复数据示例:

下面是自动遍历一个文件夹下的多个 Excel 文件,按指定的列去重,并把清洗后的结果另存到一个新文件夹Python脚本。


脚本示例(Python 3 + pandas)

python 复制代码
import os
import pandas as pd

# === 配置区域 ===
input_folder = r"./excel_input"       # 待处理Excel文件所在文件夹
output_folder = r"./excel_output"     # 清洗后文件保存文件夹
subset_columns = None                 # 去重依据的列,例如 ["姓名", "身份证号"],None表示全列去重
keep_rule = "first"                   # 保留规则: "first" 保留首次出现, "last" 保留最后一次, False 保留所有重复(不常用)

# 创建输出文件夹
os.makedirs(output_folder, exist_ok=True)

# 遍历文件夹中的所有Excel文件
for filename in os.listdir(input_folder):
    if filename.lower().endswith((".xls", ".xlsx")):
        file_path = os.path.join(input_folder, filename)
        
        try:
            # 读取Excel(保留所有sheet)
            xls = pd.ExcelFile(file_path)
            cleaned_sheets = {}
            
            for sheet_name in xls.sheet_names:
                df = pd.read_excel(xls, sheet_name=sheet_name)
                
                # 去重
                before_rows = len(df)
                df_cleaned = df.drop_duplicates(subset=subset_columns, keep=keep_rule)
                after_rows = len(df_cleaned)
                
                print(f"{filename} - {sheet_name}: {before_rows} -> {after_rows} 行")
                
                cleaned_sheets[sheet_name] = df_cleaned
            
            # 保存清洗后的文件
            output_path = os.path.join(output_folder, filename)
            with pd.ExcelWriter(output_path, engine="openpyxl") as writer:
                for sheet_name, df_cleaned in cleaned_sheets.items():
                    df_cleaned.to_excel(writer, sheet_name=sheet_name, index=False)
        
        except Exception as e:
            print(f"处理文件 {filename} 时出错: {e}")

print(" 数据清洗完成!")