使用Python制作WORD报告
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.
在前面一期文章 使用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并创建基本文档结构。 然后将光标放在应插入 数据
的位置,并选择 插入 - > 域
从“字段”对话框中,从“字段名称”列表中选择“MergeField”选项。 在“字段名称”中,输入字段所需的名称。 在这种情况下,我们使用的是商业名称。
单击确定后,您应该在Word文档中看到类似这样的内容: << From >>。 您可以继续创建包含所有必填字段的文档。
简单的合并
创建Word文档后,填充字段值是一项很简单的操作。
from mailmerge import MailMerge import datetime template = "PracticalPython.docx"
我们的 PracticalPython.docx
文件可以看做是用来给大家群发新年祝福邮件模板。
下面我们先看看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文档填充效果
插入表格
生成模板时的另一个常见需求是有效地填充值表格中的值。 在我们的示例中,我们可以在包含客户购买历史的信件上附上展览。 在完成模板时,我们不知道要包含多少行,并且 每个字段
的填充将会非常快。 使用merge_rows可以使表格填充更容易。
在本部分构建模板,请创建一个包含1行的标准Word表,并将字段插入相应的列中。 无需特殊格式。 它应该看起来像这样:
现在我们定义了一连串的字典,用于填充到表格中去
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')
最终结果是每行填充了我们需要的值,并保留了我们在模板文档中定义的默认表格式:
近期文章
jupyter notebook代码获取方式,公众号后台回复关键词“ 20200307 ”
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK