免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
實(shí)例7:用Python操作Word批量生成合同

我們?cè)趯?shí)例5中演示了如何用Python批量生成word版邀請(qǐng)函。我們是簡(jiǎn)單粗暴地找到需要填寫受邀者信息所在位置(即run),然后將這個(gè)run直接替換成受邀者的公司名及姓名。因?yàn)橹挥幸惶幮枰鎿Q,所以這個(gè)方法行得通,但遇到合同,一般有十來(lái)處需要修改,如果也逐個(gè)去找其位置所在的run,那就反而會(huì)降低我們的工作效率,背離辦公自動(dòng)化的初衷了。實(shí)例5可以作為入門python-docx模塊的練手項(xiàng)目。


對(duì)于合同的批量處理,我們將使用更聰明的辦法。我們的思路是,先建立一個(gè)word模板,在合同里面需要變動(dòng)信息的地方用“【....】”來(lái)代替,比如“【合同編號(hào)】”等。然后再建一個(gè)Excel文檔,將“【合同編號(hào)】”等信息作為標(biāo)題,將不同的合同信息放入這個(gè)Excel的每一行。然后用python-docx去讀取word模板中的所有內(nèi)容,凡是遇到“【....】”的字符,就用Excel中的對(duì)應(yīng)標(biāo)題下的信息去進(jìn)行替換。Excel中從第二行開始每一行代表一個(gè)合同內(nèi)需要填入的信息。


我們建立的模板和合同信息如下圖所示: 

這里有幾個(gè)注意事項(xiàng):

  1. Excel文檔中數(shù)字需要改成文本格式,不然像合同編號(hào)20190401在寫入到word時(shí)會(huì)變成20190401.0。至于怎么轉(zhuǎn)格式,請(qǐng)參考度娘:jingyan.baidu.com/artic

  2. Excel中的公式需要去除,不然填到word中的信息是公式,而不是值。

  3. Word模板中的“【....】”和Excel中的標(biāo)題必須一一對(duì)應(yīng),且必須是全中文或全英文字符,因?yàn)?code>python-docx會(huì)將中英混合的內(nèi)容視為兩個(gè)及以上的格式(run),導(dǎo)致在替換的時(shí)候無(wú)法正確識(shí)別。

  4. Word模板做好后,要用python-docx讀取一下,看看“【....】”是不是一個(gè)獨(dú)立的run,若不是,則需要從Excel標(biāo)題欄中重新復(fù)制,覆蓋word模板中的“【....】”信息,已保證這一串字符是一個(gè)run。

import docx #導(dǎo)入docx庫(kù)
doc = Document('data/合同模板.docx') #打開word文件
for para in doc.paragraphs: #讀取word中的每個(gè)段落
for run in para.runs: #讀取每個(gè)段落中的不同格式(run)
print(run.text)
>>
合同編號(hào):
【合同編號(hào)】

【貨物名稱】
采購(gòu)
合同
甲方

【采購(gòu)方】

乙方
-------省略----------

通過以上程序,我們打印顯示了合同里面的所有的格式(其中每一行代表一個(gè)格式(run))對(duì)應(yīng)的文本(text),我們可以看到“【....】”都是在一行里面的,這樣就沒問題。由于word版合同里還有一些是在表格里面的,通過doc.paragraphs是無(wú)法抓取出來(lái)的,此時(shí)需要用doc.tables,表格(tables)里面又包含行(rows),行還包含單元格(cell),所以需要讀取所有的表格,然后讀取所有的行,再讀取單元格,并打印顯示出來(lái)??梢?“【....】” 也是在一行里面的,這樣可保證后續(xù)替換時(shí)可查找到,不會(huì)導(dǎo)致遺漏。

for table in doc.tables:
for row in table.rows:
for cell in row.cells:
print(cell.text)
>>
甲方(蓋章):【采購(gòu)方】

法人代表:
或委托代理人:

開戶行: 【開戶行】
號(hào):【賬號(hào)】
聯(lián)系人:【聯(lián)系人】
話:【電話】
所:【住所】

乙方(蓋章):ABC商貿(mào)有限公司

法人代表:
或委托代理人:

開戶行:中國(guó)建設(shè)銀行
號(hào):989898989898
聯(lián)系人:張三豐
話:999-99999
所: 桃花源

Word模板做好后,“【....】”內(nèi)的信息就不可隨意變動(dòng)了,即便我們將“【合同編號(hào)】”里面的“遍”字刪掉重新輸入,結(jié)果還是“【合同編號(hào)】”,但此時(shí)“【合同編號(hào)】”已經(jīng)不是一個(gè)格式了,會(huì)變成2個(gè)格式。如下示例顯示了這個(gè)結(jié)果,“【合同編號(hào)】”已經(jīng)不在同一行了。所以這個(gè)格式非常小氣,不可輕易得罪啊!此時(shí)需要重新去Excel標(biāo)題欄復(fù)制【合同編號(hào)】,再粘貼過去,保存,即可恢復(fù)同一格式(也可以在word中復(fù)制“【合同編號(hào)】”,覆蓋粘貼成文本)。

doc = Document('data\合同模板 - 需填入部分格式錯(cuò)誤.docx') #打開word文件
for para in doc.paragraphs: #讀取word中的每個(gè)段落
for run in para.runs: #讀取每個(gè)段落中的不同格式(run)
print(run.text)
>>合同編號(hào):
【合同編
號(hào)】

【貨物名稱】
采購(gòu)
合同
甲方

【采購(gòu)方】

此實(shí)例雖然是采購(gòu)合同,其處理方法適用于所有合同的批量生成,只需要準(zhǔn)備好合同的模板,和需要填入合同的信息,剩下的就放心地交給Python吧。合同信息和模板準(zhǔn)備好之后,就可開始批量替換,生成合同了?,F(xiàn)在跟我出發(fā)。

import docx
def info_update(doc,old_info, new_info):
'''此函數(shù)用于批量替換合同中需要替換的信息
doc:合同模板
old_info和new_info:原文字和需要替換的新文字
'''
#讀取段落中的所有run,找到需替換的信息進(jìn)行替換
for para in doc.paragraphs: #
for run in para.runs:
run.text = run.text.replace(old_info, new_info) #替換信息
#讀取表格中的所有單元格,找到需替換的信息進(jìn)行替換
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
cell.text = cell.text.replace(old_info, new_info) #替換信息

為方便后續(xù)重復(fù)調(diào)用,以上我們定義了一個(gè)函數(shù)info_update(),它包含三個(gè)參數(shù)doc,old_info, new_info,分別代表word模板,原文本,和新文本。逐個(gè)讀取word模板中的所有信息,只要遇到原文本,就替換成新文本。然后再讀取word中的表格中的信息,也是遇到原文本,就替換成新文本。

from openpyxl import load_workbook #用于讀取Excel中的信息
wb = load_workbook('data/合同信息.xlsx')
ws = wb.active
doc = docx.Document('data/合同模板.docx')
for row in range(2, ws.max_row+1):
for col in range(1, ws.max_column+1):
#調(diào)用上面建立的函數(shù),替換信息
info_update(doc,str(ws.cell(row=1,column=col).value), str(ws.cell(row=row,column=col).value))
doc.save('data/{}合同.docx'.format(str(ws.cell(row=row,column=3).value)))
print('{}合同完成'.format(str(ws.cell(row=row,column=3).value)))
>>
公司001合同完成
公司002合同完成
公司003合同完成
公司004合同完成
公司005合同完成
公司006合同完成
公司007合同完成
公司008合同完成
公司009合同完成
公司010合同完成

然后使用“openpyxl”庫(kù)的“l(fā)oad_workbook”模塊,讀物Excel檔的合同信息,遍歷每一行,每一列,調(diào)用替換信息的函數(shù)“info_update”完成合同信息替換,隨后保存。


我們以第一份合同為例,逐個(gè)看這些步驟是如何完成的。因?yàn)镋xcel中第一行是標(biāo)題,合同信息是從第二行開始的,所以我們行是從2開始row in range(2, ws.max_row+1),最大行加1結(jié)束(因?yàn)閞ange函數(shù)是取不到最后一個(gè)數(shù)的,此例中最大行是11,如果不加1,則只能取到10,這樣最后一份合同就會(huì)被漏掉了)。列也類似,不過是從第一列開始的col in range(1, ws.max_column+1)


第一份合同對(duì)應(yīng)的row值為2,col值為1。原信息是Excel中的標(biāo)題,對(duì)應(yīng)也就是word中的“【....】”部分。次數(shù)原信息先取ws.cell(row=1,column=1).value,即如下所示,為'【合同編號(hào)】'。因?yàn)镋xcel表中有一些數(shù)字,加上str()是為了轉(zhuǎn)換為字符串。

新信息為ws.cell(row=2,column=2).value,如下所示。然后就將word中'【合同編號(hào)】'替換為'手機(jī)',再替換第二列,第三列.....直到替換完所有的列,于是第一份合同生成完成,我們使用doc.save保存。我們給保存的文件名加上公司名稱,以便于區(qū)分,公司名是Excel中第三列的值ws.cell(row=row,column=3).value。

第一份合同完成后,回到for循環(huán),開始第二份合同的替換和保存,直到搞定所有合同。最終成果如下:

所有源代碼和說(shuō)明都在Jupyter notebook上完成,所用到的Excel 資料已上傳GitHub, 歡迎Fork或下載到本地隨意玩。。。轉(zhuǎn)載請(qǐng)注明出處,謝謝。
GitHub鏈接:

https://github.com/weidylan/Office_Automation_by_Using_Python

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
使用Python實(shí)現(xiàn)excel項(xiàng)目清單自動(dòng)生成word文檔
Python Excel Word一秒制作百份合同
入門干貨:Python操作Word文件經(jīng)驗(yàn)分享
教你用python操作Excel、Word、CSV,一文夠了
python處理word和excel文件
用 Python 一鍵批量自動(dòng)生成合同
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服