假設(shè)某日我開(kāi)了一家空調(diào)公司,暫且就叫他天強(qiáng)空調(diào)安裝設(shè)備公司吧,假裝自己有公司,接了一單大生意,就是給甘肅省的各個(gè)高校安裝空調(diào)(其實(shí)這邊的氣候基本用不到空調(diào),就是假想一下),那么接下來(lái)就是面臨簽訂合同,甘肅省這么多高校就得簽訂幾百份合同,有什么快捷方式呢? 毋庸置疑,我們優(yōu)先使用Python解決這一問(wèn)題,Python可是實(shí)現(xiàn)辦公自動(dòng)化的利器,本節(jié)使用Python批量生成合同,學(xué)會(huì)這個(gè)即可解決重復(fù)錄制合同的問(wèn)題,下面一起學(xué)習(xí)~
Python庫(kù)安裝首先安裝本節(jié)需要使用的兩個(gè)包,openpyxl和docxtpl庫(kù),在代碼行里面使用下方的命令即可安裝完成。 !pip install openpyxl
當(dāng)出現(xiàn)Successfully installed的字樣時(shí),表明安裝成功。 設(shè)置合同模板設(shè)置一個(gè)合同模板,在文檔插入數(shù)據(jù)的地方插入類似于{{ a }}的標(biāo)簽,傳入字典{{ 'a': 1234 }} 就能在標(biāo)簽上渲染出數(shù)據(jù)1234,其他下劃線的設(shè)置原理均類似。 其實(shí)本文使用Python批量生成合同的做法與Word中的郵件合并批量生成合同的做法類似,代碼更加靈活和高效。 導(dǎo)入合同數(shù)據(jù)導(dǎo)入提前錄制好的合同數(shù)據(jù),包括甲方、乙方、產(chǎn)品名稱等字段信息,并且將簽約日期轉(zhuǎn)換為字符型。 import pandas as pdfrom openpyxl.utils.dataframe import dataframe_to_rowsdf = pd.read_excel(r'C:\Users\尚天強(qiáng)\Desktop\各高??照{(diào)合同.xlsx')df['簽約日期'] = df['簽約日期'].apply(lambda x:x.strftime('%Y-%m-%d'))datas = []df 循環(huán)遍歷每一行數(shù)據(jù),并將其存入到一個(gè)字典中,使用append函數(shù)將這些字典合并,打印結(jié)果如下所示。
此外還可以使用openpyxl庫(kù)將合同數(shù)據(jù)導(dǎo)入字典,原理與上面代碼導(dǎo)入的方式一樣。 from openpyxl import load_workbookwb = load_workbook(r'C:\Users\尚天強(qiáng)\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)品價(jià)格': D, '保修期': E, '簽約日期': F} datas.append(data)datas 插入合同數(shù)據(jù)導(dǎo)入docxtpl庫(kù),提前導(dǎo)入之前創(chuàng)建的合同文檔模板,使用render函數(shù)渲染{}中的內(nèi)容,從而達(dá)到批量插入數(shù)據(jù)的目的。
代碼封裝將以上所有的代碼進(jìn)行封裝,一鍵運(yùn)行,即可得到如下生成的docx合同文檔。 import pandas as pdfrom openpyxl.utils.dataframe import dataframe_to_rowsfrom docxtpl import DocxTemplatedf = pd.read_excel(r'C:\Users\尚天強(qiáng)\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)品價(jià)格': row[3], '保修期': row[4], '簽約日期': row[5]} datas.append(data)for data in datas: tpl = DocxTemplate(r'C:\Users\尚天強(qiáng)\Desktop\各高校安裝空調(diào)合同書(shū).docx') tpl.render(data) tpl.save(r'C:\Users\尚天強(qiáng)\Desktop\合同生成\{}的空調(diào)安裝合同.docx'.format(data['甲方'])) print('{}的空調(diào)安裝安裝合同已生成'.format(data['甲方'])) 打開(kāi)任意的一個(gè)合同書(shū),我們看到已經(jīng)在原有的下劃線處插入了合同數(shù)據(jù)。 以上就是作者使用Python寫(xiě)了一個(gè)小腳本,輕松實(shí)現(xiàn)批量生成合同文檔,大家可以親自動(dòng)手實(shí)現(xiàn)一下,解決重復(fù)的手工勞動(dòng),刻不容緩,學(xué)習(xí)Python辦公自動(dòng)化正當(dāng)時(shí)。
|
|