每到年终时,公司都要举办年会,总结当年的得失。还有就是组织个晚会,表演些节目,抽奖......当然,还有,赏大餐一顿。人事部的妹子这时就发愁了,忙碌地进行各种准备不说,还要给供应商,政府部门发邀请函。这个邀请函其实除了受邀者的名字不同外,其它信息完全一样,纯粹的体力活。这种脏累活儿,就交给Python来干吧。

首先,我们需要将所有受邀者的公司名和代表姓名填入一个Excel表格。然后做好邀请函的模板,在需要填字的地方打上小星星“****”,然后就让Python来玩填字游戏啦。话不多说,直入主题,代码走一波......

#1.从Excel文件获取受邀人单位和名字

from openpyxl import load_workbook

wb=load_workbook('data/name_list.xlsx')

ws=wb['name']

names=[]

for row in range(2,ws.max_row+1):

company=ws["A"+str(row)].value

name=ws["B"+str(row)].value

names.append(" {} {} ".format(company,name))

names

>>[' 供应商1 王波 ',

' 供应商2 刘海洋 ',

' 供应商3 少和光 ',

' 供应商4 真凡巧 ',

' 供应商5 鲁鸿运 ',

' 政府1 乐清霁 ',

' 政府2 郎绮琴 ',

' 政府3 贝芳懿 ',

' 政府4 哈彦君 ']

我们首先导入openpyxl模块中的load_workbook模块。openpyxl是一个可读取Excel的第三方库。load_workbook()可打开一个现有的Excel文件(或叫工作簿)。我们使用load_workbook(path)读取文件,并存在变量wb里面。我们可以想象变量就是容器,用来储存各种数据,这里的wb就是这个容器的名字。wb存储的是整个工作簿的内容,我们知道一个Excel有几个工作表“Sheet”,接下来我们需要选取我们所需要的“Sheet”,也就是名字叫"name"的那张表。当然你可以给这个工作表起自己喜欢的名字,在写代码的时候把wb['name']中的"name"字样替换成你的个性化名字即可。

然后定义一个空列表names来存储受邀人单位和名字信息。随后我们遍历工作表,将所有信息提取出来存入列表names。因为工作表第一行是标题,所以我们从第2行开始,最大一行+1结束range(2,ws.max_row+1)。之所以要加1,是因为range(1,5)只能取到“1,2,3,4”四个值,5是取不到的。ws.max_row指工作表的总行数。然后我们开始提取公司名称,company=ws["A"+str(row)].value,当row取2时,就相当于将工作表中A2(即A列2行单元格的值)单元格的值传给了company变量。获取姓名也是类似的操作方式。

然后将公司名称和姓名排一下版,再加入names列表。" {} {} ".format(company,name)这个格式化字符串函数就完成了这个操作。我们在公司名和姓名之间及前后都加入了一个空格,这样在最终的邀请函上看起来就是这样的:“尊敬的 供应商1 王波 先生/女士:”。不留空格的话,就变成这样了:“尊敬的供应商1王波先生/女士:”,似乎有点不和谐。格式化字符串可以理解为,将format(company,name)括号中的值依次填入前面的{}。

# 2.批量填字,存为不同的word文件

import docx #导入处理word的库,无耻地直接使用别人造好的轮子

doc=docx.Document('data/邀请函.docx')

for name in names:

doc.paragraphs[1].runs[2].text=name

doc.save('data/邀请函_{}.docx'.format(name))

受邀人信息获取完成后,我们就可以开始批量生成邀请函了。首先导入处理word的库,无耻地直接使用别人造好的轮子。建立一个容器doc,来盛装打开的邀请函,docx.Document('data/邀请函.docx')为固定写法,括号内填写邀请函模板的路径及文件名。doc可理解为就是这个名为“邀请函”word文件。然后遍历names列表,将里面的信息逐个写入word文件的第二段的第三个run,即doc.paragraphs[1].runs[2].text=name,相当于直接用name的值“ 供应商1 王波 ”替换掉****。其中的run指的是每一段中的不同的格式,比如一段中有常规的,有加粗的,有斜体的,有不同颜色的字,那么就有好几个run。

那我们怎么知道****是第二段第三个run呢?通过我们制作的“邀请函”模板,我们知道****位于第二段(即doc.paragraphs[1],因为是从0开始计数,所以0表示第一段,1就表示第二段)。请注意word中若有空行,也算一段,比如模板中的"ABC有限公司"开头的那一段已经算是第四段了。我么将第二段的所有run打印出来,就可以找到****所在的run了。

doc=docx.Document('data/邀请函.docx')

for run in doc.paragraphs[1].runs:

print(run.text)

>>尊敬

****

先生

/

女士

我们可以看到其中有7个runs,虽然“尊敬的”三个字格式是一样的,但是还是被识别为两个单独的run了,可能这个库主要用来处理英文文档,拿来搞中文有些水土不服。不管它了,让它乱识别吧。通过以上的run打印,我们简单粗暴地数下去,可以知道****在第三个run,即run[2]。

然后逐个保存为单个的文件,并在给新的word文件命名时加上受邀人的信息doc.save('data/邀请函_{}.docx'.format(name))。得到的结果如下:

为了方便打印,可以使用word自带的合并功能将所有邀请函合并为一个word文件。打开第一个邀请函word文档,然后单击【插入】选项卡下的【对象】菜单中的【文件中的文字】选项,选择剩余的所有邀请函word文件,点插入,搞定!

所有源代码和说明都在Jupyter notebook上完成,所用到的Excel 资料已上传GitHub, 欢迎Fork或下载到本地随意玩。。。转载请注明出处,谢谢。

GitHub链接:https://github.com/weidylan/Office_Automation_by_Using_Python

微信公众号:Python操作EXCEL高效率工作

python批量生成word_实例5:用Python批量生成word版邀请函相关推荐

  1. python自动制作word_办公自动化5_用Python批量生成word版邀请函

    -- coding: utf-8 -- """ Created on Sat Jul 11 23:06:30 2020 @author: Administrator &q ...

  2. python编程入门经典实例-总算明了python编程入门经典实例

    跟Java语言一样,python语言也有类的概念,直接使用class关键字定义python类.在python类,定义类的方法.然后直接使用类的初始化调用自身,获取相应的属性.以下是小编为你整理的pyt ...

  3. python正则表达式处理txt,python 正则表达式参数替换实例详解 python使用正则表达式替换txt内容...

    Python正则表达式如何进行字符串替换实例 import res = 'adds23dd56'ss = re.sub(r'\d', '*', s)>>> ss'adds**dd** ...

  4. python爬虫知网实例-33个Python爬虫项目实战(推荐)

    今天为大家整理了32个Python爬虫项目. 整理的原因是,爬虫入门简单快速,也非常适合新入门的小伙伴培养信心.所有链接指向GitHub,祝大家玩的愉快~O(∩_∩)O WechatSogou [1] ...

  5. python数据库应用开发实例_纯Python开发的nosql数据库CodernityDB介绍和使用实例

    看看这个logo,有些像python的小蛇吧 .这次介绍的数据库codernityDB是纯python开发的. 先前用了下tinyDB这个本地数据库,也在一个api服务中用了下,一开始觉得速度有些不给 ...

  6. python编程入门经典实例-终于明了python入门经典实例

    算术最基本的操作符,是小学数学的+ - * / ,对于整数,还可以用+=,*=的操作符,对自身的值进行改变(对象引用).以下是小编为你整理的python入门经典实例 对于整数的加减乘除,但需要注意的是 ...

  7. python传递类的实例_使用Python将变量从一个类实例传递到另一个类实例?

    我在将一个类实例中定义的变量传递到另一个类实例时遇到问题.我对使用类比较陌生,但据我所知,变量可以通过简单地定义为类实例的一部分(例如在下面的示例中)从一个实例传递到另一个实例.虽然我以前使用过这个模 ...

  8. python爬网站数据实例-如何用Python爬数据?(一)网页抓取

    如何用Python爬数据?(一)网页抓取 你期待已久的Python网络数据爬虫教程来了.本文为你演示如何从网页里找到感兴趣的链接和说明文字,抓取并存储到Excel. 需求 我在公众号后台,经常可以收到 ...

  9. python处理excel表格实例-通过实例学习Python Excel操作

    这篇文章主要介绍了通过实例学习Python Excel操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.python 读取Excel # -* ...

最新文章

  1. codeforces round 416 div2补题
  2. Saas 平台,多域名,泛域名.如何做分站点的统计之解决方案
  3. 開玩樹莓派(二):配置IP,實現無顯示器局域網內Putty連接和RDP遠程
  4. AV1:为互联网提供开放、免费的视频编解码工具
  5. sqlserver2000给账户授予所有的权限_内网渗透 | 域内权限解读
  6. 【Clickhouse】Clckhouse 视图 可以插入 但是查询不到
  7. java 遗传算法_遗传算法的基本概念和实现(附 Java 实现案例)
  8. 【转】一个SQL查询出每门课程的成绩都大于80的学生姓名
  9. mPush实战笔记4安装mpush
  10. 百度地图做电子围栏总结
  11. 用741运算放大器搭建RC正弦振荡器:文氏电桥振荡电路
  12. ubuntu20.04 桌面文件和文件夹图标 丢失解决
  13. opencv-之求直线的斜率
  14. 2022智源大会议程公开 | 人工智能新基建论坛
  15. .NETZ 原理分析 .NETZ - .NET Executables Compressor .NETZ compresses the Microsoft .NET Framework execu
  16. OpenGL 加载DDS文件(压缩纹理)
  17. 学生课程成绩信息实体表设计mysql_数据库综合实验--设计某高校学生选课管理系统...
  18. 【2021知识蒸馏】Show, Attend and Distill:Knowledge Distillation via Attention-based Feature Matching
  19. Fater-RCNN
  20. QtAV视频播放器的介绍、编译以及简单使用

热门文章

  1. 激光三角测量物体高度
  2. python 二维列表_python二维列表
  3. win10 更新Node JS和npm
  4. 光学载波网络(SONET OC)的网络带宽
  5. Unity3D-VR《静夜诗》5-李白吟诗
  6. python计算平均分
  7. 基于N-gram的双向最大匹配中文分词
  8. 近几个月Github上最热门的Java项目一览
  9. Android实现图片轮播
  10. openstack 创建虚拟机后,虚拟机启动hang在cpu 检测