当前位置: 首页 > news >正文

办公常用自动化工具

自动化办公工具说明文档

代码全部在底部。

文件批量重命名工具 (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) 

相关文章:

  • 西瓜书简单笔记
  • 操作系统学习笔记-进程调度篇
  • 在线Doc/Docx转换为PDF格式 超快速转换的一款办公软件 文档快速转换 在线转换免费转换办公软件
  • STM32步进电机S型与T型加减速算法
  • 10进制转换成2进制
  • 编写Dockerfile制作tomcat镜像,生成镜像名为tomcat:v1,并推送到私有仓库。
  • Cursor初体验:excel转成CANoe的vsysvar文件
  • spring事务失效的12种场景
  • Deepseek -> 如何在PyTorch中合并张量
  • cesium安装与配置(visual studio版)
  • Linux运维篇-ubuntu22.04及以上版本操作系统配置静态IP
  • 如何搭建一个适配微信小程序,h5,app的工程
  • Matlab深度学习ResNet、迁移学习多标签图像分类及超分辨率处理Grad CAM可视化分析COCO、手写数字数据集...
  • 随机种子的使用
  • Maven工具基础知识(一)
  • 蓝桥杯 C++ b组李白打酒加强版,动规及dfs+记忆化搜索双解
  • 机器学习框架
  • 31页PPT解析数据湖架构、数据湖和数据仓库的区别、湖仓一体化湖仓一体建设解决方案
  • 短视频下载去水印,用什么工具好?
  • 应用于稳态电池模块的 Fluent 等效电路模型
  • 网站开发前台后台/数据分析网官网
  • godaddy做网站/怎么在百度上添加自己的店铺地址
  • ppt做多个网站/站长工具无忧
  • 网站头部图片如何做/武汉seo论坛
  • 网站代码跑偏了怎么做/seo优化中商品权重主要由什么决定
  • 工程建设项目全套流程/seo优化关键词分类