办公常用自动化工具
自动化办公工具说明文档
代码全部在底部。
文件批量重命名工具 (file_renamer.py)
功能概述
file_renamer.py
是一个用于批量重命名文件的工具,可以根据自定义规则为文件重命名,支持按日期、序号、原文件名等格式进行命名。
主要功能
- 支持按文件类型过滤(只处理特定扩展名文件)
- 支持添加日期前缀
- 防止文件名重复(自动添加序号后缀)
- 自定义命名模式,支持多种变量替换
使用流程图
使用示例
# 将图片文件重命名为"照片_20230601_001.jpg"格式
batch_rename(
folder_path="D:/文档/图片",
pattern="照片_{date}_{index}",
file_types=['.jpg', '.png', '.jpeg'],
add_date=True
)
依赖项
- os
- re
- datetime
- pathlib
Excel自动处理工具 (excel_processor.py)
功能概述
excel_processor.py
提供Excel文件的自动化处理功能,包括数据分析、格式化和报表生成。
主要功能
- 读取Excel源文件数据
- 执行数据计算和汇总
- 生成新的Excel工作表
- 应用专业的格式设置(字体、颜色、对齐方式)
- 自动调整列宽
使用流程图
使用示例
generate_report(
source_file="销售数据.xlsx",
output_file="销售报表.xlsx",
report_title="2023年第一季度销售报表"
)
依赖项
- pandas
- openpyxl
- datetime
邮件自动发送工具 (email_sender.py)
功能概述
email_sender.py
实现了邮件的自动发送功能,支持HTML模板、动态数据和文件附件。
主要功能
- 使用HTML模板生成邮件内容
- 支持动态数据渲染(使用Jinja2模板引擎)
- 发送带附件的邮件
- 支持多收件人
- 使用环境变量存储敏感信息
使用流程图
使用示例
send_email_with_template(
to_addresses=["收件人@example.com"],
subject="月度销售报告",
template_file="templates/monthly_report.html",
template_data={
"name": "张经理",
"department": "销售部",
"month": "五月",
"sales": 125000,
"target": 100000,
"products": [
{"name": "产品A", "sales": 45000},
{"name": "产品B", "sales": 30000},
{"name": "产品C", "sales": 50000}
]
},
attachments=["reports/sales_may.xlsx", "reports/chart.pdf"]
)
依赖项
- smtplib
- email.mime
- jinja2
- python-dotenv
企业微信消息监控工具 (wechat_monitor.py)
功能概述
wechat_monitor.py
实现了企业微信消息的监控和自动回复功能,可用于工作流程自动化。
主要功能
- 接收企业微信消息回调
- 根据关键词自动回复和处理消息
- 转发特定消息给管理员
- 调用外部功能(如报表生成)
使用流程图
使用示例
# 配置企业微信参数
CORP_ID = "your_corp_id"
CORP_SECRET = "your_corp_secret"
AGENT_ID = "your_agent_id"
# 启动应用
app.run(host='0.0.0.0', port=5000, debug=True)
依赖项
- flask
- requests
- logging
- json
系统集成建议
以上四个模块可以组合使用,实现完整的办公自动化流程:
综合应用场景
- 员工通过企业微信发送"报表请求"
- 系统自动生成Excel报表
- 批量处理相关文件并规范命名
- 通过邮件将处理结果发送给请求者
- 通知管理员处理完成
人工操作通常需要数小时的工作,通过此自动化系统可以在几分钟内完成!
文件重命名
import os
import re
import datetime
from pathlib import Path
def batch_rename(folder_path, pattern, file_types=None, add_date=False):
"""
批量重命名文件
参数:
folder_path: 文件夹路径
pattern: 命名模式,如"doc_{index}_{original}"
file_types: 需处理的文件类型列表,如['.jpg', '.png']
add_date: 是否添加日期前缀
"""
files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f))]
# 文件类型过滤
if file_types:
files = [f for f in files if any(f.lower().endswith(ext) for ext in file_types)]
# 按文件名排序
files.sort()
today = datetime.datetime.now().strftime('%Y%m%d')
for idx, filename in enumerate(files, 1):
# 获取文件扩展名
file_path = os.path.join(folder_path, filename)
name, ext = os.path.splitext(filename)
# 构建新文件名
new_name = pattern.format(
index=f"{idx:03d}",
original=name,
ext=ext,
date=today
)
if add_date:
new_name = f"{today}_{new_name}"
# 确保新文件名有扩展名
if not new_name.endswith(ext):
new_name += ext
new_path = os.path.join(folder_path, new_name)
# 防止文件名重复
counter = 1
while os.path.exists(new_path):
new_name = f"{new_name.replace(ext, '')}_{counter}{ext}"
new_path = os.path.join(folder_path, new_name)
counter += 1
os.rename(file_path, new_path)
print(f"已重命名: {filename} -> {new_name}")
# 使用示例
if __name__ == "__main__":
batch_rename(
folder_path="D:/文档/图片",
pattern="照片_{date}_{index}",
file_types=['.jpg', '.png', '.jpeg'],
add_date=True
)
Excel自动处理工具
import pandas as pd
import openpyxl
from openpyxl.styles import Font, PatternFill, Alignment
import datetime
def generate_report(source_file, output_file, report_title="月度报表"):
"""生成格式化的Excel报表"""
# 读取源数据
df = pd.read_excel(source_file)
# 数据处理
df['总价'] = df['单价'] * df['数量']
summary = df.groupby('类别')['总价'].sum().reset_index()
# 创建一个新的Excel工作簿
writer = pd.ExcelWriter(output_file, engine='openpyxl')
# 写入主数据
df.to_excel(writer, sheet_name='详细数据', index=False)
summary.to_excel(writer, sheet_name='汇总', index=False)
# 获取工作簿对象
workbook = writer.book
# 格式化详细数据表
ws = workbook['详细数据']
# 添加标题
ws.insert_rows(1)
ws.merge_cells('A1:E1')
ws['A1'] = f"{report_title} - {datetime.datetime.now().strftime('%Y-%m-%d')}"
ws['A1'].font = Font(size=16, bold=True)
ws['A1'].alignment = Alignment(horizontal='center')
# 设置表头样式
header_row = 2
for cell in ws[header_row]:
cell.font = Font(bold=True)
cell.fill = PatternFill(start_color="DDEBF7", end_color="DDEBF7", fill_type="solid")
# 调整列宽
for column in ws.columns:
max_length = 0
column_letter = column[0].column_letter
for cell in column:
if cell.value:
max_length = max(max_length, len(str(cell.value)))
adjusted_width = (max_length + 2)
ws.column_dimensions[column_letter].width = adjusted_width
# 保存工作簿
writer.close()
print(f"报表已生成: {output_file}")
# 使用示例
if __name__ == "__main__":
generate_report(
source_file="销售数据.xlsx",
output_file="销售报表.xlsx",
report_title="2023年第一季度销售报表"
)
自动发送邮件工具
import smtplib
import os
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from jinja2 import Template
from dotenv import load_dotenv
# 加载环境变量
load_dotenv()
def send_email_with_template(to_addresses, subject, template_file, template_data, attachments=None):
"""
发送带有模板和附件的邮件
参数:
to_addresses: 收件人列表
subject: 邮件主题
template_file: HTML模板文件路径
template_data: 模板数据字典
attachments: 附件文件路径列表
"""
# 获取邮箱配置
smtp_server = os.getenv("SMTP_SERVER")
smtp_port = int(os.getenv("SMTP_PORT", 587))
email_address = os.getenv("EMAIL_ADDRESS")
email_password = os.getenv("EMAIL_PASSWORD")
# 创建邮件对象
msg = MIMEMultipart()
msg['From'] = email_address
if isinstance(to_addresses, list):
msg['To'] = ', '.join(to_addresses)
else:
msg['To'] = to_addresses
msg['Subject'] = subject
# 渲染HTML模板
with open(template_file, 'r', encoding='utf-8') as f:
template_content = f.read()
template = Template(template_content)
html = template.render(**template_data)
# 添加HTML内容
msg.attach(MIMEText(html, 'html'))
# 添加附件
if attachments:
for file_path in attachments:
if os.path.exists(file_path):
with open(file_path, "rb") as f:
file_name = os.path.basename(file_path)
part = MIMEApplication(f.read(), Name=file_name)
part['Content-Disposition'] = f'attachment; filename="{file_name}"'
msg.attach(part)
# 发送邮件
try:
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls() # 加密连接
server.login(email_address, email_password)
server.sendmail(email_address, to_addresses, msg.as_string())
server.quit()
print(f"邮件已成功发送给 {to_addresses}")
return True
except Exception as e:
print(f"发送邮件失败: {str(e)}")
return False
# 使用示例
if __name__ == "__main__":
# 准备邮件数据
recipients = ["收件人@example.com"]
email_subject = "月度销售报告"
# 模板数据
data = {
"name": "张经理",
"department": "销售部",
"month": "五月",
"sales": 125000,
"target": 100000,
"products": [
{"name": "产品A", "sales": 45000},
{"name": "产品B", "sales": 30000},
{"name": "产品C", "sales": 50000}
]
}
# 发送邮件
send_email_with_template(
recipients,
email_subject,
"templates/monthly_report.html",
data,
["reports/sales_may.xlsx", "reports/chart.pdf"]
)
企业微信消息监控
import json
import time
import requests
import logging
from flask import Flask, request, jsonify
# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
# 企业微信配置
CORP_ID = "your_corp_id"
CORP_SECRET = "your_corp_secret"
AGENT_ID = "your_agent_id"
TOKEN = "your_token"
ENCODING_AES_KEY = "your_encoding_aes_key"
# 创建Flask应用
app = Flask(__name__)
def get_access_token():
"""获取企业微信API访问令牌"""
url = f"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={CORP_ID}&corpsecret={CORP_SECRET}"
response = requests.get(url)
data = response.json()
if data["errcode"] == 0:
return data["access_token"]
else:
logger.error(f"获取access_token失败: {data}")
return None
def send_message(user_id, content):
"""发送企业微信消息"""
access_token = get_access_token()
if not access_token:
return False
url = f"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={access_token}"
data = {
"touser": user_id,
"msgtype": "text",
"agentid": AGENT_ID,
"text": {
"content": content
},
"safe": 0
}
response = requests.post(url, json=data)
result = response.json()
if result["errcode"] == 0:
logger.info(f"消息发送成功: {user_id}")
return True
else:
logger.error(f"消息发送失败: {result}")
return False
# 接收企业微信消息回调
@app.route('/wechat', methods=['POST'])
def wechat_callback():
data = request.json
logger.info(f"收到企业微信消息: {data}")
# 处理文本消息
if data.get("MsgType") == "text":
from_user = data.get("FromUserName")
content = data.get("Content", "")
# 根据关键词处理消息
if "请假" in content:
# 处理请假申请
reply = "已收到您的请假申请,正在处理中..."
send_message(from_user, reply)
# 转发给管理员
send_message("manager_user_id", f"收到{from_user}的请假申请:{content}")
elif "报表" in content:
# 处理报表请求
reply = "报表生成中,稍后将发送给您..."
send_message(from_user, reply)
# 这里可以调用报表生成函数
# generate_report(...)
else:
# 默认回复
send_message(from_user, "您的消息已收到,将尽快处理。")
return jsonify({"errcode": 0})
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000, debug=True)