Python批量处理Excel文件信息替换Word模板

  • 原由和思路
  • 工具准备
  • 1. 前期处理
    • 1.1 数据处理
    • 1.2 模板处理
  • 2. 编写代码
    • 2.1 使用Pycharm新建项目ExcelToWord
    • 2.2 新建ETW.py主程序文件并安装相应库
    • 2.3 主要代码块解析
  • 3. 打包程序
  • 心得体会

原由和思路

经常上级会下发一些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库获取文件绝对路径
import tkinter.messagebox #tkinter-python内部GUI库弹出消息库
import csv #数据CSV格式处理库
from docxtpl import DocxTemplate #Word模板替换库

先介绍一下docxtpl Word模板替换 最简单的使用方法:

tpl = DocxTemplate('leave_temp.docx')
#括号后是相对路径,我们采取选取绝对路径方式
# 需要替换内容以key:value的方式进行更换
context = {'who': '程旭阳'
}tpl.render(context)
#渲染替换
tpl.save('leave.docx')
#另存为

本文中需要替换的是 No Name Age Id Addr
我们这里考虑,以迭代的方式一个文件一个文件生成,context字典的键我们人工输入,这样有一个好处就是不需要处理多余的数据源数据,可以指定内容替换。那么久需要获取输入框的内容,也就是tkinter->entry组件,我们先建立一个Entry()组件和Button()按钮完成,输入需要更换N个变量,点击确定按钮后会更新出N个输入框来供我们填写。

#创建新的输入栏,输入变量名称
def newentry():for i in range(int(replacenumber.get())):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)#

replacenumber.get()会获取输入框内输入了几个需要替换的变量,之后生成。
其中entry_x是传递变量名称的函数,然后储存到列表 entries中去
e.g. 如果是5,那么会创造5个变量,分别是
entry_0、entry_1、entry_2、entry_3、entry_4

Entry()和其他的组件的用法请参看https://www.jianshu.com/p/c9fb28367015
【由于tkinter没有自适应布局,只好选绝对布局的方式,摆放各个部件,这里只允许创建最多60个输入框,你也可以更改】

替换的程序主要内容:

def load():filepath = filedialog.askopenfilename()    #获取数据源文件绝对地址with open(filepath,'r',encoding='gbk') as f:reader = csv.DictReader(f,dialect='excel')  #获取数据源内容#使用csv不用pandas的原因是含pandas库打包exe程序出错#遍历每一行将数据替换给新的Wordfor row in reader:                       #创建完整替换context字典,利用原先的列表for entry in entries:context[entry.get()] = row[entry.get()]#写好输出文件夹的路径,且以 Name 一列命名,也可以使用其他的命名outputpath = 'output/'+row['Name']+'.docx'    # 替换模板,地址为获取的模板绝对地址,docxpath是一储存绝对路径信息labeltpl = DocxTemplate(docxpath['text'])tpl.render(context)tpl.save(outputpath)tkinter.messagebox.showinfo('成功', '已替换所有模板!')#完成后弹窗提示

最后就是GUI tkinter布局的问题了,难度不大,大家稍微看了上面的链接就懂布局了。
最后我粘贴一下全部代码,解释内容较少

from tkinter import *
from tkinter import filedialog
import tkinter.messagebox
import csv
from docxtpl import DocxTemplate#选取模板
def seltpl():tplpath = filedialog.askopenfilename()label['text'] = '4.已选择模板,请选择数据源CSV'docxpath['text'] = tplpath#读取CVS文件绝对路径后保存数据到df中
def load():filepath = filedialog.askopenfilename()with open(filepath,'r',encoding='gbk') as f:reader = csv.DictReader(f,dialect='excel')for row in reader:#创建完整替换context字典for entry in entries:context[entry.get()] = row[entry.get()]outputpath = 'output/'+row['Name']+'.docx'# 替换模板tpl = DocxTemplate(docxpath['text'])tpl.render(context)tpl.save(outputpath)tkinter.messagebox.showinfo('成功', '已替换所有模板!')#创建新的输入栏,输入变量名称
def newentry():for i in range(int(replacenumber.get())):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)#主窗口top实例化
top = Tk()
top.geometry("400x600")
top.title("使用前必须阅读说明书")
context = {}
entries = []#frm1
frm1 = Frame()
frm1.pack(side=TOP)
label2 = Label(frm1, text='1.请输入需要替换几个变量', font=("黑体", 20), wraplength=400, justify="left", anchor="nw")
label2.pack(side=TOP, expand=YES, fill=X)
#frm11\frm12
frm11 = Frame(frm1)
frm11.pack()
replacenumber = Entry(frm11)
replacenumber.pack(side=LEFT, fill=X, expand=YES)
Button(frm11, text='确定', command=newentry).pack(side=LEFT, fill=X, expand=YES)#frm2
frm2 = Frame()
frm2.pack(side=TOP)
label3 = Label(frm2, text='2.请将变量名称填写在下列输入框框内', font=("黑体", 16), wraplength=400, justify="left", anchor="nw")
label3.pack(side=TOP, expand=YES, fill=X)
frm21 = Frame(frm2)
frm21.pack(side=LEFT)
frm22 = Frame(frm2)
frm22.pack(side=LEFT)
frm23 = Frame(frm2)
frm23.pack(side=LEFT)
frm3 = Frame()
frm3.pack(side=BOTTOM)#储存模板位置标签栏(不显示)
docxpath =  Label(top, text='', bg="pink", font=("黑体", 20), wraplength=1, justify="left", anchor="nw")#frm3提示信息标签栏
label = Label(frm3, text='3.请先选择需要替换的DOCX模板', font=("黑体", 20), wraplength=400, justify="left", anchor="nw")
label.pack(side=TOP)
Button(frm3, text='3.选择模板', command=seltpl).pack(side=LEFT, fill=X, expand=YES)
Button(frm3, text='4.选择数据源并开始替换', command=load).pack(side=LEFT, fill=X, expand=YES)#启动程序
top.mainloop()

3. 打包程序

在Pycharm 的终端Terminal 输入
pyinstaller -F -w ETK.py


完成打包exe文件,输出到项目地址dist文件夹中,此时人工添加output文件夹(没来及做,有时间的可以自己代码生成)
打开ETK.exe文件
输入变量5个,确定后输入变量名称,注意一定要写正确

点击选择模板,选择好模板文件 .docx,然后点击选择数据源CSV,之后就会弹窗说替换完成,我们可以去output文件夹下面去看一下。

确实生成了新的文件,打开其中一个。

已完成替换。

心得体会

  1. pyinstaller打包pandas 和 numpy时候都有点问题,我还没解决,网上有人解决了,我这里还是用了旧一点的 csv库。
  2. GUI界面美化没有做,网上很多好看的GUI用的Qt,我这边因为功能比较简单就没有美化,主要还是分享和记录第一次发博客。
  3. 很多地方还可以优化,希望大家能多多提意见,共同进步。

Excel信息批量替换Word模板生成新文件相关推荐

  1. Python通过word模板生成新的word文件

    功能自定义好的word文档,生成新的word文件 模块地址:https://docxtpl.readthedocs.io/en/latest/ 使用模块 docxtpl 安装方式 在线安装 pip i ...

  2. 根据word模板生成pdf文件

    1.首先建一个word,插入一个表格,需要填充的值用${parame}代替 (注意:这里的参数要和java实体类里面的参数对应起来,代码放在下面) 2.制作完成后另存为xml格式 3.然后用文本编辑工 ...

  3. Java-POI替换Word模板文档中的变量,生成Word文档

    第一步:在项目中导入POI的jar包,以及相关的jar包. 所需的jar包列表: 下载地址:http://download.csdn.net/download/qq_34908167/10046670 ...

  4. 使用word模板生成word文档的各类方案

    使用word模板生成word文档的各类方案 生成word的各种方案 word另存xml进行后续处理 2003版本word(.doc)的xml处理并生成word 2007版本word(.docx)的xm ...

  5. 使用java Apache poi 根据word模板生成word报表

    使用java Apache poi 根据word模板生成word报表 使用poi读取word模板,替换word中的{text}标签,并根据自定义标签循环生成表格或表格中的行. 代码示例下载:https ...

  6. POI 3.9根据word模板生成报表

    XWPFDocument对象 POI是apache提供的可以操作word文档的第三方jar.POI能操作word是使用XWPFDocument对象. XWPFDocument对象可以解析docx文件, ...

  7. 使用POI根据合同定义模板生成新的模板并且填充数据(包括图片)

    word文档中,需要填充数据的地方统一使用变量的形式,格式如下:${变量名}. 注意:变量"${变量名}"建议先在记事本中写好,再粘贴到"XXX合同.docx" ...

  8. 根据word模板生成word和PDF

    根据word模板生成word和PDF 需求:有一个固定的合同模板,在vue前台填写指定的信息,替换合同模板指定的内容 我们使用的默认模板内容如图: 我们在前端填写的字段就是合同名称.项目名称和项目金额 ...

  9. java word模板替换多行_Java动态替换word模板的最佳实践

    poi-tl 基于word的模板渲染(替换)组件 对docx格式的文档增加模板语法,增加渲染模板的方便性,目前支持对段落.页眉.页脚.表格的文本.图片.表单渲染. 对于word模板替换,我们不仅要考虑 ...

最新文章

  1. 2021年大数据基础(三):​​​​​​​​​​​​​​​​​​​​​大数据应用场景
  2. ASP.NET MVC4中调用WEB API的四个方法
  3. MySQL主从服务器配置工作原理
  4. java输入输出实验报告_JAVA实验报告(河北工业大学)
  5. win7怎么运行linux,win7系统运行linux shell脚本的操作方法
  6. 多种思路给js文件传递参数
  7. nginx cache 配置
  8. MySQL优化调优有没有做过_MySQL 调优/优化的 100 个建议
  9. 12款Javascript表格控件(DataGrid)
  10. 分类:基于规则的分类技术
  11. ACM程序设计大赛简介
  12. 伴着代码,那个女孩儿慢慢长大
  13. 【java】英语单词对战小游戏
  14. pycharm preparing workspace 项目打不开怎么办?
  15. 解决警告:Unable to preventDefault inside passive event listener due to target being treated as passive.
  16. 用 Python 实现 RSI 指标线与股价的顶背离、底背离
  17. Raspberry PI 编译WLan驱动模块, 并配置登录WIFI
  18. 一个用于制作Windows指针inf安装文件的小工具。
  19. 数据结构学习记录——哈夫曼树(什么是哈夫曼树、哈夫曼树的定义、哈夫曼树的构造、哈夫曼树的特点、哈夫曼编码)
  20. 质数分解matlab程序

热门文章

  1. 目前巨型计算机应用最主要的领域是,A.10%-15%.
  2. ftp工具破解版,你知道有哪几款好用的ftp工具破解版吗
  3. 产品分析报告—年轻人的体育社区—虎扑
  4. Ceph添加OSD节点
  5. 【python基础知识学习(6)】面向对象编程
  6. Eclipes安装plugin插件
  7. 链接无线路由器后局域网无法连接服务器,局域网部分电脑连接路由器(交换机)后无法上网该怎么解决?...
  8. 学习编程,以“上帝视角”创造和改变这个世界
  9. win10 eclipse适配笔记本4K屏幕
  10. HTML5 中 40 个最重要的技术点