Python自动化Word,使用Python-docx和pywin32

2022-03-04 16:04:20 浏览数 (1)

标签:python,pandas,python-docx,pywin32

本文介绍如何使用python-docx自动化Word文档,以及如何使用win32com库发送电子邮件。假设有一个存储在Excel文件(或数据库)中的客户信息列表,处理过程如下所示:

1.为每个客户端自动生成MS Word发票

2.将Word文档转换为PDF格式

3.使用MS Outlook App向客户发送带有自定义问候语的PDF发票

所需要的库

这个项目需要三个库。使用pandas从Excel文件中读取数据,但如果数据在其他地方,或者希望以其他方式提取客户数据,则pandas库不是必需的。

python-docx用于自动化.docx(例如MS Word,Googledocs)文件。

pywin32用于与WindowsAPIs相交互。

使用python-docx自动化Word文档

如果你还没有安装这个库,在命令行中输入:

pip installpython-docx

安装这个库。

因为docx库可创建.docx文件,所以不必使用MSWord。要创建一个docx文件,需要先创建一个Document对象,然后在document对象内部,可以添加各种元素,如标题、段落、图片等。在下面的代码中,Inches对象用于定义图片等元素的大小。

Run对象表示任何文本,可以是字母、单词、句子或完整的段落。使用.add_paragraph()开始一个新的句子/段落“完美Excel”,然后可以继续向现有Paragraph对象添加新的Runs。

一旦添加了Run,就可以修改其字体、大小、颜色等属性。

下面的代码创建句子“完美Excel是专注数据分析的微信公众号”并设置格式。

创建发票

在Excel中的示例数据如下图所示。

注,上图数据只是示例,使用我自己的测试电子邮件地址。

现在,让我们为每个客户创建一张发票。

由于这是一个流线型流程的一部分,我们将编写一个一次只做一件事的函数。第一步是以.docx格式创建发票。这个函数接受以下参数:客户名称、电子邮件、销售给他们的产品、数量和单价。

该函数的代码如下:

使用下面语句测试这个函数:

make_client_invoice('客户1','xhdsxfjy@163.com', '产品1', 10, 11000)

结果如下图所示。

注:从图上可以看出,这几个库支持中文不是太友好!

转换MS Word文档为PDF格式

有了发票的Word文档之后,让我们将其转换为PDF,因为这是商务文档的标准格式。

我们将使用pywin32/win32com库,这个库的安装名和库名不同。注意以下差异:

安装这个库,使用:

pip installpywin32

导入这个库,使用:

import win32com.client

win32com是一个很棒的库,允许我们在Windows操作系统中控制很多东西。例如,它可以控制Office应用套件。

要将Word(.docx)转换成PDF格式,实际上是使用win32com打开文档,然后将其另存为PDF格式。很简单!

下面的代码接受输入文件路径src,然后将pdf转换并保存到文件路径dst。

win32com.client.Dispath("Word.Application")将在Python中创建一个MSWord实例/对象。将Word替换为Excel,将拥有一个Excel实例!

wdFormatPDF=17可能是VBA使用的约定。可以在下面的链接中检查可以保存的其他文件类型选项的列表:https://docs.microsoft.com/en-us/office/vba/api/word.wdsaveformat。

使用Outlook App自动发送电子邮件

接下来,我们将把发票发给我们的客户。win32com再次成为我们与OutlookApp交互的助手。注意,不是基于web的Outlook,而是安装在我们计算机上的实际应用程序。此步骤要求在计算机上安装Office(尤其是Outlook),并登录Outlook帐户。只要你的Outlook应用程序保持登录状态,就不需要用户名和密码。

在上面的代码中,第3行CreateItem(0)表示创建Mail对象。有关可以在Outlook中创建的其他可能对象,参见下表。

要添加附件,只需传入类似于代码第7行的文件位置。

似乎甚至不需要打开Outlook应用程序就可以使用Python发送电子邮件。只要我们以前登录过Outlook应用程序,就可以继续了。最好的部分是,不需要凭据或密码,win32com只需使用现有设置与Outlook交互即可。

完整的代码

现在,已经为发票系统的三个步骤提供三个函数。把它们组合起来了,可以使用循环逐个发送发票,或使用其他流程生成发票。

代码语言:javascript复制
from docx import Document
from docx.shared import Inches
import pandas as pd
import win32com.client
def make_client_invoice(name, email, product, unit, price):
    document = Document()
    document.add_picture(r"D:完美Excelpython.png", width=Inches(1))
    document.add_heading('发票', 0)
    p1 = document.add_paragraph('尊敬的 ')
    p1.add_run(name).bold = True
    p1.add_run(':')
    p2 = document.add_paragraph('请获取后附的你最近购买产品的发票,你购买')
    p2.add_run(product).bold = True
    p2.add_run('共计')
    p2.add_run(str(unit)).bold = True
    p2.add_run('个。')
    [document.add_paragraph('') for __ inrange(2)]
    table = document.add_table(rows=1, cols=4)
    hdr_cells = table.rows[0].cells
    hdr_cells[0].text = '产品名称'
    hdr_cells[1].text = '数量'
    hdr_cells[2].text = '单价'
    hdr_cells[3].text = '总价'
    for i in range(4):
       hdr_cells[i].paragraphs[0].runs[0].font.bold = True
    row_cells = table.add_row().cells
    row_cells[0].text = product
    row_cells[1].text = f'{unit:,.2f}'
    row_cells[2].text = f'{price:,.2f}'
    row_cells[3].text = f'{unit * price:,.2f}'
    [document.add_paragraph('') for __ inrange(10)]
    document.add_paragraph('合作愉快,欢迎再次光临!')
    document.add_paragraph('此致')
    document.add_paragraph('敬礼!')
    document.save(f'{name}.docx')
def docx_to_pdf(src, dst):
    word =win32com.client.Dispatch("Word.Application")
    wdFormatPDF = 17
    doc = word.Documents.Open(src)
    doc.SaveAs(dst, FileFormat=wdFormatPDF)
    doc.Close()
    word.Quit()
def send_email(name, to_addr, attachment):
    outlook =win32com.client.Dispatch("Outlook.Application")
    mail = outlook.CreateItem(0)
    mail.To = to_addr
    mail.Subject = '发票'
    mail.Body = f'尊敬的{name}, 请查找附件发票'
    mail.Attachments.Add(attachment)
    mail.Send()

注:本文学习整理自pythoninoffice.com,稍有调整修改。

0 人点赞