办公常用自动化工具

news2025/3/14 0:39:39

自动化办公工具说明文档

代码全部在底部。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2314557.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

字节跳动 —— 建筑物组合(滑动窗口+溢出问题)

原题描述: 题目精炼: 给定N个建筑物的位置和一个距离D,选取3个建筑物作为埋伏点,找出所有可能的建筑物组合,使得每组中的建筑物之间的最大距离不超过D。最后,输出不同埋伏方案的数量并对99997867取模。 识…

开源数字人模型Heygem

一、Heygem是什么 Heygem 是硅基智能推出的开源数字人模型,专为 Windows 系统设计。基于先进的AI技术,仅需1秒视频或1张照片,能在30秒内完成数字人形象和声音克隆,在60秒内合成4K超高清视频。Heygem支持多语言输出、多表情动作&a…

Linux远程工具SecureCRT下载安装和使用

SecureCRT下载安装和使用 SecureCRT是一款功能强大的终端仿真软件,它支持SSH、Telnet等多种协议,可以连接和管理基于Unix和Windows的远程主机和网络设备。SecureCRT提供了语法高亮、多标签页管理、会话管理、脚本编辑等便捷功能,安全性高、操…

江科大51单片机笔记【15】直流电机驱动(PWM)

写在前言 此为博主自学江科大51单片机(B站)的笔记,方便后续重温知识 在后面的章节中,为了防止篇幅过长和易于查找,我把一个小节分成两部分来发,上章节主要是关于本节课的硬件介绍、电路图、原理图等理论…

【网络协议详解】——QOS技术(学习笔记)

目录 QoS简介 QoS产生的背景 QoS服务模型 基于DiffServ模型的QoS组成 MQC简介 MQC三要素 MQC配置流程 优先级映射配置(DiffServ域模式) 优先级映射概述 优先级映射原理描述 优先级映射 PHB行为 流量监管、流量整形和接口限速简介 流量监管 流量整形 接口限速…

Spring学习笔记:工厂模式与反射机制实现解耦

1.什么是Spring? spring是一个开源轻量级的java开发应用框架,可以简化企业级应用开发 轻量级 1.轻量级(对于运行环境没有额外要求) 2.代码移植性高(不需要实现额外接口) JavaEE的解决方案 Spring更像是一种解决方案,对于控制层,它有Spring…

pytest数据库测试文章推荐

参考链接: 第一部分:http://alextechrants.blogspot.fi/2013/08/unit-testing-sqlalchemy-apps.html第二部分:http://alextechrants.blogspot.fi/2014/01/unit-testing-sqlalchemy-apps-part-2.html

vue3 二次封装uni-ui中的组件,并且组件中有 v-model 的解决方法

在使用uniappvue3开发中&#xff0c; 使用了uni-ui的组件&#xff0c;但是我们也需要自定义组件&#xff0c;比如我要自定一个picker 的组件&#xff0c; 是在 uni-data-picker 组件的基础上进行封装的 父组件中的代码 <classesselect :selectclass"selectclass"…

探索高性能AI识别和边缘计算 | NVIDIA Jetson Orin Nano 8GB 开发套件的全面测评

随着边缘计算和人工智能技术的迅速发展&#xff0c;性能强大的嵌入式AI开发板成为开发者和企业关注的焦点。NVIDIA近期推出的Jetson Orin Nano 8GB开发套件&#xff0c;凭借其40 TOPS算力、高效的Ampere架构GPU以及出色的边缘AI能力&#xff0c;引起了广泛关注。本文将从配置性…

【学习笔记】《逆向工程核心原理》03.abex‘crackme-2、函数的调用约定、视频讲座-Tut.ReverseMe1

文章目录 abexcrackme-21. Visual Basic文件的特征1.1. VB专用引擎1.2. 本地代码与伪代码1.3. 事件处理程序1.4. 未文档化的结构体 2. 开始调试2.1. 间接调用2.2. RT_MainStruct结构体2.3. ThunRTMain()函数 3. 分析crackme3.1. 检索字符串3.2. 查找字符串地址3.3. 生成Serial的…

React基础之项目实战

规范的项目结构 安装scss npm install sass -D 安装Ant Design组件库 内置了一些常用的组件 npm install antd --save 路由基础配置 npm i react-router-dom 路由基本入口 import Layout from "../page/Layout"; import Login from "../page/Login"; impor…

SAP-ABAP:SAP数据库视图的创建图文详解

在SAP ABAP中&#xff0c;数据库视图&#xff08;Database View&#xff09;是通过ABAP字典&#xff08;ABAP Dictionary&#xff09;创建的。数据库视图是基于一个或多个数据库表的虚拟表&#xff0c;它允许你定义一种逻辑视图来访问数据。以下是创建数据库视图的步骤&#xf…

基于深度学习的肺炎X光影像自动诊断系统实现,真实操作案例分享,值得学习!

医疗影像智能化的技术演进 医学影像分析正经历从人工判读到AI辅助诊断的革命性转变。传统放射科医师分析胸部X光片需要8-12年专业训练&#xff0c;而基于深度学习的智能系统可在秒级完成检测。本文将以肺炎X光检测为切入点&#xff0c;详解从数据预处理到模型部署的全流程实现。…

Unity Shader学习总结

1.帧缓冲区和颜色缓冲区区别 用于存储每帧每个像素颜色信息的缓冲区 帧缓冲区包括&#xff1a;颜色缓冲区 深度缓冲区 模板缓冲区 自定义缓冲区 2.ImageEffectShader是什么 后处理用的shader模版 3.computerShader 独立于渲染管线之外&#xff0c;在显卡上运行&#xff0c;大量…

算法精讲 | 树(番外):平衡世界的四大守护者:AVL vs 红黑树 vs B树 vs B+树

&#x1f332; 算法精讲 | 树&#xff08;番外&#xff09;&#xff1a;平衡世界的四大守护者&#xff1a;AVL vs 红黑树 vs B树 vs B树 &#x1f4c5; 2025/03/12 || &#x1f31f; 推荐阅读时间 30分钟 &#x1f680; 开篇&#xff1a;数据结构界的四大天王 想象你是一名图书…

第十八:go 并发 goroutine

channel 可以让多个goroutine 之间实现通信 Add方法调用时机&#xff1a;必须在goroutine 启动之前调用Add方法来增加计数器的值。 如果在goroutine已经启动之后再调用Add&#xff0c;可能会导致Wait方法提前返回&#xff0c;因为计数器没有正确反映正在运行的goroutine的数量…

在vs中无法用QtDesigner打开ui文件的解决方法

解决方法 右键ui文件&#xff0c;选择打开方式&#xff0c;弹出如下界面。 点击添加&#xff0c;弹出如下界面 点击程序后边的三个点&#xff0c;去电脑查找designer.exe,我的位置为D:\Qt\Qt5.9.9\5.9.9\msvc2015_64\bin\designer.exe。 名称可以自己起一个名字&#xff0c…

图像识别技术与应用-YOLO

1 YOLO-V1 YOLO-V1它是经典的one-stage方法&#xff0c;You Only Look Once&#xff0c;名字就已经说明了一切&#xff01;把检测问题转化成回归问题&#xff0c;一个CNN就搞定了&#xff01;也可以对视频进行实时检测&#xff0c;应用领域非常广&#xff01; YOLO-V1诞生与2…

LLM推理和优化(1):基本概念介绍

一、LLM推理的核心过程&#xff1a;自回归生成 LLM&#xff08;如DeepSeek、ChatGPT、LLaMA系列等&#xff09;的推理本质是自回归生成&#xff1a;从初始输入&#xff08;如[CLS]或用户prompt&#xff09;开始&#xff0c;逐token预测下一个词&#xff0c;直到生成结束符&…

Kubernetes教程(七)了解集群、标签、Pod和Deployment

了解集群、标签、Pod和Deployment 一、K8s资源对象二、K8s集群1. Master2. Node 三、Namespace&#xff08;命名空间&#xff09;四、Label&#xff08;标签&#xff09;五、Pod1. 共享网络命名空间2. 共享数据 六、工作负载1. 设置副本数2. 应用升级 结语 Kubernetes的知识真的…