8

使用Python制作WORD报告

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzI1MTE2ODg4MA%3D%3D&%3Bmid=2650072250&%3Bidx=1&%3Bsn=ef2b9614ae42ebaa1fd30da53ca460ca
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

MbyUri7.png!web

在前面一期文章  使用Pandas、Jinja和WeasyPrint制作pdf报告 中我分享了如何使用HTML模板来创建pdf报告的方法。

虽然pdf很不错,但更多的人实际上在用微软的WORD来操作文档。 实际上对于用户来说,创建所需的模板会更加简单,该模板支持Word中所需的所有自定义格式,而不是尝试使用HTML + CSS。 幸运的是,有一个库支持在python中进行MS Word 邮件合并。 这种方法的优点是可以在任何系统上运行 - 即使没有安装Word。  

背景

使所有这一切成为可能的包叫做  docx-mailmerge 它是一个成熟的包,可以解析MS Word docx文件,找到  合并字段  并将您需要的任何值填充给它们。 该包还支持一些辅助函数,用于填充表并生成具有多个分页符的单个文件。

我知道标准的Word方法是将此进程称为  mailmerge  ,但本文中的这个  “mailmerge”  可以是一个有用的模板系统,可以用于更复杂的解决方案,而不仅仅是填充文档中的  名称和地址

安装

docx-mailmerge  需要依赖  lxml  ,所以需要先安装lxml,再安装 docx-mailmerge

pip install lxml
pip install docx-mailmerge

Word合并字段

为了使docx-mailmerge正常工作,您需要创建标准Word文档,并定义适当的  合并字段  。 以下示例适用于Word 2016.其他版本的Word应该类似。 实际上花了我一段时间来弄清楚这个过程,但是一旦你做了几次,这很简单。

启动Word并创建基本文档结构。 然后将光标放在应插入  数据 的位置,并选择 插入 - > 域

InmmuuF.jpg!web

从“字段”对话框中,从“字段名称”列表中选择“MergeField”选项。 在“字段名称”中,输入字段所需的名称。 在这种情况下,我们使用的是商业名称。

单击确定后,您应该在Word文档中看到类似这样的内容: << From >>。 您可以继续创建包含所有必填字段的文档。

aiqme2m.jpg!web

简单的合并

创建Word文档后,填充字段值是一项很简单的操作。

from mailmerge import MailMerge
import datetime

template = "PracticalPython.docx"

我们的  PracticalPython.docx  文件可以看做是用来给大家群发新年祝福邮件模板。

IjMZ32V.jpg!web

下面我们先看看docx文档中有哪些合并字段

document = MailMerge(template)

print(document.get_merge_fields())
{'From', 'date', 'FromUserName', 'To', 'ToUserName'}

我们发现  PracticalPython.docx  文档中有我们上图邮件模板中设计的几个  合并字段 ,如  From, date, FromUserName, To, ToUserName  。 下面我们对这几个变量进行填充。

document.merge(
    From='[email protected]',
    FromUserName='大邓',
    To = '[email protected]',
    ToUserName='关注者的昵称',
    date='{:%d-%b-%Y}'.format(datetime.date.today())
)

#输出的docx文件
document.write('output.docx')

这是简单的Word文档填充效果

J3IRfq3.jpg!web

插入表格

生成模板时的另一个常见需求是有效地填充值表格中的值。 在我们的示例中,我们可以在包含客户购买历史的信件上附上展览。 在完成模板时,我们不知道要包含多少行,并且  每个字段  的填充将会非常快。 使用merge_rows可以使表格填充更容易。

在本部分构建模板,请创建一个包含1行的标准Word表,并将字段插入相应的列中。 无需特殊格式。 它应该看起来像这样:

uQVvYzJ.png!web

现在我们定义了一连串的字典,用于填充到表格中去

document2 = MailMerge('purchasehistory.docx')

sales_history = [{
    'prod_desc': 'Red Shoes',
    'price': '$10.00',
    'quantity': '2500',
    'total_purchases': '$25,000.00'}, {
    'prod_desc': 'Green Shirt',
    'price': '$20.00',
    'quantity': '10000',
    'total_purchases': '$200,000.00'}, {
    'prod_desc': 'Purple belt',
    'price': '$5.00',
    'quantity': '5000',
    'total_purchases': '$25,000.00'}]

document2.merge_rows('prod_desc', sales_history)
document2.write('output-table.docx')

最终结果是每行填充了我们需要的值,并保留了我们在模板文档中定义的默认表格式:

jIfYN3q.png!web

近期文章

漂亮~pandas可以无缝衔接Bokeh

综述:文本分析在市场营销研究中的应用

Lazy Prices公司年报内容变动碰上股价偷懒

用python帮你生产指定内容的word文档

2020年B站跨年晚会弹幕内容分析

YelpDaset: 酒店管理类数据集10+G

NRC词语情绪词典和词语色彩词典

Loughran&McDonald金融文本情感分析库

股评师分析报告文本情感分析预测股价

使用分析师报告中含有的情感信息预测上市公司股价变动

代码不到40行的超燃动态排序图

jupyter notebook代码获取方式,公众号后台回复关键词“ 20200307 ” 

6RrYj2I.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK