以下是 “Python自动化办公之Excel拆分与自动发邮件” 的完整实例教程,步骤分为以下两个部分:
部分一: Excel拆分
1. 环境准备
在编写Python程序之前,需要先安装一些Python库:
- pandas:用于读写Excel文件
- os:用于文件操作
- datetime:用于生成日期
因此,请在终端命令行或Anaconda Prompt中运行以下命令安装所需的库:
pip install pandas
pip install openpyxl
2. 程序设计
程序的基本思路是读取一个Excel文件,按照指定的条件拆分成多个Excel文件,并保存到指定目录下。下面是程序的详细设计步骤:
- 导入所需的库
import pandas as pd
import os
import datetime
- 读取原始Excel文件
df = pd.read_excel('input.xlsx')
这里的 input.xlsx
是原始的Excel文件,程序需要将这个文件按照指定的条件进行拆分。
- 设计拆分逻辑
本案例以日期作为拆分依据。即根据该日期,将原始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文件,逐一读取数据并发送邮件。下面是程序的详细设计步骤:
- 导入所需的库
import os
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
- 准备SMTP服务器配置信息
smtp_server = 'smtp.xxx.com'
smtp_port = 465
smtp_username = 'your_username'
smtp_password = 'your_password'
smtp_from = 'your_email_address'
这里需要替换为您自己的SMTP服务器配置信息。
- 定义一个发送邮件的函数
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())
。
- 遍历目录,并发送邮件
# 需要发送邮件的邮件列表,格式为(收件人,邮件标题,附件列表)
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文件,并逐一发送邮件。每个邮件包含指定的附件列表。