Python自动化办公实战:Word、Excel、PDF与邮件批量处理详解

阿麦
阿麦
发布时间:2026-10-15 | 3人浏览过
原创

本文详解如何利用Python实现自动化办公流程,通过docx库替换Word模板中的姓名变量,使用docx2pdf将文档转换为PDF格式,借助openpyxl读取Excel中的客户姓名与邮箱,最后通过smtplib库实现带HTML正文及PDF附件的批量邮件发送。该方案可高效处理成百上千份邀请函的生成与分发任务,大幅降低人工操作成本。

背景

设想这样一个工作场景:你手中持有一份Word格式的邀请函模板,同时有一份包含客户姓名、联系方式及邮箱地址的客户列表Excel表格。此时,上级要求你完成一系列操作:将模板中的姓名占位符替换为具体客户姓名,将生成的Word文档转换为PDF格式,编辑统一的邮件正文话术,并将带有邀请函附件的邮件逐一发送给对应客户。面对这一系列繁琐步骤,如何高效完成?

若采用传统人工方式,需手动从Excel中复制客户姓名,逐一替换到Word文档中,再将每个Word文档另存为PDF,接着复制邮箱地址,编写邮件正文并添加附件,最后点击发送。即便在状态极佳的情况下,处理单个客户耗时约1分钟。若客户数量仅为几十人,耗时约一小时尚可接受;但若面对数百、上千乃至上万名客户,这种重复性劳动将导致巨大的时间消耗与人力浪费。

无需担忧,借助Python自动化办公工具,可构建一套完整的自动化流程:实现Word文档内容替换、Excel数据读取、PDF文件生成以及Email邮件自动发送。以下将详细解析具体实现步骤。

实现过程

1)替换Word模板生成对应邀请函

以前述Word模板为例,编写一个Python函数,根据传入的客户姓名替换模板中的<name>占位符,从而一次性生成个性化的邀请函文档。


def get_invitation(name):  
    doc = docx.Document("template.docx")  
    for para in doc.paragraphs:  
        if '<name>' in para.text:  
            for run in para.runs:  
                if '<name>' in run.text:  
                    runrun.text = run.text.replace('<name>', name)  
        doc.save(f'./邀请函/{name}.docx') 

理解上述代码需掌握Word文档的基本结构:文档由多个段落(paragraphs)组成,可通过doc.paragraphs获取;段落内的文本通过para.text获取;一个段落可能包含多个具有不同样式的文本片段,称为run,通过para.runs获取;具体的文本内容则通过run.text获取。明确这些结构后,再审视上述代码,逻辑便清晰可见。

2)将Word邀请函转化为Pdf格式

此步骤相对简单,利用Python自动化办公库,仅需一行代码即可完成转换,且执行速度极快。


from docx2pdf import convert  
convert(f"./邀请函/{name}.docx") 

使用convert()函数可将docx格式的文件直接转换为同名的PDF文档。

3)读取Excel表格中的姓名和邮箱

此环节需引入openpyxl库。尽管处理Excel的Python库众多,此处以openpyxl为例进行演示,具体代码如下:


def get_username_email():  
    workbook = openpyxl.load_workbook("names.xlsx")  
    worksheet = workbook.active  
    for index, row in enumerate(worksheet.rows):  
        if index > 0:  
            name = row[0].value  # 获取表格第一列的姓名  
            email = row[3].value  # 获取表格第四列的邮箱  
            # print(name, email) 
            # print(f"{name}邀请函正在生成...")  
            # get_invitation(name)  
            send_email(name, email) 

上述代码逻辑直观:首先读取Excel文件中的姓名和邮箱数据,随后调用get_invitation()函数生成对应的邀请函,最后将数据传递给send_email()函数以执行自动发送邮件操作。需注意,实际运行中这两步是分离执行的:先执行get_invitation()生成邀请函,随后注释掉该函数调用,再执行发送邮件函数。

4)自动发送邮件

关于自动发送邮件的功能,此前已有相关文章介绍,此处再次应用。起初看似复杂,实则逻辑并不繁琐,具体实现代码如下:


smtp = smtplib.SMTP(host="smtp.qq.com", port=587)  
# smtp.login(邮箱, 授权码)  
smtp.login('235977@qq.com', "ruybefkipoo")  
def send_email(name, email):  
    msg = MIMEMultipart()  
    msg["subject"] = f"您好,{name},您的邀请函!"  
    msg["from"] = "2352180977@qq.com"  
    msg["to"] = email  
    html_content = f"""  
    <html>  
        <body>  
                <p>您好:{name}<br>  
                    <b>欢迎加入Python进阶者学习交流群,请在附件中查收您的门票~</b><br>  
                    点击这里了解更多:<a href="https://www.pdcfighting.com" rel="external nofollow"  rel="external nofollow" >演唱会主页</a>  
                </p>  
        </body>  
    </html>  
    """  
    html_part = MIMEText(html_content, "html")  
    msg.attach(html_part)  
    with open(f"./邀请函/{name}.pdf", "rb") as f:  
        doc_part = MIMEApplication(f.read())  
        doc_part.add_header("Content-Disposition", "attachment", filename=name)  
        # 把附件添加到邮件中  
        msg.attach(doc_part)  
        # 发送前面准备好的邮件  
        smtp.send_message(msg)  
        # 如果放到外边登录,这里就不用退出服务器连接,所以注释掉了  
        # smtp.quit() 

此处需特别注意三点:第一,邮箱登录操作置于函数外部,旨在避免函数被多次调用时因短时间频繁请求登录而导致邮箱账号被封禁;第二,登录凭证使用的是授权码而非邮箱登录密码,示例中采用QQ邮箱,其他邮箱服务商需相应调整SMTP服务配置;第三,该代码不仅包含HTML格式的邮件正文,还附加了PDF格式的邀请函文件,逻辑相对复杂。

5)完整代码

上述四个步骤已拆分演示,依次完成了Word文档内容替换、Excel表格数据读取、PDF文件生成以及Email自动邮件发送任务。此处提供完整可运行代码供参考。


import docx  
from docx2pdf import convert  
import openpyxl  
import smtplib  
from email.mime.text import MIMEText  
from email.mime.multipart import MIMEMultipart  
from email.mime.application import MIMEApplication  
# 生成对应的邀请函,并转存pdf格式  
def get_invitation(name):  
    doc = docx.Document("template.docx")  
    for para in doc.paragraphs:  
        if '<name>' in para.text:  
            for run in para.runs:  
                if '<name>' in run.text: 
                    runrun.text = run.text.replace('<name>', name)  
        doc.save(f'./邀请函/{name}.docx')  
    convert(f"./邀请函/{name}.docx")  
smtp = smtplib.SMTP(host="smtp.qq.com", port=587)  
smtp.login('235977@qq.com', "ruybefkipoo")  
def send_email(name, email):  
    msg = MIMEMultipart()  
    msg["subject"] = f"您好,{name},您的邀请函!"  
    msg["from"] = "2352180977@qq.com"  
    msg["to"] = email  
    html_content = f"""  
    <html>  
        <body>  
                <p>您好:{name}<br>  
                    <b>欢迎加入Python进阶者学习交流群,请在附件中查收您的门票~</b><br>  
                    点击这里了解更多:<a href="https://www.pdcfighting.com" rel="external nofollow"  rel="external nofollow" >演唱会主页</a>  
                </p>  
        </body>  
    </html>  
    """  
    html_part = MIMEText(html_content, "html")  
    msg.attach(html_part)  
    with open(f"./邀请函/{name}.pdf", "rb") as f:  
        doc_part = MIMEApplication(f.read())  
        doc_part.add_header("Content-Disposition", "attachment", filename=name)  
        # 把附件添加到邮件中  
        msg.attach(doc_part)  
        # 发送前面准备好的邮件  
        smtp.send_message(msg)  
        # 如果放到外边登录,这里就不用退出服务器连接,所以注释掉了  
        # smtp.quit()  
def get_username_email():  
    workbook = openpyxl.load_workbook("names.xlsx")  
    worksheet = workbook.active 
    for index, row in enumerate(worksheet.rows):  
        if index > 0:  
            name = row[0].value  
            email = row[3].value  
            # print(name, email)  
            # print(f"{name}邀请函正在生成...")  
            # get_invitation(name)  
            send_email(name, email)  
if __name__ == '__main__':  
    get_username_email()  
    # get_invitation('Python进阶者') 

总结

本文基于Python自动化办公场景,主要介绍了利用Python相关库依次完成Word文档替换、Excel表格读取、PDF文件生成及Email自动邮件发送任务的完整流程。程序运行后,邀请函自动生成并发送邮件,处理速度显著。对于数百至数千名客户的邀请函发送任务,该方案效果显著;若客户数量达到上万名,建议借助第三方邮件平台辅助,因为普通邮箱每日发送数量有限制。

到此这篇关于Python自动化办公实战案例详解(Word、Excel、Pdf、Email邮件)的文章就介绍到这了,更多相关Python自动化办公内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表