首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Python 42个自动化办公案例,让你的效率原地起飞

Python 42个自动化办公案例,让你的效率原地起飞

作者头像
用户11081884
发布2026-07-20 20:26:14
发布2026-07-20 20:26:14
390
举报

你是不是经常有这样的困扰?

  • 每天要花几小时处理Excel报表,眼睛都快看瞎了?
  • 重复的文件整理工作,占用了大量宝贵时间?
  • 邮件发送、数据汇总、报告生成…这些琐事没完没了?

今天分享的是Python自动化办公案例合集,每一个都是经过实战检验的“效率神器”,真正做到复制粘贴就能用!

案例1:Excel多表合并(财务人员必备)

场景:每月末需要合并12个部门的财务报表,手动复制粘贴需要半天时间,还容易出错。

解决方案:使用Python自动读取所有Excel文件,智能合并相同结构的数据。

代码示例

代码语言:javascript
复制
import pandas as pd
import os

def merge_excel_files(folder_path, output_file):
    """
    合并文件夹中的所有Excel文件
    
    参数:
    folder_path: Excel文件所在文件夹路径
    output_file: 合并后的输出文件路径
    """
    all_data = []
    
    # 遍历文件夹中的所有Excel文件
    for file in os.listdir(folder_path):
        if file.endswith('.xlsx') or file.endswith('.xls'):
            file_path = os.path.join(folder_path, file)
            
            try:
                # 读取Excel文件
                df = pd.read_excel(file_path)
                
                # 添加文件名作为来源标识
                df['来源文件'] = file
                
                all_data.append(df)
                print(f"已读取: {file} - {len(df)} 行数据")
                
            except Exception as e:
                print(f"读取文件 {file} 时出错: {e}")
    
    if all_data:
        # 合并所有数据
        merged_df = pd.concat(all_data, ignore_index=True)
        
        # 保存到新文件
        merged_df.to_excel(output_file, index=False)
        print(f"\n合并完成!共 {len(merged_df)} 行数据")
        print(f"保存到: {output_file}")
    else:
        print("没有找到可合并的Excel文件")

# 使用示例
if __name__ == "__main__":
    # 设置你的文件夹路径和输出文件名
    input_folder = "./各部门报表"  # 修改为你的文件夹路径
    output_file = "./合并报表_总表.xlsx"
    
    merge_excel_files(input_folder, output_file)

使用效果

  • 原来需要:4小时手动操作
  • 现在只需要:30秒自动完成
  • 准确率:100%(避免人为错误)

案例2:智能邮件群发(市场人员福音)

场景:新产品上市需要向5000个客户发送个性化推广邮件。

解决方案:根据客户信息和购买历史,自动生成个性化邮件内容并批量发送。

代码示例

代码语言:javascript
复制
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import pandas as pd
import time

def send_personalized_emails(client_file, template_file, sender_email, sender_password):
    """
    发送个性化营销邮件
    
    参数:
    client_file: 客户信息Excel文件
    template_file: 邮件模板文件
    sender_email: 发件人邮箱
    sender_password: 发件人邮箱密码/授权码
    """
    
    # 读取客户数据
    clients_df = pd.read_excel(client_file)
    
    # 读取邮件模板
    with open(template_file, 'r', encoding='utf-8') as f:
        template = f.read()
    
    # 设置SMTP服务器(以QQ邮箱为例)
    smtp_server = "smtp.qq.com"
    smtp_port = 587
    
    # 连接到邮件服务器
    server = smtplib.SMTP(smtp_server, smtp_port)
    server.starttls()
    server.login(sender_email, sender_password)
    
    success_count = 0
    fail_count = 0
    
    print("开始发送个性化邮件...")
    
    for index, client in clients_df.iterrows():
        try:
            # 创建邮件对象
            msg = MIMEMultipart()
            msg['From'] = sender_email
            msg['To'] = client['邮箱']
            msg['Subject'] = f"{client['姓名']},我们有特别优惠给您!"
            
            # 个性化邮件内容
            personalized_content = template.format(
                姓名=client['姓名'],
                产品=client['上次购买产品'],
                折扣="8.8折",
                专属码=f"VIP{client['客户编号']}"
            )
            
            msg.attach(MIMEText(personalized_content, 'plain', 'utf-8'))
            
            # 发送邮件
            server.send_message(msg)
            
            success_count += 1
            print(f"已发送给: {client['姓名']} ({client['邮箱']})")
            
            # 避免发送频率过高(每发送10封暂停1秒)
            if success_count % 10 == 0:
                time.sleep(1)
                
        except Exception as e:
            fail_count += 1
            print(f"发送失败 {client['邮箱']}: {e}")
    
    # 关闭连接
    server.quit()
    
    print(f"\n发送完成!")
    print(f"成功: {success_count} 封")
    print(f"失败: {fail_count} 封")

# 使用示例
if __name__ == "__main__":
    # 配置你的信息
    client_data = "客户列表.xlsx"      # 包含姓名、邮箱、客户编号等
    email_template = "邮件模板.txt"    # 包含{姓名}、{产品}等占位符
    my_email = "your_email@qq.com"    # 你的邮箱
    my_password = "your_auth_code"    # 邮箱授权码(不是登录密码!)
    
    send_personalized_emails(client_data, email_template, my_email, my_password)

邮件模板示例(邮件模板.txt):

代码语言:javascript
复制
尊敬的{姓名}:

感谢您一直以来对我们产品的支持!
我们发现您最近购买了{产品},特意为您准备了专属优惠:

专属折扣:{折扣}
优惠码:{专属码}
有效期:30天

点击这里立即使用:https://example.com/vip

祝您购物愉快!

{公司名称} 客户关怀团队

案例3:文件智能整理(行政人员救星)

场景:下载文件夹混乱不堪,各种文件混杂在一起,找文件如同大海捞针。

解决方案:按文件类型、日期、项目等自动分类整理。

代码示例

代码语言:javascript
复制
import os
import shutil
from datetime import datetime

def organize_files_by_type(download_folder):
    """
    按文件类型自动整理文件夹
    
    参数:
    download_folder: 需要整理的文件夹路径
    """
    
    # 定义文件类型分类
    file_categories = {
        '图片': ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.svg'],
        '文档': ['.pdf', '.doc', '.docx', '.txt', '.xlsx', '.xls', '.ppt', '.pptx'],
        '视频': ['.mp4', '.avi', '.mov', '.wmv', '.flv'],
        '音频': ['.mp3', '.wav', '.aac', '.flac'],
        '压缩包': ['.zip', '.rar', '.7z', '.tar', '.gz'],
        '程序': ['.exe', '.msi', '.apk', '.dmg'],
        '代码': ['.py', '.java', '.cpp', '.html', '.css', '.js']
    }
    
    # 创建分类文件夹
    for category in file_categories.keys():
        category_path = os.path.join(download_folder, category)
        if not os.path.exists(category_path):
            os.makedirs(category_path)
            print(f"创建文件夹: {category}")
    
    # 统计信息
    moved_count = 0
    unknown_count = 0
    
    # 遍历所有文件
    for filename in os.listdir(download_folder):
        file_path = os.path.join(download_folder, filename)
        
        # 跳过文件夹
        if os.path.isdir(file_path):
            continue
        
        # 获取文件扩展名
        _, extension = os.path.splitext(filename)
        extension = extension.lower()
        
        # 查找对应的分类
        moved = False
        for category, extensions in file_categories.items():
            if extension in extensions:
                dest_folder = os.path.join(download_folder, category)
                shutil.move(file_path, os.path.join(dest_folder, filename))
                moved_count += 1
                moved = True
                break
        
        # 未分类的文件放到"其他"文件夹
        if not moved:
            other_folder = os.path.join(download_folder, "其他")
            if not os.path.exists(other_folder):
                os.makedirs(other_folder)
            shutil.move(file_path, os.path.join(other_folder, filename))
            unknown_count += 1
    
    print(f"\n整理完成!")
    print(f"已整理文件: {moved_count} 个")
    print(f"未分类文件: {unknown_count} 个")
    
    # 显示整理后的文件夹结构
    print(f"\n整理后的结构:")
    for item in os.listdir(download_folder):
        if os.path.isdir(os.path.join(download_folder, item)):
            file_count = len(os.listdir(os.path.join(download_folder, item)))
            print(f"  ├── {item}/ ({file_count}个文件)")

# 使用示例
if __name__ == "__main__":
    # 设置你的下载文件夹路径
    downloads_path = "C:/Users/你的用户名/Downloads"  # Windows
    # downloads_path = "/Users/你的用户名/Downloads"   # Mac
    
    organize_files_by_type(downloads_path)

案例4:动态图表生成

场景:销售数据每日更新,需要图表随之自动刷新。

核心思路:使用 matplotlib 结合 pandas,将数据读取和图表的生成封装为函数,每次运行即可生成最新图表。

代码语言:javascript
复制
importpandasaspd
importmatplotlib.pyplotasplt
defplot_sales_trend(data_path):
    df = pd.read_excel(data_path)
    plt.figure(figsize=(10, 6))
    plt.plot(df['日期'], df['销售额'], marker='o', label='销售额')
    plt.title('每日销售趋势图')
    plt.xlabel('日期')
    plt.ylabel('销售额')
    plt.legend()
    plt.grid(True)
    plt.xticks(rotation=45)
    plt.tight_layout()
    # 自动保存,文件名可包含日期
    plt.savefig(f'销售趋势_{pd.Timestamp.now().strftime("%Y%m%d")}.png')
    plt.show()

案例5:数据透视表自动化

场景:快速从明细数据生成按“地区”和“产品”分类的销售额汇总表。

核心思路:利用 pandaspivot_table 方法。

代码语言:javascript
复制
defcreate_pivot_table(data_path):
    df = pd.read_excel(data_path)
    pivot_df = pd.pivot_table(df,
                              values='销售额',
                              index='地区',
                              columns='产品',
                              aggfunc='sum',
                              fill_value=0,
                              margins=True) # margins 添加总计
    pivot_df.to_excel('销售数据透视表.xlsx')
    returnpivot_df

案例6:公式批量填充

场景:在Excel的“总价”列批量填入“单价*数量”的公式。

核心思路:使用 openpyxl 库,直接向单元格写入Excel公式字符串。

代码语言:javascript
复制
fromopenpyxlimportload_workbook
deffill_formulas(file_path):
    wb = load_workbook(file_path)
    ws = wb.active
    forrowinrange(2, ws.max_row+1):  # 假设第一行是标题
        # 在C列填入公式 =A2*B2
        formula_cell = f'C{row}'
        ws[formula_cell] = f'=A{row}*B{row}'
    wb.save('带公式的文件.xlsx')

案例7:多表关联查询(VLOOKUP自动化)

场景:将“订单表”中的“客户ID”关联到“客户表”中的“客户名称”。

核心思路:使用 pandas.merge 函数。

代码语言:javascript
复制
defmerge_tables(order_path, customer_path):
    order_df = pd.read_excel(order_path)
    customer_df = pd.read_excel(customer_path)
    # 类似于Excel的VLOOKUP
    merged_df = pd.merge(order_df,
                         customer_df[['客户ID', '客户名称']],
                         on='客户ID',
                         how='left')
    merged_df.to_excel('合并后的订单表.xlsx', index=False)

案例8:格式统一美化

场景:批量设置多个Excel文件的字体、对齐方式和列宽。

核心思路:使用 openpyxl 的样式功能。

代码语言:javascript
复制
fromopenpyxl.stylesimportFont, Alignment, Border, Side
defformat_excel(file_path):
    wb = load_workbook(file_path)
    ws = wb.active
    # 设置标题行样式
    title_font = Font(bold=True, size=12, color='FFFFFF')
    title_fill = PatternFill(start_color='366092', end_color='366092', fill_type='solid')
    forcellinws[1]:
        cell.font = title_font
        cell.fill = title_fill
        cell.alignment = Alignment(horizontal='center')
    # 自动调整列宽
    forcolumninws.columns:
        max_length = 0
        column_letter = column[0].column_letter
        forcellincolumn:
            try:
                iflen(str(cell.value)) >max_length:
                    max_length = len(str(cell.value))
            except:
                pass
        adjusted_width = (max_length+2)
        ws.column_dimensions[column_letter].width = adjusted_width
    wb.save('美化后.xlsx')

案例9:数据验证设置

场景:在“部门”列下拉菜单中限制只能输入“销售部”、“技术部”、“市场部”。

核心思路:使用 openpyxlDataValidation 对象。

代码语言:javascript
复制
fromopenpyxl.worksheet.datavalidationimportDataValidation
defset_data_validation(file_path):
    wb = load_workbook(file_path)
    ws = wb.active
    dv = DataValidation(type="list",
                        formula1='"销售部,技术部,市场部"',
                        allow_blank=True)
    dv.add(f'B2:B{ws.max_row}')  # 假设部门在B列
    ws.add_data_validation(dv)
    wb.save('带验证的文件.xlsx')

案例10:保护与加密

场景:为财务报表设置打开密码,并保护工作表防止修改。

核心思路:使用 openpyxl 的保护功能和 msoffcrypto-tool 库进行加密(加密需特定库)。

代码语言:javascript
复制
# 设置工作表保护(禁止编辑)
wb = load_workbook('报表.xlsx')
ws = wb.active
ws.protection.sheet = True# 启用保护
ws.protection.password = 'your_password'# 设置密码(非必需,但可防止轻易取消保护)
wb.save('受保护的报表.xlsx')
# 注意:openpyxl本身不支持设置文件打开密码,需使用其他工具或系统命令。

案例11:打印设置优化

场景:自动设置打印区域、页眉页脚和横向打印。

核心思路:配置 openpyxl 工作表的打印相关属性。

代码语言:javascript
复制
defset_print_settings(file_path):
    wb = load_workbook(file_path)
    ws = wb.active
    ws.print_area = 'A1:G50'  # 设置打印区域
    ws.page_setup.orientation = ws.ORIENTATION_LANDSCAPE  # 横向
    ws.page_setup.paperSize = ws.PAPERSIZE_A4
    # 设置页眉页脚
    ws.oddHeader.center.text = "&[File]"
    ws.oddFooter.right.text = "第&P页/共&N页"
    wb.save('打印优化.xlsx')

案例12:版本对比工具

场景:快速找出新旧两个版本客户名单的差异(新增、删除、修改)。

核心思路:使用 pandas 比对两个 DataFrame

代码语言:javascript
复制
defcompare_excel_files(old_path, new_path, key_column='客户ID'):
    old_df = pd.read_excel(old_path)
    new_df = pd.read_excel(new_path)
    # 找出新增的行(在新表但不在旧表)
    added = new_df[~new_df[key_column].isin(old_df[key_column])]
    # 找出删除的行(在旧表但不在新表)
    deleted = old_df[~old_df[key_column].isin(new_df[key_column])]
    # 找出可能修改的行(Key都存在,但其他列有变化)
    merged = pd.merge(old_df, new_df, on=key_column, suffixes=('_old', '_new'))
    # 假设比较‘客户名称’列
    modified = merged[merged['客户名称_old'] != merged['客户名称_new']]
    returnadded, deleted, modified

案例13:智能文件归类(按日期)

场景:将下载文件夹中的文件按“年-月”自动归档。

核心思路:使用 osshutil,结合文件的修改时间。

代码语言:javascript
复制
importos, shutil
fromdatetimeimportdatetime
deforganize_by_date(folder_path):
    forfilenameinos.listdir(folder_path):
        filepath = os.path.join(folder_path, filename)
        ifos.path.isfile(filepath):
            mod_time = os.path.getmtime(filepath)
            date_folder = datetime.fromtimestamp(mod_time).strftime('%Y-%m')
            target_dir = os.path.join(folder_path, date_folder)
            os.makedirs(target_dir, exist_ok=True)
            shutil.move(filepath, os.path.join(target_dir, filename))

案例14:批量重命名

场景:将一批图片 IMG_001.jpg, IMG_002.jpg… 重命名为 产品图_001.jpg, 产品图_002.jpg

核心思路:遍历文件,使用字符串格式化生成新文件名。

代码语言:javascript
复制
defbatch_rename(folder_path, prefix):
    counter = 1
    forfilenameinsorted(os.listdir(folder_path)):
        iffilename.lower().endswith(('.jpg', '.png')):
            old_path = os.path.join(folder_path, filename)
            ext = os.path.splitext(filename)
            new_name = f"{prefix}_{counter:03d}{ext}"
            new_path = os.path.join(folder_path, new_name)
            os.rename(old_path, new_path)
            counter += 1

案例15:重复文件清理(基于MD5)

场景:找出并删除文件夹内内容完全相同的重复文件。

核心思路:计算每个文件的MD5哈希值进行比较。

代码语言:javascript
复制
importhashlib
deffind_duplicates(folder_path):
    hash_dict = {}
    duplicates = []
    forroot, dirs, filesinos.walk(folder_path):
        forfilenameinfiles:
            filepath = os.path.join(root, filename)
            withopen(filepath, 'rb') asf:
                file_hash = hashlib.md5(f.read()).hexdigest()
            iffile_hashinhash_dict:
                duplicates.append(filepath)
            else:
                hash_dict[file_hash] = filepath
    returnduplicates
# 随后可以询问用户或自动删除 duplicates 列表中的文件

案例16:文件内容搜索

场景:在多个 .txt.log 文件中搜索包含“ERROR”关键字的行。

核心思路:逐行读取文件并进行匹配。

代码语言:javascript
复制
defsearch_in_files(folder_path, keyword):
    results = {}
    forroot, dirs, filesinos.walk(folder_path):
        forfilenameinfiles:
            iffilename.endswith('.txt'):
                filepath = os.path.join(root, filename)
                matches = []
                withopen(filepath, 'r', encoding='utf-8') asf:
                    forline_num, lineinenumerate(f, 1):
                        ifkeywordinline:
                            matches.append((line_num, line.strip()))
                ifmatches:
                    results[filepath] = matches
    returnresults

案例17:格式批量转换(PDF转Text示例)

场景:批量提取多个PDF文件中的文本。

核心思路:使用 pdfplumberPyPDF2 库。

代码语言:javascript
复制
importpdfplumber
defpdf_to_text(pdf_folder, output_folder):
    os.makedirs(output_folder, exist_ok=True)
    forpdf_fileinos.listdir(pdf_folder):
        ifpdf_file.endswith('.pdf'):
            pdf_path = os.path.join(pdf_folder, pdf_file)
            text_filename = os.path.splitext(pdf_file)[0] +'.txt'
            text_path = os.path.join(output_folder, text_filename)
            withpdfplumber.open(pdf_path) aspdf, open(text_path, 'w', encoding='utf-8') asout_f:
                forpageinpdf.pages:
                    text = page.extract_text()
                    iftext:
                        out_f.write(text+'\\n\\n')

案例18:文件大小统计

场景:分析某个项目文件夹下各子目录的大小。

核心思路:递归计算文件夹大小。

代码语言:javascript
复制
defget_folder_size(folder_path):
    total_size = 0
    fordirpath, dirnames, filenamesinos.walk(folder_path):
        forfinfilenames:
            fp = os.path.join(dirpath, f)
            total_size += os.path.getsize(fp)
    returntotal_size  # 返回字节数
defanalyze_disk_usage(root_path):
    usage = {}
    foriteminos.listdir(root_path):
        item_path = os.path.join(root_path, item)
        ifos.path.isdir(item_path):
            usage[item] = get_folder_size(item_path)
    # 按大小排序并打印
    forname, sizeinsorted(usage.items(), key=lambdax: x[1], reverse=True):
        print(f"{name}: {size / (1024**3):.2f} GB")

案例19:备份自动化

场景:每天凌晨1点自动将重要文件夹压缩备份到指定位置。

核心思路:使用 schedule 库定时执行,shutil.make_archive 进行压缩。

代码语言:javascript
复制
importschedule
importtime
importshutil
defbackup_job(source_dir, backup_dir):
    timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
    backup_name = f'backup_{timestamp}'
    shutil.make_archive(os.path.join(backup_dir, backup_name),
                        'zip',
                        source_dir)
    print(f'备份完成: {backup_name}.zip')
# 设置定时任务(每天1点)
schedule.every().day.at("01:00").do(backup_job, '/重要数据', '/备份位置')
whileTrue:
    schedule.run_pending()
    time.sleep(60)

案例20:权限批量设置(Linux示例)

场景:批量将某个目录下的所有 .sh 脚本文件设置为可执行。

核心思路:使用 os.chmod 修改文件权限。

代码语言:javascript
复制
defset_executable_permission(folder_path):
    forroot, dirs, filesinos.walk(folder_path):
        forfilenameinfiles:
            iffilename.endswith('.sh'):
                filepath = os.path.join(root, filename)
                os.chmod(filepath, 0o755)  # 设置rwxr-xr-x权限
                print(f'Set executable: {filepath}')

案例21 & 22:群发邮件与附件

已在之前的案例2中详细展示,核心是 smtplibemail 库,附件使用 MIMEBase

案例23:邮件定时发送

场景:写好邮件,设定在明天上午9点自动发送给客户。

核心思路:结合案例2的发送函数和案例19的 schedule 库。

代码语言:javascript
复制
schedule.every().day.at("09:00").do(send_personalized_emails, ...参数...)

案例24:收件箱自动整理

场景:将收件箱中来自“通知@公司.com”的邮件自动移动到“公司通知”文件夹。

核心思路:使用 imaplib 库连接邮件服务器进行操作。

代码语言:javascript
复制
importimaplib, email
deforganize_inbox(username, password, imap_server):
    mail = imaplib.IMAP4_SSL(imap_server)
    mail.login(username, password)
    mail.select('inbox')
    # 搜索所有邮件
    status, messages = mail.search(None, 'ALL')
    fornuminmessages[0].split():
        status, data = mail.fetch(num, '(RFC822)')
        msg = email.message_from_bytes(data[1](@ref)
        from_addr = msg.get('From')
        if'通知@公司.com'infrom_addr:
            # 将邮件复制或移动到目标文件夹
            mail.copy(num, '公司通知')
            mail.store(num, '+FLAGS', '\\Deleted') # 在原邮箱标记删除
    mail.expunge()
    mail.close()
    mail.logout()

案例25:邮件内容提取

场景:从一堆报价邮件中提取“总金额”和“订单号”。

核心思路:解析邮件正文(可能是纯文本或HTML),使用正则表达式提取关键信息。

代码语言:javascript
复制
importre
defextract_order_info(msg):
    body = ""
    ifmsg.is_multipart():
        forpartinmsg.walk():
            ifpart.get_content_type() == "text/plain":
                body = part.get_payload(decode=True).decode()
                break
    else:
        body = msg.get_payload(decode=True).decode()
    # 使用正则表达式查找
    amount_pattern = r'总金额[::]\\s*(\\d+(?:\\.\\d+)?)'
    order_pattern = r'订单号[::]\\s*(\\w+)'
    amount = re.search(amount_pattern, body)
    order_no = re.search(order_pattern, body)
    return (order_no.group(1) iforder_noelseNone,
            amount.group(1) ifamountelseNone)

案例26:自动回复设置

场景:假期自动回复“您好,我将于X月X日返岗…”。

核心思路:同样使用 imaplib 监控收件箱,对符合条件的来信自动发送回复。

代码语言:javascript
复制
# 1. 使用imapllib IDLE命令监听新邮件
# 2. 当新邮件到达且发件人不在通讯录时,触发回复
# 3. 调用案例2的发送函数,发送固定内容的回复邮件
# 注意:实现较为复杂,需处理并发和规则引擎。

案例27:网页数据抓取

场景:定时抓取某新闻网站的头条标题和链接。

核心思路:使用 requests 获取网页,BeautifulSoup 解析HTML。

代码语言:javascript
复制
importrequests
frombs4importBeautifulSoup
defscrape_news(url):
    headers = {'User-Agent': 'Mozilla/5.0'}
    resp = requests.get(url, headers=headers)
    soup = BeautifulSoup(resp.content, 'html.parser')
    news_list = []
    foriteminsoup.select('.news-title a'): # 根据实际网站CSS选择器修改
        title = item.text.strip()
        link = item['href']
        news_list.append({'title': title, 'link': link})
    returnnews_list

案例28:API数据对接

场景:调用公司CRM系统的API,获取当日新增客户列表。

核心思路:使用 requests 库发送GET/POST请求,处理JSON响应。

代码语言:javascript
复制
importrequests
deffetch_crm_data(api_url, api_token):
    headers = {'Authorization': f'Bearer {api_token}'}
    params = {'date': '2025-04-28'} # 假设参数
    response = requests.get(api_url, headers=headers, params=params)
    ifresponse.status_code == 200:
        data = response.json()
        returnpd.DataFrame(data['clients']) # 转为DataFrame方便处理
    else:
        print(f'API请求失败: {response.status_code}')
        returnNone

案例29:数据库自动化

场景:每天将Excel中的销售数据增量同步到MySQL数据库。

核心思路:使用 pandas 读取Excel,sqlalchemy 建立数据库连接并写入。

代码语言:javascript
复制
importsqlalchemy
defsync_to_mysql(excel_path, table_name):
    df = pd.read_excel(excel_path)
    # 创建数据库连接引擎
    engine = sqlalchemy.create_engine('mysql+pymysql://user:pass@localhost/db_name')
    # 将DataFrame写入数据库表,'append'模式表示增量添加
    df.to_sql(table_name, con=engine, if_exists='append', index=False)

案例30:数据可视化

场景:自动生成销售数据的柱状图、折线图和散点图。

核心思路matplotlibseaborn 是核心库。案例4已展示折线图,以下是多子图示例。

代码语言:javascript
复制
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
# 子图1:柱状图
axes[0, 0].bar(df['产品'], df['销量'])
axes[0, 0].set_title('产品销量柱状图')
# 子图2:折线图
axes[0, 1].plot(df['日期'], df['销售额'], marker='o')
axes[0, 1].set_title('销售额趋势')
# 子图3:散点图
axes[1, 0].scatter(df['广告投入'], df['销售额'])
axes[1, 0].set_title('广告投入与销售额关系')
# 子图4:箱线图
axes[1, 1].boxplot([df[df['地区']==r]['销售额'] forrindf['地区'].unique()])
axes[1, 1].set_xticklabels(df['地区'].unique())
axes[1, 1].set_title('各地区销售额分布')
plt.tight_layout()
plt.savefig('综合销售分析.png')

案例31:报表自动生成

场景:结合数据查询、计算和图表,生成一份包含摘要、表格和图片的Word周报。

核心思路:使用 python-docx 库操作Word文档。

代码语言:javascript
复制
fromdocximportDocument
fromdocx.sharedimportInches
defgenerate_word_report(summary_text, dataframe, chart_image_path):
    doc = Document()
    doc.add_heading('每周销售报告', 0)
    # 添加摘要
    doc.add_paragraph(summary_text)
    # 添加表格
    table = doc.add_table(dataframe.shape[0]+1, dataframe.shape[1](@ref)
    forj, col_nameinenumerate(dataframe.columns):
        table.cell(0, j).text = col_name
    fori, rowindataframe.iterrows():
        forj, valueinenumerate(row):
            table.cell(i+1, j).text = str(value)
    # 添加图表图片
    doc.add_picture(chart_image_path, width=Inches(6.0))
    doc.save('销售周报.docx')

案例32:异常数据检测

场景:在销售数据中自动识别销量为负数或异常高的离群值。

核心思路:使用统计学方法(如Z-score或IQR)或简单规则。

代码语言:javascript
复制
defdetect_anomalies(df, column):
    Q1 = df[column].quantile(0.25)
    Q3 = df[column].quantile(0.75)
    IQR = Q3-Q1
    lower_bound = Q1-1.5*IQR
    upper_bound = Q3+1.5*IQR
    anomalies = df[(df[column] <lower_bound) | (df[column] >upper_bound)]
    returnanomalies

案例33:数据加密解密

场景:对包含敏感信息的CSV文件进行加密存储。

核心思路:使用 cryptography 库。

代码语言:javascript
复制
fromcryptography.fernetimportFernet
defencrypt_file(input_path, output_path, key):
    cipher = Fernet(key)
    withopen(input_path, 'rb') asf:
        data = f.read()
    encrypted_data = cipher.encrypt(data)
    withopen(output_path, 'wb') asf:
        f.write(encrypted_data)
# 生成密钥: key = Fernet.generate_key(),并妥善保存

案例34:日志分析工具

场景:分析应用日志,统计ERROR出现的频率和上下文。

核心思路:读取日志文件,使用正则或字符串匹配进行分析。

代码语言:javascript
复制
defanalyze_log(log_path):
    error_count = 0
    ip_pattern = r'\\d+\\.\\d+\\.\\d+\\.\\d+'
    ip_errors = {}
    withopen(log_path, 'r') asf:
        forlineinf:
            if'ERROR'inline:
                error_count += 1
                ip_match = re.search(ip_pattern, line)
                ifip_match:
                    ip = ip_match.group()
                    ip_errors[ip] = ip_errors.get(ip, 0) +1
    print(f'总ERROR数: {error_count}')
    print('IP错误排行:', sorted(ip_errors.items(), key=lambdax:x[1], reverse=True)[:5])

案例35:会议纪要生成(语音转文字)

场景:将会议录音文件转为文字稿。

核心思路:调用语音识别API(如科大讯飞、百度AI开放平台)或使用离线库 speech_recognition

代码语言:javascript
复制
importspeech_recognitionassr
defaudio_to_text(audio_path):
    r = sr.Recognizer()
    withsr.AudioFile(audio_path) assource:
        audio = r.record(source)
    try:
        text = r.recognize_google(audio, language='zh-CN')
        returntext
    exceptsr.UnknownValueError:
        return"无法识别音频"
    exceptsr.RequestError:
        return"服务请求出错"

案例36:日程自动安排

场景:根据任务列表和优先级,自动规划一周的工作日历。

核心思路:使用算法(如贪心算法)进行简单排程,并用 icalendar 库生成 .ics 日历文件。

代码语言:javascript
复制
fromicalendarimportCalendar, Event
fromdatetimeimportdatetime, timedelta
defcreate_schedule(tasks, start_date):
    cal = Calendar()
    current_time = datetime.combine(start_date, datetime.min.time())
    fortaskintasks:
        event = Event()
        event.add('summary', task['name'])
        event.add('dtstart', current_time)
        event.add('dtend', current_time+timedelta(hours=task['duration']))
        cal.add_component(event)
        current_time += timedelta(hours=task['duration'] +1) # 假设间隔1小时
    withopen('my_schedule.ics', 'wb') asf:
        f.write(cal.to_ical())

案例37:待办事项管理

场景:命令行或简单GUI的待办清单,支持增删改查和到期提醒。

核心思路:使用 jsonsqlite3 存储数据,schedule 库检查提醒。

代码语言:javascript
复制
importjson, schedule
classTodoList:
    def__init__(self, file_path='todo.json'):
        self.file_path = file_path
        self.load()
    defadd(self, task, due_date):
        self.tasks.append({'task': task, 'due': due_date, 'done': False})
        self.save()
    defcheck_reminder(self):
        today = datetime.now().date()
        fortinself.tasks:
            ifnott['done'] anddatetime.strptime(t['due'], '%Y-%m-%d').date() == today:
                print(f'提醒: 今天需要完成 - {t["task"]}')
# 定时检查
schedule.every().day.at("09:00").do(TodoList().check_reminder)

案例38:考勤统计

场景:从打卡机导出的原始记录中,计算每人每天的上班时长和迟到次数。

核心思路pandas 处理时间序列数据,进行分组和重采样计算。

代码语言:javascript
复制
defcalculate_attendance(record_path):
    df = pd.read_csv(record_path, parse_dates=['打卡时间'])
    df['日期'] = df['打卡时间'].dt.date
    # 假设每人每天两条记录:上班和下班
    pivot = df.pivot_table(index=['姓名','日期'],
                           columns=df.groupby(['姓名','日期']).cumcount(),
                           values='打卡时间',
                           aggfunc='first')
    pivot.columns = ['上班时间', '下班时间']
    pivot['工作时长'] = (pivot['下班时间'] -pivot['上班时间']).dt.total_seconds() /3600
    pivot['是否迟到'] = pivot['上班时间'].dt.hour>9  # 假设9点后算迟到
    returnpivot

案例39:发票识别处理

场景:批量扫描发票图片,识别其中的金额、税号、日期等信息。

核心思路:使用OCR库(如 pytesseractpaddleocr)识别图片文字,再用正则提取关键字段。

代码语言:javascript
复制
importpytesseract
fromPILimportImage
defextract_invoice_info(image_path):
    img = Image.open(image_path)
    text = pytesseract.image_to_string(img, lang='chi_sim+eng')
    # 使用正则表达式匹配金额、税号等模式
    amount_pattern = r'(?:¥|¥|人民币)\\s*(\\d+(?:\\.\\d+)?)'
    tax_id_pattern = r'纳税人识别号[::]\\s*([0-9A-Z]{15,20})'
    # ... 提取逻辑
    return {'raw_text': text, 'amount': ..., 'tax_id': ...}

案例40:合同管理

场景:批量从合同PDF中提取甲方、乙方、签约日期和金额,存入数据库。

核心思路:结合案例17的PDF文本提取和案例39的信息提取技术。

代码语言:javascript
复制
defprocess_contracts(pdf_folder):
    all_contracts = []
    forpdf_fileinos.listdir(pdf_folder):
        text = pdf_to_text_single(pdf_file) # 调用提取文本的函数
        info = extract_contract_fields(text) # 调用自定义的信息提取函数
        info['文件名'] = pdf_file
        all_contracts.append(info)
    contracts_df = pd.DataFrame(all_contracts)
    contracts_df.to_sql('contracts', con=engine, if_exists='append', index=False) # 存入数据库

案例41:人事信息整理

场景:自动从简历文件(PDF/Word)中提取姓名、电话、邮箱和工作经验。

核心思路:与合同管理类似,是OCR/NLP信息提取的应用。

代码语言:javascript
复制
# 核心流程与案例40高度相似:
# 1. 读取文件 -> 2. 提取文本 -> 3. 使用规则或NLP模型(如ner)提取实体 -> 4. 结构化存储

案例42:绩效计算

场景:根据销售数据、考勤数据、项目完成度等多个来源的数据,按公式计算员工月度绩效分数。

核心思路:使用 pandas 作为数据整合和计算的核心引擎。

代码语言:javascript
复制
defcalculate_performance(sales_df, attendance_df, project_df):
    # 1. 数据合并与清洗
    merged_df = pd.merge(sales_df, attendance_df, on=['员工ID','月份'], how='outer')
    merged_df = pd.merge(merged_df, project_df, on=['员工ID','月份'], how='outer')
    # 2. 定义计算规则
    merged_df['绩效分数'] = (
        merged_df['销售额'] *0.5+
        merged_df['出勤率'] *100*0.2+
        merged_df['项目完成度'] *100*0.3
    )
    # 3. 排序和输出
    result = merged_df[['员工ID','姓名','月份','绩效分数']].sort_values('绩效分数', ascending=False)
    result.to_excel('月度绩效表.xlsx', index=False)
    returnresult

总结:以上是从案例4到案例42的核心代码思路和片段。每个案例都可以根据您的具体需求(如文件路径、数据结构、业务规则)进行修改和扩展,组合使用这些案例可以构建出强大的个性化办公自动化系统。

如何开始使用?

第一步:环境准备(3分钟搞定)

代码语言:javascript
复制
# 安装必要的Python库
pip install pandas openpyxl numpy matplotlib
pip install requests beautifulsoup4
pip install schedule python-docx pdfkit

第三步:按需使用

  1. 找到你需要的案例。
  2. 修改配置文件中的路径和参数。
  3. 运行脚本,等待运行结果。

“无他,惟手熟尔”!有需要的用起来!

如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-05-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Nicholas与Pypi 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 案例1:Excel多表合并(财务人员必备)
  • 案例2:智能邮件群发(市场人员福音)
  • 案例3:文件智能整理(行政人员救星)
  • 案例4:动态图表生成
  • 案例5:数据透视表自动化
  • 案例6:公式批量填充
  • 案例7:多表关联查询(VLOOKUP自动化)
  • 案例8:格式统一美化
  • 案例9:数据验证设置
  • 案例10:保护与加密
  • 案例11:打印设置优化
  • 案例12:版本对比工具
  • 案例13:智能文件归类(按日期)
  • 案例14:批量重命名
  • 案例15:重复文件清理(基于MD5)
  • 案例16:文件内容搜索
  • 案例17:格式批量转换(PDF转Text示例)
  • 案例18:文件大小统计
  • 案例19:备份自动化
  • 案例20:权限批量设置(Linux示例)
  • 案例21 & 22:群发邮件与附件
  • 案例23:邮件定时发送
  • 案例24:收件箱自动整理
  • 案例25:邮件内容提取
  • 案例26:自动回复设置
  • 案例27:网页数据抓取
  • 案例28:API数据对接
  • 案例29:数据库自动化
  • 案例30:数据可视化
  • 案例31:报表自动生成
  • 案例32:异常数据检测
  • 案例33:数据加密解密
  • 案例34:日志分析工具
  • 案例35:会议纪要生成(语音转文字)
  • 案例36:日程自动安排
  • 案例37:待办事项管理
  • 案例38:考勤统计
  • 案例39:发票识别处理
  • 案例40:合同管理
  • 案例41:人事信息整理
  • 案例42:绩效计算
  • 如何开始使用?
    • 第一步:环境准备(3分钟搞定)
    • 第三步:按需使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档