使用Python制作WORD报告

     作者:大邓

     来源:大邓和他的Python

在前面一期文章 使用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')

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

◆ ◆ ◆  ◆ ◆

长按二维码关注我们
数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。

管理员二维码:


猜你喜欢
● 笑死人不偿命的知乎沙雕问题排行榜● 用Python扒出B站那些“惊为天人”的阿婆主!● 互联网大佬学历&背景大揭秘,看看是你的老乡还是校友● 上万条数据撕开微博热搜的真相!● 你相信逛B站也能学编程吗?
以下是一个简单的打字练习程序,可以帮助你练习打字速度和准确性。 ```python import random import time # 定义练习的单词列表 words = ['python', 'programming', 'code', 'computer', 'algorithm', 'database', 'debugging', 'syntax', 'variable', 'function'] # 定义练习的时间(秒) time_limit = 60 # 随机选择一个单词 def get_word(): return random.choice(words) # 显示单词并等待用户输入 def display_word(word): print(word) start_time = time.time() user_input = input() end_time = time.time() return user_input, end_time - start_time # 进行打字练习 def practice(): # 初始化计数器和时间 correct_count = 0 total_time = 0 # 显示说明 print('你有', time_limit, '秒的时间尽可能多地输入单词。准备好了吗?') input('按回车键开始。') # 进行练习 while total_time < time_limit: word = get_word() user_input, time_taken = display_word(word) # 判断用户输入是否正确 if user_input == word: correct_count += 1 print('正确!') else: print('错误!') # 更新计数器和时间 total_time += time_taken print('已用时:', total_time, '秒') # 显示练习结果 print('时间到!') print('你输入了', correct_count, '个正确的单词。') accuracy = correct_count / (total_time / 60) print('你的打字速度为', accuracy, '个单词/分钟。') # 运行程序 practice() ``` 这个程序会随机选择一个单词,并让用户输入。如果用户输入正确,程序会显示“正确!”;如果用户输入错误,程序会显示“错误!”并给出正确答案。程序会记录用户输入的正确单词数量和用时,并在练习结束后显示练习结果,包括正确单词数量和打字速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值