需求描述:将excel文件中的每条成绩信息按照要求格式转换到word每页中,一条对应一页。(如图一到图二的转换),python可以实现,但实现起来比较繁琐,而且转换效率比较低。本人亲测了一下,80条数据的excel转换到word80页,用python实现大概需要3分钟,而如果使用word邮件合并大概只需要30秒。但并不代表python不能用,代码执行的好处就在于写一次可以多个场景使用,使用时一键执行,不需要做很多设置。
图一
图二
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@文件 :scoresToWord.py
@说明 :python之将excel每条成绩信息,按照相应模板转换到word中每页
@时间 :2020/10/16 21:20:55
@作者 :侃侃
@版本 :3.8
'''
import pandas as pd
import numpy as np
from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH #设置水平居中对齐需要用到的库
from docx.enum.table import WD_ALIGN_VERTICAL #设置垂直居中对齐需要用到的库
from docx.shared import Inches,Cm,Pt
'''
1、根据教学计划生成每一页的word模板
2、将excel每一条学生成绩信息填入到每一页word模板中,一条对应一页
'''
#创建每页word模板,teachingplan_filepath为教学计划的excel表文件路径,result_filepath为输出word文件路径
def CreatPage(teachingplan_filepath,result_filepath,pageid):
#读取excel数据,并将第一行数据作为列名
db=pd.read_excel(teachingplan_filepath,dtype=str,header=0)
#设置标题
black_font = u'黑体'
run = doc.add_heading('', level=1).add_run('学号:'+scores['学号'].at[pageid]+' 姓名:'+scores['姓名'].at[pageid]+' 专业:会计学 层次:高起本')
run.font.name = black_font
#画表格
rows=db.shape[0]#获取行数,后面生成序号使用
table=doc.add_table(rows=rows+1,cols=6,style='Table Grid')#添加表格
# 添加分页符
doc.add_page_break()
#设置表格标题
titles=["学年","学期","序号","考试科目","类型","成绩"]#标题内容
title_cells = table.rows[0].cells
for i in range(len(titles)):
title_cells[i].text = titles[i]
#设置列宽,必须将列所有单元格均设置才生效
for row in range(0,rows+1):
table.cell(row,2).width=Cm(1.4)
table.cell(row,3).width=Cm(4.35)
table.cell(row,4).width=Cm(1.92)
term=db["建议学期"]#获取建议学期
num=np.arange(1,rows+1,1)#生成序号数组
seq=[str(x) for x in num]#将序号数组int类型元素,全部转换为字符串型,int型元素遍历时报错。
subjects=db["课程名称"]#获取考试科目
mode=db["考核方式"]#获取考核方式
for row in range(1,rows+1):
#填入建议学期
table.cell(row,1).text=term[row-1]
#填入序号
table.cell(row,2).text=seq[row-1]
#填入考试科目
table.cell(row,3).text=subjects[row-1]
#填入考核方式
table.cell(row,4).text=mode[row-1]
#填入成绩
table.cell(row,5).text=scores[table.cell(row,3).text].at[pageid]
#合并相同学期
#动态声明学期变量list
# 第一步 准备locals函数,存放10个学期list
terms_list = locals()
"""
第二步 循环10次,从0-9赋值给locals函数对应的变量terms_list
terms_list是一个字典,所以将我们需要的列表名称作为key值传入
"""
for i in range(10):
terms_list['term_' + str(i)] = []
#将相同学期的行号,填入到对应学期
for row in range(1,rows+1):
if table.cell(row,1).text==str(1):
terms_list['term_0'].append(row)
elif table.cell(row,1).text==str(2):
terms_list['term_1'].append(row)
elif table.cell(row,1).text==str(3):
terms_list['term_2'].append(row)
elif table.cell(row,1).text==str(4):
terms_list['term_3'].append(row)
elif table.cell(row,1).text==str(5):
terms_list['term_4'].append(row)
elif table.cell(row,1).text==str(6):
terms_list['term_5'].append(row)
elif table.cell(row,1).text==str(7):
terms_list['term_6'].append(row)
elif table.cell(row,1).text==str(8):
terms_list['term_7'].append(row)
elif table.cell(row,1).text==str(9):
terms_list['term_8'].append(row)
elif table.cell(row,1).text==str(10):
terms_list['term_9'].append(row)
#合并相同学期单元格,并赋值
for i in range(10):
table.cell(terms_list['term_'+str(i)][0], 1).merge(table.cell(terms_list['term_'+str(i)][-1],1))
table.cell(terms_list['term_'+str(i)][0], 1).text="第"+str(i+1)+"学期"
#合并学年,两学期为一学年,并赋值
for i in range(0,10,2):
table.cell(terms_list['term_'+str(i)][0], 0).merge(table.cell(terms_list['term_'+str(i+1)][-1],0))
table.cell(terms_list['term_'+str(i)][0], 0).text="第"+str(int((i+2)/2))+"学年"
#各单元格水平和垂直方向居中对齐
for row in range(0,len(table.rows)):
for col in range(len(table.columns)):
table.cell(row,col).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
table.cell(row,col).vertical_alignment = WD_ALIGN_VERTICAL.CENTER
doc.save(result_filepath)
#生成num页word文件
def CreatPages(teachingplan_filepath,result_filepath,num):
for i in range(num):
CreatPage(teachingplan_filepath,result_filepath,i)
doc=Document()#创建一个Document对象
teachingplan_filepath="C:\\Users\\lenovo\\Desktop\\教学计划excel转word\\0.xlsx"
result_filepath="C:\\Users\\lenovo\\Desktop\\教学计划excel转word\\2.docx"
scores_filepath="C:\\Users\\lenovo\\Desktop\\教学计划excel转word\\会计函授汇总.xls"
#读取excel数据,并将第一行数据作为列名
scores=pd.read_excel(scores_filepath,dtype=str,header=0)
CreatPages(teachingplan_filepath,result_filepath,scores.shape[0])