Python将Excel数据自动填写到Word
需求
- 需求:批量制作劳动合同表,要从excel表格中将每个人的数据导入到docx劳动合同中,重复量很大,因此可以使用python高效解决
- 渲染:为了让模板内容不变动,这里使用了类似jinja2的渲染引擎,使用{{ }}插值表达式把数据插入进去。也可以使用{% %}循环,条件语法等。
- 模板
- 合同docx模板(在需要插值的位置填充 {{}} 表达式)
- 人员数据xlsx模板
实现
- 模板准备
合同模板.docx
人员数据模板.xlsx
- 库的引入
#操作xl表格的库
pip install docxtpl
#操作docx文档的库
pip install openpyxl
- 代码:ContractFillTest.py
from docxtpl import DocxTemplate
from openpyxl import load_workbook
import os
def replace(obj):
if obj is None:
obj = ''
return obj
wb = load_workbook("./人员数据模板.xlsx")
ws = wb['Sheet1']
contexts = []
for row in range(2, ws.max_row + 1):
name = ws["A" + str(row)].value
profession = ws["B" + str(row)].value
address = ws["C" + str(row)].value
address = replace(address)
sex = ws["D" + str(row)].value
nation = ws["E" + str(row)].value
politics_status = ws["F" + str(row)].value
native_place = ws["G" + str(row)].value
idcard = ws["H" + str(row)].value
telphone = ws["I" + str(row)].value
context = {"name": name, "profession": profession, "address": address, "sex": sex, "nation": nation,
"politics_status": politics_status, "native_place": native_place, "idcard": idcard, "telphone": telphone}
contexts.append(context)
contexts
os.mkdir("./所有合同")
for context in contexts:
print(context)
tpl = DocxTemplate('./合同模板.docx')
tpl.render(context)
tpl.save("./所有合同/{}的劳动合同.docx".format(context["name"]))
3.效果
py文件打包成exe程序
- 说明:打包成exe文件的好处
- exe文件对于很多小白来说直接鼠标点击运行即可(不用装python环境)
- 下载pyinstaller
# 方式1:cmd命令行
pip install pyinstaller
#方式2:或者采用更新、升级的方法
pip install --upgrade pyinstaller
# 方式3:
# 上面两种都失败的情况,即网络条件不好的情况,只能手动下载PyInstaller-3.6.tar.gz ,之后手动初始化
下载地址:https://pypi.org/project/PyInstaller/#files
# 初始化
将PyInstaller-3.6.tar.gz放到Python安装目录下并解压,
cd ./PyInstaller-3.6
python setup.py install
并按下回车键,会看到代码迅速执行,会进行安装pyinstaller,显示如下状态,
看到“Finished processing dependencies for PyInstaller==3.3.dev0+41c426f6d”,即安装成功:
- 使用pyinstaller打包py文件成exe程序
- 打包步骤
# 创建一个ContractFillTest目录
mkdir ContractFillTest
# 进入目录
cd ContractFillTest
# 将ContractFillTest.py放进去
#打包
pyinstaller -F ContractFillTest.py
# 显示Building EXE from EXE-00.toc completed successfull即为成功
-
pyinstaller更多参数:
-F, –onefile 打包一个单个文件,如果你的代码都写在一个.py文件的话,可以用这个,如果是多个.py文件就别用
-D, –onedir 打包多个文件,在dist中生成很多依赖文件,适合以框架形式编写工具代码,我个人比较推荐这样,代码易于维护
-K, –tk 在部署时包含 TCL/TK
-a, –ascii 不包含编码.在支持Unicode的python版本上默认包含所有的编码.
-d, –debug 产生debug版本的可执行文件
-w,–windowed,–noconsole 使用Windows子系统执行.当程序启动的时候不会打开命令行(只对Windows有效)
-c,–nowindowed,–console
使用控制台子系统执行(默认)(只对Windows有效) -
打包结构
-
打包结构1
-
进入dist可以看到ContractFillTest.exe文件(有点大10多M) ,再把合同模板.docx和人员数据模板…xlsx拷贝进来,点击执行
-
执行结果(所有合同目录下)