假設(shè)某日我開了一家空調(diào)公司,暫且就叫他天強空調(diào)安裝設(shè)備公司吧,假裝自己有公司,接了一單大生意,就是給甘肅省的各個高校安裝空調(diào)(其實這邊的氣候基本用不到空調(diào),就是假想一下),那么接下來就是面臨簽訂合同,甘肅省這么多高校就得簽訂幾百份合同,有什么快捷方式呢?
毋庸置疑,我們優(yōu)先使用Python/ target=_blank class=infotextkey>Python解決這一問題,Python可是實現(xiàn)辦公自動化的利器,本節(jié)使用Python批量生成合同,學會這個即可解決重復(fù)錄制合同的問題,下面一起學習~
示例工具:anconda3.7
本文講解內(nèi)容:openpyxl、docxtpl庫的使用
適用范圍:Python批量生成合同
Python庫安裝
首先安裝本節(jié)需要使用的兩個包,openpyxl和docxtpl庫,在代碼行里面使用下方的命令即可安裝完成。
!pip install openpyxl
!pip install docxtpl
當出現(xiàn)Successfully installed的字樣時,表明安裝成功。
設(shè)置合同模板
設(shè)置一個合同模板,在文檔插入數(shù)據(jù)的地方插入類似于{{ a }}的標簽,傳入字典{{ "a": 1234 }} 就能在標簽上渲染出數(shù)據(jù)1234,其他下劃線的設(shè)置原理均類似。
其實本文使用Python批量生成合同的做法與word中的郵件合并批量生成合同的做法類似,代碼更加靈活和高效。
導入合同數(shù)據(jù)
導入提前錄制好的合同數(shù)據(jù),包括甲方、乙方、產(chǎn)品名稱等字段信息,并且將簽約日期轉(zhuǎn)換為字符型。
import pandas as pd
from openpyxl.utils.dataframe import dataframe_to_rows
df = pd.read_Excel(r'C:Users尚天強Desktop各高??照{(diào)合同.xlsx')
df["簽約日期"] = df["簽約日期"].Apply(lambda x:x.strftime("%Y-%m-%d"))
datas = []
df
循環(huán)遍歷每一行數(shù)據(jù),并將其存入到一個字典中,使用append函數(shù)將這些字典合并,打印結(jié)果如下所示。
for row in dataframe_to_rows(df,index=False,header=False):
data = {"甲方": row[0],
"乙方": row[1],
"產(chǎn)品名稱": row[2],
"產(chǎn)品價格": row[3],
"保修期": row[4],
"簽約日期": row[5]}
datas.append(data)
datas
此外還可以使用openpyxl庫將合同數(shù)據(jù)導入字典,原理與上面代碼導入的方式一樣。
from openpyxl import load_workbook
wb = load_workbook(r'C:Users尚天強Desktop各高??照{(diào)合同.xlsx')
ws = wb['Sheet1']
datas = []
for row in range(2, ws.max_row):
A = ws[f"A{row}"].value
B = ws[f"B{row}"].value
C = ws[f"C{row}"].value
D = ws[f"D{row}"].value
E = ws[f"E{row}"].value
F = ws[f"F{row}"].value
F = F.strftime("%Y-%m-%d")
data = {"甲方": A,
"乙方": B,
"產(chǎn)品名稱": C,
"產(chǎn)品價格": D,
"保修期": E,
"簽約日期": F}
datas.append(data)
datas
插入合同數(shù)據(jù)
導入docxtpl庫,提前導入之前創(chuàng)建的合同文檔模板,使用render函數(shù)渲染{}中的內(nèi)容,從而達到批量插入數(shù)據(jù)的目的。
from docxtpl import DocxTemplate
for data in datas:
tpl = DocxTemplate(r'C:Users尚天強Desktop各高校安裝空調(diào)合同書.docx')
tpl.render(data)
tpl.save(r'C:Users尚天強Desktop合同生成{}的空調(diào)安裝合同.docx'.format(data['甲方']))
print('{}的空調(diào)安裝合同......已生成'.format(data['甲方']))
代碼封裝
將以上所有的代碼進行封裝,一鍵運行,即可得到如下生成的docx合同文檔。
import pandas as pd
from openpyxl.utils.dataframe import dataframe_to_rows
from docxtpl import DocxTemplate
df = pd.read_excel(r'C:Users尚天強Desktop各高??照{(diào)合同.xlsx')
df["簽約日期"] = df["簽約日期"].apply(lambda x:x.strftime("%Y-%m-%d"))
datas = []
for row in dataframe_to_rows(df,index=False,header=False):
data = {"甲方": row[0],
"乙方": row[1],
"產(chǎn)品名稱": row[2],
"產(chǎn)品價格": row[3],
"保修期": row[4],
"簽約日期": row[5]}
datas.append(data)
for data in datas:
tpl = DocxTemplate(r'C:Users尚天強Desktop各高校安裝空調(diào)合同書.docx')
tpl.render(data)
tpl.save(r'C:Users尚天強Desktop合同生成{}的空調(diào)安裝合同.docx'.format(data['甲方']))
print('{}的空調(diào)安裝安裝合同已生成'.format(data['甲方']))
打開任意的一個合同書,我們看到已經(jīng)在原有的下劃線處插入了合同數(shù)據(jù)。
以上就是作者使用Python寫了一個小腳本,輕松實現(xiàn)批量生成合同文檔,大家可以親自動手實現(xiàn)一下,解決重復(fù)的手工勞動,刻不容緩,學習Python辦公自動化正當時。
三年互聯(lián)網(wǎng)數(shù)據(jù)分析經(jīng)驗,擅長Excel、SQL、Python、PowerBI數(shù)據(jù)處理工具,數(shù)據(jù)可視化、商業(yè)數(shù)據(jù)分析技能,統(tǒng)計學、機器學習知識,持續(xù)創(chuàng)作數(shù)據(jù)分析內(nèi)容,點贊關(guān)注,不迷路。