制作100份word表

#制作100份word表

from docx import Document
from openpyxl import load_workbook
import os,shutil
import time


def progressBar(i,total):
    print('\r当前进度:{0}{1}%'.format('■'*(i+1),int((i+1)/total*100)),end='')

def delOldDir(dir_path):
    if os.path.exists(dir_path):
        shutil.rmtree(dir_path)

def make100Word(docx_file_path,xlsx_file_path,dir_path):   
    if not os.path.exists(dir_path):
        os.mkdir(dir_path) 
    #打开excel表
    workbook = load_workbook(xlsx_file_path)
    sheet = workbook.active
    count =0
    #有效信息行是从第一行开始的,第一行是表头,包含列名,也是文本替换的依据
    for table_row in range(1,sheet.max_row+1):
        count += 1
        #每循环一行实例化一个新的word文件
        wordfile = Document(docx_file_path)
        #单元格需要逐个遍历,每一个都包含着有用的信息
        for table_col in range(1,sheet.max_column + 1):
            # 旧的文本也就是列名,已经在模板里填好了,用于文本替换,将row限定在第一行后就是列名
            old_text = str(sheet.cell(row=1,column = table_col).value)
            # 新的文本就是实际的信息,table_col循环到某个数值时,实际的单元格和列名就确定了
            new_text=str(sheet.cell(row = table_row,column = table_col).value)
            # 加上这个判断是因为日期信息读进程序是“日期 时间”格式的,如果要保留日期信息可以用字符串方法或者用time/datetime模块处理
            if ' ' in new_text:
                new_text = new_text.split()[0]
            #单元格为空值时,会输入None,可以替换为空格
            if new_text =='None':
                new_text=" "
            

            # 文档Document - 段落Paragraph - 文字块Run
            all_paragraphs = wordfile.paragraphs
            for paragraph in all_paragraphs:
                for run in paragraph.runs:
                    run.text = run.text.replace(old_text,new_text)

            # 文档Document - 表格Table - 行Row/列Column - 单元格Cell
            all_tables = wordfile.tables
            for table in all_tables:
                for row in table.rows:
                    for cell in row.cells:
                        cell.text = cell.text.replace(old_text,new_text)

        #获取学号姓名生成转递信息表的名称
        if (table_row >1):
            num = str(sheet.cell(row=table_row,column=1).value)
            sno = str(sheet.cell(row=table_row,column=2).value)
            sname =str(sheet.cell(row=table_row,column=3).value)
            save_file_name = num + "#" + sno + "#" +sname +"_档案转递信息.docx"
            wordfile.save(dir_path +"/"+save_file_name)
        #打印进度
        progressBar(count,sheet.max_row+1)
    return (count-1)

def takeTime(start_time):
    seconds = time.time()-start_time
    return seconds
    
def main():
    start_time = time.time()
    root = os.getcwd() + "/"
    dir_path = root + "转递信息"
    docx_file_path = root + '转寄信息模板.docx'
    xlsx_file_path = root + 'dataSource.xlsx'
    delOldDir(dir_path)    
    count = make100Word(docx_file_path,xlsx_file_path,dir_path)
    print("\n成功生成{0}个word文档,耗时{1:.1f}秒。\n保存路径:{2}".format( \
        count,takeTime(start_time),dir_path))
    #打开保存路径
    os.startfile(dir_path)
    input("按任意键退出……")
    
main()
          

posted @ 2021-05-11 23:06  yxmichael  阅读(73)  评论(0编辑  收藏  举报