Excel数据自动导入word模板

Excel数据自动导入word模板

1)提取链接
链接:https://pan.baidu.com/s/1WYm8_hfKXVdR6Ffacd2MTg
提取码:601e
2)要是程序运行失败,肯定是过程不对,或者输入错误,未做异常处理,以后有空再说

一、 准备工作

1.1、word模板准备

设置占位符,就是excel数据要填入的位置,注意:

  • 占位符是由两个大括号包裹占位符名称

  • 输入时要设置为英文输入,中文输入法的符号和英文的符号是不一样的

  • 占位符名称使用英文,使用中文可能出现未知错误

img

1.2、Excel数据准备

将excel文件保存为.xls格式,因为新版的.xlsx兼容性不好,程序读取会出问题

img

软件应用场景经常为将数据填入模板后进行打印,有时候打印完成后需要分类。

软件提供功能将生成的文件合并成一个word文件,排序按照Excel的行顺序,因此有需求的可以先将excel排序分类。

1.3、文件夹准备

新建一个文件夹,文件将在此文件夹内生成

二、运行程序

特别注意:

输入的所有地址必须是反斜杆:

直接复制的地址(都是正斜杠):C:\Users\hanyue\Desktop

需要手动改成返斜杆:C:/Users/hanyue/Desktop

2.1、告诉程序word模板信息

img

1)输入word模板地址:

  • 请输入word模板的绝对地址:word文档地址拼接文档名称
  • 例如(注意改成反斜杆):C:/Users/hanyue/Desktop/告知书.docx

2)输入占位符信息:

  • 有多少占位符:有几个写多少
  • 请输入第n占位符:输入占位符名称(顺序不重要)

2.2、告诉程序Excel表格信息

img

1)请输入excel地址(注意检查是不是 .xls文件):

  • 请输入excel地址:excel文档地址拼接文档名称
  • 例如:C:/Users/hanyue/Desktop/personinfo.xls
    • 注意改成反斜杆
    • 格式必须是.xls

2)请输入表名

  • 请输入表名:表名
  • 例如:Sheet1
    • 大小写要正确

3)告诉word文档的占位符对应excel数据第几列

excel列数是字母表示,可以设置为数字,可以直接数,A列就是第1列,B列就是第2列

  • 这里相对于占位符和Excel表格数据建立连接

4)输入开始行数和截止行数

  • 中间的行数的所有数据都会填入
  • 行数直接按照行数显示填入即可

2.3、告诉程序生成文件的信息

img

1)请输入生成文件保存地址:

  • 之前准备工作创建了新文件夹,进入文件夹,获取地址栏信息

2)请输入作为后缀的占位符(不知道选哪个就敲空格)

指生成文件名称的前缀

  • 前缀必须是占位符
  • 有重复的会按数字排序标注

img

要是对应占位符输入错误,或者直接输入空格,还直接按1、2、3、4编号排序

img

3)告诉程序生成的—信息汇总.docx是否要分页

img

2.4、告诉程序是否生成pdf

特别注意:

由于生成模板有打印需求,打印完成后可能需要根据各自信息进行分类,可以事先把Excel进行分类,生成的信息汇总会按Excel顺序排列。

生成的word文件会自动汇总成一个word文件,文件名称为—信息汇总.docx,但是汇总后,格式可能有轻微变化。

生成的pdf文件也会自动汇总成一个PDF文件,文件名称为—信息汇总.pdf,汇总后格式比较完美,不会变化,但是程序运行速度会降低。

1)是否生成PDF(y/n):

输入小写y表示需要生成PDF

三、程序源码

import os
import PyPDF2
from docx import Document
from docxtpl import DocxTemplate
import xlrd
from docxcompose.composer import Composer
from win32com.client import Dispatch

print("============第一步:获取word模板信息============")
wordAddress = input("请输入word模板的绝对地址:")
zwcs = 0
zwnum = input("有多少占位符:")
zwnum = int(zwnum)
zwfs = []
while zwcs < zwnum:
    zwmc = input("请输入第"+ str(zwcs + 1) +"占位符:")
    zwfs.append(zwmc)
    zwcs += 1

print("============第二步:获取excel表格信息============")
xls = input("请输入excel地址:")
biaoming = input("请输入表名:")
xlrd = xlrd.open_workbook(xls)
table = xlrd.sheet_by_name(biaoming)
print("输入占位符和excel对应的行数")
paramzd = dict.fromkeys(zwfs)
for param in zwfs:
    paramzd[param] = int(input(param+"对应第几列:")) - 1
print("要传入数据的行数")
start = input("请输入开始行:")
finish = input("请输入结束行:")
rstart = int(start) - 1
rfinish = int(finish)

print("============第三步:生成文件的信息============")
baocun = input("请输入生成文件保存地址:")
houzui = input("请输入作为后缀的占位符(不知道选哪个就敲空格):")
sffy = input("word信息汇总是否生成分页(y/n):")
mark1 = 0
if sffy == "y":
    mark1 = 1


print("============第四步:是否生成PDF============")
print("生成pdf会导致速度稍慢,但是word信息汇总文件格式可能需要微调")
print("pdf汇总文件不会出现这种问题,需要生成选输入小写y")
sfPdf = input("是否生成PDF(y/n):")
mark = 0
if sfPdf == "y":
    mark = 1

i = rstart
flag = 0
for a in zwfs:
    if a == houzui:
        flag = 1

pianshu = 1

stradd = wordAddress.split("/")
pijie = stradd[len(stradd)-1]
pijiepdfs = pijie.split(".")
pijiepdf = pijiepdfs[0]

if flag == 1:
    houzuis = []

master = Document()
new_doc = Document()

if mark == 1:
    pdfaddress = baocun + "/pdf"
    os.mkdir(r"%s" %pdfaddress)
    wordPdf = Dispatch('Word.Application')
    merger=PyPDF2.PdfFileMerger()
while i < rfinish:
    context = dict.fromkeys(zwfs)
    for param in zwfs:
        context[param] = paramzd[param]

    for key in context:
        context[key] = table.cell_value(i, context[key])

    word = DocxTemplate(r"%s" %wordAddress)

    baocunwenjian = ""
    word.render(context)
    if flag == 0:
        baocunwenjian = baocun + "/" + "" + str(pianshu) + "-" + pijie
        word.save(baocunwenjian)
        i += 1
        if pianshu == 1:
            master = Document(baocunwenjian)
            if mark1 == 1:
                master.add_page_break()
            new_doc = Composer(master)
        else:
            next_doc = Document(baocunwenjian)
            if mark1 == 1:
                next_doc.add_page_break()
            new_doc.append(next_doc)
        if mark == 1:
            doc = wordPdf.Documents.Open(baocunwenjian)
            doc.SaveAs(pdfaddress + "/" + "" + str(pianshu) + "-" + pijiepdf + ".pdf", FileFormat=17)
            doc.Close()
            merger.append(PyPDF2.PdfFileReader(pdfaddress + "/" + "" + str(pianshu) + "-" + pijiepdf + ".pdf"))
    if flag == 1:
        if not context[houzui] in houzuis:
            houzuis.append(context[houzui])
        else:
            geshu = 1
            while True:
                guodu = context[houzui]
                guodu += str(geshu)
                if not guodu in houzuis:
                    context[houzui] = guodu
                    houzuis.append(context[houzui])
                    break
                else:
                    geshu += 1
        baocunwenjian = baocun + "/" + "" + context[houzui] + "-" + pijie
        word.save(baocunwenjian)
        i += 1
        if pianshu == 1:
            master = Document(baocunwenjian)
            if mark1 == 1:
                master.add_page_break()
            new_doc = Composer(master)
        else:
            next_doc = Document(baocunwenjian)
            if mark1 == 1:
                next_doc.add_page_break()
            new_doc.append(next_doc)
        if mark == 1:
            doc = wordPdf.Documents.Open(baocunwenjian)
            doc.SaveAs(pdfaddress + "/" + "" + context[houzui] + "-" + pijiepdf + ".pdf", FileFormat=17)
            doc.Close()
            merger.append(PyPDF2.PdfFileReader(pdfaddress + "/" + "" + context[houzui] + "-" + pijiepdf + ".pdf"))
    print("第几份文件:" + str(pianshu))
    pianshu += 1
new_doc.save(baocun + "/信息汇总.docx")
xlrd.release_resources()
if mark == 1:
    merger.write(pdfaddress + "/信息汇总.pdf")
    merger.close()
posted @ 2022-09-02 21:56  打盹的闲鱼  阅读(2439)  评论(3编辑  收藏  举报