Excel信息批量替换Word模板⽣成新⽂件
Python批量处理Excel⽂件信息替换Word模板
原由和思路
经常上级会下发⼀些word表格让我们基层填写,涉及⼈数较多,表格下发给个⼈之后,格式啊字体啊⼤⼩啊都不统⼀,每次还得重复校对,我就想能不能创建⼀个⼤型Excel数据库完成平时信息采集和更新,⼀次性导⼊下发的word表格中,并⽣成新的⽂件。
使⽤Excel的原因主要是维护⽅便,并不是所有⼈都懂数据库操作,并且制作较为⿇烦,尤其是遇到新加字段的时候,⼯作量⼤,不如就使⽤Excel存储数据,维护简单,更新及时。
现在就再想,我码个程序,输⼊我需要变更的数据列名,替换掉Word模板当中的相应内容,并另存为以名称命名的新⽂件。但由于数据格式多,所以要求EXCEL处理的时候全部都是⽂本格式,这样不容易出错,如果转换为.csv格式会更加简洁。
⼯具准备
Python 3.7 (32bit)
Pycharm
Windows7 (64bit)
Office 2010
1. 前期处理
1.1 数据处理
先看⼀下我的数据:
第⼀步,将Excel所有单元格设置为⽂本后,检查容易出错的⼏个类型,⽇期,数字,⾦额等;
第⼆步,将第⼀⾏全部改为英⽂描述,利于后期Python编译查速度,及时不需要的也最好⼀次性都编译好,以免后期需要再重复⼯作;第三步,另存为 csv 格式⽂件,⼀定选逗号分隔的,如图:
1.2 模板处理
模板处理使⽤的是 jinja2 标签 {{xxx}}的替换模式,将所需要的替换的位置⽤数据的列名称替换,如图:
这⾥替换标签⾥⾯的内容⼀定要和数据源的⼀致,并且和后⾯程序中的⼀致。
2. 编写代码
编写前先给⼤家看⼀下最后的程序样式,以便有个宏观印象。
2.1 使⽤Pycharm新建项⽬ExcelToWord
使⽤32位Python的原因是兼容性,64位的Python打包的程序只能64位系统使⽤,32位的Python打包的程序可以在32位、64位系统上使⽤。
2.2 新建ETW.py主程序⽂件并安装相应库
本程序⼀共需要额外安装3个库
pywin32(32位系统打包程序必须装)
pyinstaller(打包程序)
docxtpl(模板替换)
打开Pycharm的File->Settings
点击加号,依次添加3个额外库。
2.3 主要代码块解析
引⽤头:
from tkinter import * #tkinter-python内部GUI库
from tkinter import filedialog #tkinter-python内部GUI库获取⽂件绝对路径ssagebox #tkinter-python内部GUI库弹出消息库import csv #数据CSV格式处理库
from docxtpl import DocxTemplate #Word模板替换库
先介绍⼀下docxtpl Word模板替换 最简单的使⽤⽅法:
tpl = DocxTemplate('leave_temp.docx')
#括号后是相对路径,我们采取选取绝对路径⽅式
# 需要替换内容以key:value的⽅式进⾏更换
context = {
'who': '程旭阳'
}
#渲染替换
tpl.save('leave.docx')
#另存为
本⽂中需要替换的是 No Name Age Id Addr
我们这⾥考虑,以迭代的⽅式⼀个⽂件⼀个⽂件⽣成,context字典的键我们⼈⼯输⼊,这样有⼀个好处就是不需要处理多余的数据源数据,可以指定内容替换。那么久需要获取输⼊框的内容,也就是tkinter->entry组件,我们先建⽴⼀个Entry()组件和Button()按钮完成,输⼊需要更换N个变量,点击确定按钮后会更新出N个输⼊框来供我们填写。
#创建新的输⼊栏,输⼊变量名称
def newentry():
for i in range(())):
entry_x = 'entry_' + str(i)#构造变量名称
entries.append(entry_x)#储存到变量列表中⽅便查询
if i<20 :
entries[i] = Entry(frm21, width=18)
entries[i].pack(side=TOP, expand=True, fill=X)
elif i<40:
entries[i] = Entry(frm22, width=18)
entries[i].pack(side=TOP, expand=True, fill=X)
else:
entries[i] = Entry(frm23, width=18)
entries[i].pack(side=TOP, expand=True, fill=X)
#
<()会获取输⼊框内输⼊了⼏个需要替换的变量,之后⽣成。
其中entry_x是传递变量名称的函数,然后储存到列表 entries中去
< 如果是5,那么会创造5个变量,分别是
python怎么读取excel文件数据entry_0、entry_1、entry_2、entry_3、entry_4
替换的程序主要内容:
def load():
filepath = filedialog.askopenfilename() #获取数据源⽂件绝对地址
with open(filepath,'r',encoding='gbk') as f:
reader = csv.DictReader(f,dialect='excel') #获取数据源内容
#使⽤csv不⽤pandas的原因是含pandas库打包exe程序出错
#遍历每⼀⾏将数据替换给新的Word
for row in reader:
#创建完整替换context字典,利⽤原先的列表
for entry in entries:
()] = ()]
#写好输出⽂件夹的路径,且以 Name ⼀列命名,也可以使⽤其他的命名
outputpath = 'output/'+row['Name']+'.docx'
# 替换模板,地址为获取的模板绝对地址,docxpath是⼀储存绝对路径信息label
tpl = DocxTemplate(docxpath['text'])
tpl.save(outputpath)
#完成后弹窗提⽰
最后就是GUI tkinter布局的问题了,难度不⼤,⼤家稍微看了上⾯的链接就懂布局了。
最后我粘贴⼀下全部代码,解释内容较少
from tkinter import *
from tkinter import filedialog
ssagebox
import csv
from docxtpl import DocxTemplate
#选取模板
def seltpl():
tplpath = filedialog.askopenfilename()
label['text'] = '4.已选择模板,请选择数据源CSV'
docxpath['text'] = tplpath
#读取CVS⽂件绝对路径后保存数据到df中
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论