Python自动化办公之Excel拆分与自动发邮件

  • Post category:Python

以下是 “Python自动化办公之Excel拆分与自动发邮件” 的完整实例教程,步骤分为以下两个部分:

部分一: Excel拆分

1. 环境准备

在编写Python程序之前,需要先安装一些Python库:

  • pandas:用于读写Excel文件
  • os:用于文件操作
  • datetime:用于生成日期

因此,请在终端命令行或Anaconda Prompt中运行以下命令安装所需的库:

pip install pandas
pip install openpyxl

2. 程序设计

程序的基本思路是读取一个Excel文件,按照指定的条件拆分成多个Excel文件,并保存到指定目录下。下面是程序的详细设计步骤:

  1. 导入所需的库
import pandas as pd
import os
import datetime
  1. 读取原始Excel文件
df = pd.read_excel('input.xlsx')

这里的 input.xlsx 是原始的Excel文件,程序需要将这个文件按照指定的条件进行拆分。

  1. 设计拆分逻辑

本案例以日期作为拆分依据。即根据该日期,将原始Excel文件中的数据拆分到不同的Excel文件中。

# 获取所有日期
dates = df['日期'].unique()

# 遍历所有日期,构建新的Excel文件
for date in dates:
    # 创建一个空的Excel文件,用于存储拆分的数据
    writer = pd.ExcelWriter('output/{}.xlsx'.format(date.date()))
    # 根据日期获取数据
    data = df[df['日期'] == date]
    # 将数据写入Excel文件
    data.to_excel(writer, index=False)
    # 关闭Excel文件
    writer.save()

上述代码中,通过 dates = df['日期'].unique() 获取到所有的日期,并使用 for 循环遍历这些日期。对于每个日期,创建一个新的Excel文件 writer = pd.ExcelWriter('output/{}.xlsx'.format(date.date())),然后根据该日期获取数据 data = df[df['日期'] == date] 并将其写入Excel文件 data.to_excel(writer, index=False)。最后关闭文件 writer.save()

其中,output 是保存拆分后的Excel文件的目录,也可以改为其他的目录。

3. 程序运行

将上述代码保存为一个 .py 文件,然后在终端命令行或Anaconda Prompt中切换至该文件所在的目录,执行以下命令运行程序:

python excel_split.py

程序会读取原始Excel文件 input.xlsx,并根据拆分条件将其拆分成多个Excel文件保存到 output 目录中。

部分二: 自动发邮件

1. 环境准备

在编写Python程序之前,需要先安装一些Python库:

  • smtplib:用于实现发邮件功能
  • email:用于构建邮件
  • os:用于文件操作

因此,请在终端命令行或Anaconda Prompt中运行以下命令安装所需的库:

pip install smtplib
pip install email

2. 程序设计

程序的基本思路是遍历指定目录下的所有Excel文件,逐一读取数据并发送邮件。下面是程序的详细设计步骤:

  1. 导入所需的库
import os
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
  1. 准备SMTP服务器配置信息
smtp_server = 'smtp.xxx.com'
smtp_port = 465
smtp_username = 'your_username'
smtp_password = 'your_password'
smtp_from = 'your_email_address'

这里需要替换为您自己的SMTP服务器配置信息。

  1. 定义一个发送邮件的函数
def send_email(to, subject, attachments):
    # 创建邮件对象
    msg = MIMEMultipart()
    # 邮件标题
    msg['Subject'] = subject
    # 发件人
    msg['From'] = smtp_from
    # 收件人
    msg['To'] = to
    # 构建正文
    text = MIMEText('请查收')
    msg.attach(text)
    # 构建附件
    for attachment in attachments:
        part = MIMEApplication(open(attachment, 'rb').read())
        part.add_header('Content-Disposition', 'attachment', filename=os.path.basename(attachment))
        msg.attach(part)
    # 发送邮件
    smtp = smtplib.SMTP_SSL(smtp_server, smtp_port)
    smtp.login(smtp_username, smtp_password)
    smtp.sendmail(smtp_from, to, msg.as_string())
    smtp.quit()

上述代码中,send_email 函数用于发送邮件。邮件标题 subject、收件人邮箱 to、和附件列表 attachments 都需要传入该函数。

首先,创建邮件对象 msg = MIMEMultipart() 并设置标题和发件人、收件人信息。然后构建正文 text = MIMEText('请查收') 和附件列表:

for attachment in attachments:
    part = MIMEApplication(open(attachment, 'rb').read())
    part.add_header('Content-Disposition', 'attachment', filename=os.path.basename(attachment))
    msg.attach(part)

其中,attachments 是一个包含多个Excel文件路径的列表,循环遍历这个列表,将每个Excel文件作为附件添加到邮件中。

最后,使用SMTP协议发送邮件 smtp.sendmail(smtp_from, to, msg.as_string())

  1. 遍历目录,并发送邮件
# 需要发送邮件的邮件列表,格式为(收件人,邮件标题,附件列表)
emails = [
    ('user1@xxx.com', 'Excel文件1', ['output/2021-08-01.xlsx']),
    ('user2@xxx.com', 'Excel文件2', ['output/2021-08-02.xlsx', 'output/2021-08-03.xlsx']),
    ('user3@xxx.com', 'Excel文件3', ['output/2021-08-04.xlsx', 'output/2021-08-05.xlsx', 'output/2021-08-06.xlsx']),
]

# 遍历邮件列表,逐一发送邮件
for email in emails:
    to, subject, attachments = email
    send_email(to, subject, attachments)

上述代码中,emails 是一个包含多个邮件信息的列表,每个邮件信息包括收件人邮箱 to、邮件标题 subject、和附件列表 attachments

然后,使用 for 循环遍历 emails 列表,逐一发送邮件。对于每个邮件,调用 send_email 函数发送邮件。

当然,在实际应用中,可以通过其他方式获取邮件列表,这里只是提供一种简单的示例。

3. 程序运行

将上述代码保存为一个 .py 文件,然后在终端命令行或Anaconda Prompt中切换至该文件所在的目录,执行以下命令运行程序:

python send_email.py

程序会遍历 output 目录下的所有Excel文件,并逐一发送邮件。每个邮件包含指定的附件列表。