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模板文件,主要就是将需要替换的内容都用进行标识,操作方法如下

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方法对两种域同时进行替换的功能,不过我懒得改了
    document.merge_rows(
        'name',
        [{'name': table.row_values(i)[0]+'-' + table.row_values(i)[1] + '-邵常龙',
          'title':table.row_values(i)[5]
          }]
    )
    document.merge_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]
        }]
    )
    document.merge_rows('s1', [{'s1': str(int(table.row_values(i)[7]))}])
    document.merge_rows('s2', [{'s2': str(int(table.row_values(i)[8]))}])
    document.merge_rows('s3', [{'s3': str(int(table.row_values(i)[9]))}])
    document.merge_rows('s4', [{'s4': str(int(table.row_values(i)[10]))}])
    document.merge_rows('s5', [{'s5': str(int(table.row_values(i)[11]))}])
    document.merge_rows('s6', [{'s6': str(int(table.row_values(i)[6]))}])
    # 将替换好的文档进行保存,参数为上边生成的文件路径
    document.write(filename)  # 创建新文件

总结

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