Python从Excel批量生成Word

您所在的位置:网站首页 如何将excel中的数据导入word并实现自动排版功能打印 Python从Excel批量生成Word

Python从Excel批量生成Word

2024-07-09 23:41| 来源: 网络整理| 查看: 265

Python从Excel批量生成Word

最近两个周,参与了几场毕业设计答辩,大约答辩了48个学生,不得不说,做的都是个啥呀,简直就是一坨,不生气不生气不生气。好了,答辩完就是无尽的答辩资料,比如说48个学生需要准备48个word评审表存档材料,天哪!!!!按道理来说呢,应该每个学生答辩时就将成绩部分填好了,而且开始确实是这样做的,大约过了20个同学,后来随着答辩速度的提高,手速明显跟不上了,所以就写了个总分,简单写个评语存到了汇总表中,想着回头再向word中添加。这不是昨天终于完成了最后几个同学的二辩任务,突然说后天就要评审表,这还了的,一个一个弄还不得弄大半天。是时候祭出我的Python大法了,哈哈哈哈哈哈哈

5分钟的百度

经过5分钟的百度,基本确认下来,excel需要使用xrld库(这个以前用过比较熟悉),word需要使用docx-mailmerge库

15分钟文档

docx-mailmerge的文档写的有点简单了,基本大体理解什么意思,但是还是百度了一下基本使用方法,基本原理就是利用在word文档中设置**文本域(mailfiled)**作为关键词,然后使用docx-mailmerge进行域内容的替换即可。

15分钟清洗数据,创建模板文件

将excel中的数据进行精简,去掉平均成绩等没有用的列以及表头(不去掉也行,回头在python里边直接跳过表头行就可以)。同时添加一些我的姓名,各部分成绩等内容。创建word模板文件,主要就是将需要替换的内容都用域进行标识,操作方法如下![GIF 2020-6-9 17-42-00.gif](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlLzAvMjAyMC9naWYvOTc0MTA2LzE1OTE2OTYxNjk3NjQtNGViYzA4MzUtNjJiNi00MzlmLWFkODQtMDgxMmY0NWVmMDFhLmdpZg#align=left&display=inline&height=790&margin=[object Object]&name=GIF 2020-6-9 17-42-00.gif&originHeight=790&originWidth=1708&size=1205761&status=done&style=none&width=1708)

30分钟,写代码,调bug

着实没有想到,竟然会浪费这么多时间在这个地方,主要原因还是文档那块准备不足,我这个文件主要是word表格,而word中表格域使用的方法和word文档中的域不一样,总之吧,弄好了。代码非常简单

# 导入相关包 import xlrd from mailmerge import MailMerge import os # 设置数据来源文件 datafile_path = 'score.xlsx' # 打开数据文件 data = xlrd.open_workbook(datafile_path) table = data.sheet_by_name('Sheet1') # 计算有多少行数据,决定后边for循环次数 nrows = table.nrows # 选择word模板文件,注意格式要docx,同时生成的文件也是docx template = 'template.docx' # 循环输出 for i in range(nrows): # 循环逐行打印 # 读取导师名,给每个导师创建一个文件夹 dirname = table.row_values(i)[13] # 如果文件夹存在就不创建了,否则创建 if not os.path.exists(dirname): os.mkdir(dirname) # 拼接文件名,由导师名、学号、姓名、后缀组成,所以稍微有点长 filename = table.row_values(i)[13] \ + "/" \ + table.row_values(i)[0]\ + '-' \ + table.row_values(i)[1] \ + ".docx" # 创建MailMerge对象,参数是模板文件 document = MailMerge(template) # 开始对域进行替换 # 如果是文档中的域,可以直接使用merge方法进行替换 # word文档中的表格使用merge_rows替换 # 实际mailmerge这个包的文档里也说了 # 新版的已经实现了使用merge方法对两种域同时进行替换的功能,不过我懒得改了 documenrge_rows( 'name', [{'name': table.row_values(i)[0]+'-' + table.row_values(i)[1] + '-邵常龙', 'title':table.row_values(i)[5] }] ) documenrge_rows( 'content', [{ 'year': str(int(table.row_values(i)[2])), 'month':str(int(table.row_values(i)[3])), 'day': str(int(table.row_values(i)[4])), 'content':table.row_values(i)[12] }] ) documenrge_rows('s1', [{'s1': str(int(table.row_values(i)[7]))}]) documenrge_rows('s2', [{'s2': str(int(table.row_values(i)[8]))}]) documenrge_rows('s3', [{'s3': str(int(table.row_values(i)[9]))}]) documenrge_rows('s4', [{'s4': str(int(table.row_values(i)[10]))}]) documenrge_rows('s5', [{'s5': str(int(table.row_values(i)[11]))}]) documenrge_rows('s6', [{'s6': str(int(table.row_values(i)[6]))}]) # 将替换好的文档进行保存,参数为上边生成的文件路径 document.write(filename) # 创建新文件

总结

整个过程实际也花了1个多小时,看完电影开始搞,搞到00:30。。。。。。不过,应该比一个文件一个文件的创建修改要好多了。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3