标签: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,稍有调整修改。