python批量生成合同

對于批量操作合同文件,逐個去比對替換文件,復(fù)制粘貼是個很費(fèi)勁的事,于是乎有了python自動化批量操作的這種神器.

工具原料:

  • openpyxl模塊--用于操作excel文檔
  • python-docx模塊--用于操作word文檔
  • python3.9
  • office2007或更高版本

模塊安裝:

pip install openpyxl
pip install python-docx

模板文件及效果展示:

word模板
excel模板

最終效果圖

實(shí)現(xiàn)步驟解析:

  1. word中設(shè)置替換關(guān)鍵字
    首先得在word中指定需要替換的某些關(guān)鍵字,并加以特殊標(biāo)注,如''【合同編號】'',加上括號以便程序識別和區(qū)分

  2. excel中設(shè)置表頭與word中的關(guān)鍵字一一對應(yīng)
    excel中必須設(shè)置與合同文檔相對應(yīng)的需要替換的列表名,且必須帶上相同的括號如''【合同編號】'',否則替換時會造成麻煩

  3. 用python-docx讀取word內(nèi)容,此處輸出的格式比較錯亂,但不影響最終效果

from docx import Document
doc = Document('合同模板.docx')  # 打開模板文檔,文檔與源碼處于同一目錄下
for para in doc.paragraphs:#paragraphs為文檔段落集合,此處遍文檔每個段落對象
    for run in para.runs: #runs為一段連續(xù)的文本,遍歷所有連續(xù)的文本對象
        print(run.text) #text為閏對象的屬性,輸出對象中的文本
  1. 讀取excel中的對應(yīng)值
wb = load_workbook('合同信息.xlsx')  # 打開填充內(nèi)容的工作簿
ws = wb.active  # 激活工作表

for row in range(2, ws.max_row + 1):  # 2-->跳過標(biāo)題行,ws.max_row+1包含到最后一行
    doc = Document('合同模板.docx')  # 打開模板文檔
    for col in range(1, ws.max_column + 1):  # 遍歷列數(shù)據(jù),同理最大值+1
        old_info = str(ws.cell(row=1, column=col).value)  # 讀取列標(biāo)題
        new_info = str(ws.cell(row=row, column=col).value)  # 讀取表格中的數(shù)據(jù)
        info_update(doc, old_info, new_info)  # 調(diào)用替換函數(shù)替換值
    com_name = str(ws.cell(row=row, column=2).value)  # 取出公司名稱用于文件命名
    doc.save(f'{com_name}合同.docx')  # 用新名稱存檔

.

  1. 替換word中的關(guān)鍵字
# 讀取和替換文本
def info_update(doc, old_info, new_info):#doc,模板文件,old_info,word中的關(guān)鍵字,new_info,excel中要替換的內(nèi)容
    for para in doc.paragraphs:  
        for run in para.runs:  
            run.text = run.text.replace(old_info, new_info)#使用replace函數(shù)完成兩者的替換

完整源碼:

#!/usr/bin/env python
# coding=utf-8

'''
批量生成word合同
注意:excel表的表頭必須和word中的替換標(biāo)記字符一致
'''

from openpyxl import load_workbook
from docx import Document


# 讀取和替換文本
def info_update(doc, old_info, new_info):
    for para in doc.paragraphs:  # paragraphs為文檔段落集合,paragraph代表一個段落
        for run in para.runs:  # run為具有相同樣式的一段連續(xù)文本,runs為run的集合
            run.text = run.text.replace(old_info, new_info)
    # 以下代碼適用表格類型的替換
    for table in doc.tables:
        for row in table.rows:
            for cell in row.cells:
                cell.text = cell.text.replace(old_info, new_info)


wb = load_workbook('合同信息.xlsx')  # 打開填充內(nèi)容的工作簿
ws = wb.active  # 激活工作表

for row in range(2, ws.max_row + 1):  # 2-->跳過標(biāo)題行,ws.max_row+1包含到最后一行
    doc = Document('合同模板.docx')  # 打開模板文檔
    for col in range(1, ws.max_column + 1):  # 遍歷列數(shù)據(jù),同理最大值+1
        old_info = str(ws.cell(row=1, column=col).value)  # 讀取列標(biāo)題
        new_info = str(ws.cell(row=row, column=col).value)  # 讀取表格中的數(shù)據(jù)
        info_update(doc, old_info, new_info)  # 調(diào)用替換函數(shù)替換值
    com_name = str(ws.cell(row=row, column=2).value)  # 取出公司名稱用于文件命名
    doc.save(f'{com_name}合同.docx')  # 用新名稱存檔

源碼已上傳碼云,地址:批量生成合同

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蜕该,更是在濱河造成了極大的恐慌吞获,老刑警劉巖胸蛛,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件藤巢,死亡現(xiàn)場離奇詭異鼠次,居然都是意外死亡慨代,警方通過查閱死者的電腦和手機(jī)邢笙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侍匙,“玉大人氮惯,你說我怎么就攤上這事∠氚担” “怎么了妇汗?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長说莫。 經(jīng)常有香客問我杨箭,道長,這世上最難降的妖魔是什么储狭? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任互婿,我火速辦了婚禮,結(jié)果婚禮上辽狈,老公的妹妹穿的比我還像新娘慈参。我一直安慰自己,他們只是感情好刮萌,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布懂牧。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪僧凤。 梳的紋絲不亂的頭發(fā)上畜侦,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機(jī)與錄音躯保,去河邊找鬼旋膳。 笑死,一個胖子當(dāng)著我的面吹牛途事,可吹牛的內(nèi)容都是我干的验懊。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼尸变,長吁一口氣:“原來是場噩夢啊……” “哼义图!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起召烂,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤碱工,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后奏夫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怕篷,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年酗昼,在試婚紗的時候發(fā)現(xiàn)自己被綠了廊谓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡麻削,死狀恐怖蒸痹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情呛哟,我是刑警寧澤叠荠,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站竖共,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏俺祠。R本人自食惡果不足惜公给,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蜘渣。 院中可真熱鬧淌铐,春花似錦、人聲如沸蔫缸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吐葱,卻和暖如春街望,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背弟跑。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工灾前, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人孟辑。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓哎甲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親饲嗽。 傳聞我的和親對象是個殘疾皇子炭玫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容