办公常用自动化工具

发布于:2025-03-13 ⋅ 阅读:(20) ⋅ 点赞:(0)

自动化办公工具说明文档

代码全部在底部。

文件批量重命名工具 (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工作表
  • 应用专业的格式设置(字体、颜色、对齐方式)
  • 自动调整列宽

使用流程图

开始
读取源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模板引擎)
  • 发送带附件的邮件
  • 支持多收件人
  • 使用环境变量存储敏感信息

使用流程图

开始
加载环境变量
创建邮件对象
设置发件人和收件人
设置邮件主题
加载HTML模板
使用模板数据渲染HTML
添加HTML内容到邮件
是否有附件?
添加附件到邮件
连接SMTP服务器
发送邮件
关闭连接
结束

使用示例

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 实现了企业微信消息的监控和自动回复功能,可用于工作流程自动化。

主要功能

  • 接收企业微信消息回调
  • 根据关键词自动回复和处理消息
  • 转发特定消息给管理员
  • 调用外部功能(如报表生成)

使用流程图

开始
配置企业微信参数
创建Flask应用
启动Web服务
等待接收消息
收到消息回调
消息类型是否为文本?
解析消息内容
消息是否包含'请假'?
回复请假确认
转发给管理员
消息是否包含'报表'?
回复报表生成中
调用报表生成函数
发送默认回复

使用示例

# 配置企业微信参数
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处理工具
文件批量重命名
邮件自动发送

综合应用场景

  1. 员工通过企业微信发送"报表请求"
  2. 系统自动生成Excel报表
  3. 批量处理相关文件并规范命名
  4. 通过邮件将处理结果发送给请求者
  5. 通知管理员处理完成

人工操作通常需要数小时的工作,通过此自动化系统可以在几分钟内完成!
文件重命名

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)