在前面一期文章 使用 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='123456dadeng@qq.com',
- FromUserName='大邓',
- To = '654321guanzhuzhe@qq.com',
- 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')
最终结果是每行填充了我们需要的值, 并保留了我们在模板文档中定义的默认表格式:
近期文章
漂亮~ pandas 可以无缝衔接 Bokeh
综述: 文本分析在市场营销研究中的应用
Lazy Prices 公司年报内容变动碰上股价偷懒
用 python 帮你生产指定内容的 Word 文档
2020 年 B 站跨年晚会弹幕内容分析
YelpDaset: 酒店管理类数据集 10+G
NRC 词语情绪词典和词语色彩词典
Loughran&McDonald 金融文本情感分析库
股评师分析报告文本情感分析预测股价
使用分析师报告中含有的情感信息预测上市公司股价变动
代码不到 40 行的超燃动态排序图
jupyter notebook 代码获取方式, 公众号后台回复关键词 "20200307"
来源: http://www.tuicool.com/articles/yAviQ3U