python实现excel到word(word邮件合并)

需求描述:将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])

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值