
python確實(shí)是一款很實(shí)用的數(shù)據(jù)分析工具,尤其是在處理重復(fù)性工作方面。小編今天給大家推薦的這篇文章就是關(guān)于python自動(dòng)化處理合同的,希望能幫助大家解放雙手,實(shí)現(xiàn)合同的自動(dòng)化處理。
文章來(lái)源: 早起Python
作者:陳熹
大家好,又到了Python辦公自動(dòng)化系列。
今天我們繼續(xù)分享一個(gè)真實(shí)的辦公自動(dòng)化需求:如何使Python+Excel+Word批量生成指定格式內(nèi)容的合同。
主要涉及的知識(shí)點(diǎn)有:openpyxl模塊的綜合運(yùn)用與Word文檔的兩種遍歷邏輯。
你是乙方建筑公司,手上有一份空白合同模板的Word文件,如下圖:
另外還有一份Excel合同信息表,其中是所有甲方(發(fā)包人)在合同中需要填寫(xiě)的內(nèi)容
可見(jiàn)一行為一個(gè)公司的全部信息,現(xiàn)在需要把Excel中每一個(gè)公司的信息填入空白Word合同模板中,生成各公司的合同,最終結(jié)果如下
原本我們需要將Excel匯總表中每一行的信息填進(jìn)word模板中,生成相應(yīng)的合同。
現(xiàn)在我們需要交給Python來(lái)實(shí)現(xiàn),就引出了一個(gè)問(wèn)題:程序如何知道要將某個(gè)信息填到哪個(gè)下劃線(xiàn)? 為了解決這個(gè)問(wèn)題,我們需要對(duì)模板進(jìn)行修改。
即將下劃線(xiàn)改成某種標(biāo)識(shí),讓程序可以看到標(biāo)識(shí)就明白此處應(yīng)該放什么信息,這里采取的策略是:將需要填寫(xiě)的下劃線(xiàn)改成匯總表中的列名,即下圖所示
這樣程序就可以識(shí)別需要填寫(xiě)什么內(nèi)容了。所謂的識(shí)別在這里可以換一個(gè)特別簡(jiǎn)單的詞,即文本替換。只要檢索到#xxxx#(excel中的列名),把這個(gè)替換成具體的信息就可以了。
出于這種策略,列名就需要用#xxxx#的格式,否則正常的無(wú)關(guān)文本中的信息也會(huì)被替換,就破壞了原有的需求,最后模板被修改成如下:
通過(guò)Excel表我們可以看到,一行為一個(gè)公司的信息,而每一列的列名就存在于模板中,用各個(gè)公司的實(shí)際信息替換到模板中的列名(程序識(shí)別和文本替換的依據(jù))
用這樣的方法就可以完成這個(gè)需求。整個(gè)大需求的實(shí)現(xiàn)可以按照下面的步驟:
分析后的步驟:
將 空白合同 調(diào)整成 合同模板,需要填寫(xiě)的下劃線(xiàn)改成專(zhuān)屬的列名
打開(kāi)Excel表,按行循環(huán),然后按單元格逐個(gè)循環(huán)各個(gè)信息,每個(gè)信息都找到模板中存在的對(duì)應(yīng)列名并將其替換(如果不理解下文還有解釋?zhuān)?
每次循環(huán)完一行的全部單元格后保存合同,生存各個(gè)公司單獨(dú)的合同
分析清楚后邏輯就非常簡(jiǎn)單了,但有一個(gè)隱含的知識(shí)點(diǎn)沒(méi)有提到,讓我們邊寫(xiě)代碼邊說(shuō)!
首先導(dǎo)入模塊,設(shè)置路徑,建立文件夾,本例中涉及Excel表的打開(kāi)和Word的創(chuàng)建,因此需要從openpyxl導(dǎo)入load_workbook,而Word無(wú)論打開(kāi)還是創(chuàng)建,用docx模塊的Document均可
from docx import Document from openpyxl import load_workbook # 利用os模塊建立文件夾,用于存放生成的合同 import os # 給定合同模板和匯總表所在的文件夾路徑,方便復(fù)用 path = r'C:\Users\chenx\Desktop\合同' # 結(jié)合路徑判斷生成文件夾,規(guī)避程序報(bào)錯(cuò)而終止的風(fēng)險(xiǎn) if not os.path.exists(path + '/' + '全部合同'): os.mkdir(path + '/' + '全部合同')
接著打開(kāi)Excel文件
workbook = load_workbook(path + '/' + '合同信息表.xlsx') sheet = workbook.active
現(xiàn)在遍歷Excel,生成合同。前面也反復(fù)提到,Excel的每一行是一份特定合同的信息,因此docx針對(duì)Word文件的實(shí)例化和保存一定是在循環(huán)體里的,而不像Excel的實(shí)例化是在循環(huán)體外面
# 有效信息行是從第二行開(kāi)始的,第二行是表頭,包含列名,也是文本替換的依據(jù) for table_row in range(2, sheet.max_row + 1): # 每循環(huán)一行實(shí)例化一個(gè)新的word文件 wordfile = Document(path + '/' + '合同模板.docx') # 單元格需要逐個(gè)遍歷,每一個(gè)都包含著有用的信息 for table_col in range(1, sheet.max_column + 1): # 舊的文本也就是列名,已經(jīng)在模板里填好了,用于文本替換,將row限定在第一行后就是列名 old_text = str(sheet.cell(row=1, column=table_col).value) # 新的文本就是實(shí)際的信息,table_col循環(huán)到某個(gè)數(shù)值時(shí),實(shí)際的單元格和列名就確定了 new_text = str(sheet.cell(row=table_row, column=table_col).value) # 加上這個(gè)判斷是因?yàn)槿掌谛畔⒆x進(jìn)程序是“日期 時(shí)間”格式的,如果要保留日期信息可以用字符串方法或者用time/datetime模塊處理 if ' ' in new_text: new_text = new_text.split()[0]
通過(guò)下圖進(jìn)一步理解這個(gè)替換:
例如程序已經(jīng)進(jìn)入第3個(gè)循環(huán)(循環(huán)到第3個(gè)公司),針對(duì)單元格的循環(huán)進(jìn)入第4個(gè)循環(huán),那么此時(shí)獲取的實(shí)際值是建設(shè)C公園,對(duì)應(yīng)的列名是#工程內(nèi)容#。
此時(shí)就明確了需要被替換的內(nèi)容了,只要在模板中找到#工程內(nèi)容#把它替換為建設(shè)C公園即可!了解了這個(gè)替換后,下一步就是遍歷Word模板,找到對(duì)應(yīng)列名替換!
之前我們說(shuō)過(guò)docx模塊,Word文本存在文檔Document-段落Paragraph-文字塊Run的三級(jí)結(jié)構(gòu),需要遍歷文本可以用以下代碼:
all_paragraphs = wordfile.paragraphs for paragraph in all_paragraphs: print(paragraph.text) for run in paragraph.runs: print(run.text)
針對(duì)段落和文字塊均可用.text獲取到文字信息。本需求隱含的陷阱就在這里,注意一下合同最后需要填寫(xiě)的內(nèi)容:
這部分內(nèi)容如果用上述代碼是遍歷不到的。為什么?因?yàn)檫@是Word文檔中的表格!
遍歷表格需要有專(zhuān)門(mén)的遍歷邏輯:文檔Document-表格Table-行Row/列Column-單元格Cell,遍歷表格中文本的代碼如下:
all_tables = wordfile.tables for table in all_tables: # 也可按列遍歷 for row in table.rows: for cell in row.cells: print(cell.text)
有了這些補(bǔ)充的知識(shí)之后,本案例中最核心的代碼就可以這么寫(xiě)
for table_row in range(2, sheet.max_row + 1): wordfile = Document(path + '/' + '合同模板.docx') for table_col in range(1, sheet.max_column + 1): old_text = str(sheet.cell(row=1, column=table_col).value) new_text = str(sheet.cell(row=table_row, column=table_col).value) if ' ' in new_text: new_text = new_text.split()[0] # 文檔Document - 段落Paragraph - 文字塊Run all_paragraphs = wordfile.paragraphs for paragraph in all_paragraphs: for run in paragraph.runs: run.text = run.text.replace(old_text, new_text) # 文檔Document - 表格Table - 行Row/列Column - 單元格Cell all_tables = wordfile.tables for table in all_tables: for row in table.rows: for cell in row.cells: cell.text = cell.text.replace(old_text, new_text) # 獲取公司名用以生成合同的名稱(chēng) company = str(sheet.cell(row=table_row, column=1).value) wordfile.save(path + '/' + f'全部合同/{company}合同.docx')
本次的案例具有較強(qiáng)的實(shí)用性,并且需求可以延伸成為:將一份信息匯總表Excel中的每一個(gè)單獨(dú)信息(每一行或者每一列為個(gè)人、公司或者其他的信息)填寫(xiě)到指定的模板Eord中,生成單獨(dú)的文檔,不過(guò)在寫(xiě)自動(dòng)化腳本之前也要先拆分任務(wù),明確思路再進(jìn)行!
數(shù)據(jù)分析咨詢(xún)請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
LSTM 模型輸入長(zhǎng)度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長(zhǎng)序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報(bào)考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計(jì)的實(shí)用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強(qiáng)大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶(hù) ...
2025-07-11尊敬的考生: 您好! 我們誠(chéng)摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實(shí)施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價(jià)值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡(jiǎn)稱(chēng) BI)深度融合的時(shí)代,BI ...
2025-07-10SQL 在預(yù)測(cè)分析中的應(yīng)用:從數(shù)據(jù)查詢(xún)到趨勢(shì)預(yù)判? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代,預(yù)測(cè)分析作為挖掘數(shù)據(jù)潛在價(jià)值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢(xún)結(jié)束后:分析師的收尾工作與價(jià)值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢(xún)結(jié)束)并非工作的終點(diǎn),而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報(bào)考到取證的全攻略? 在數(shù)字經(jīng)濟(jì)蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭(zhēng)搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢(shì)性檢驗(yàn):捕捉數(shù)據(jù)背后的時(shí)間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢(shì)性檢驗(yàn)如同一位耐心的偵探,專(zhuān)注于從單 ...
2025-07-09year_month數(shù)據(jù)類(lèi)型:時(shí)間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時(shí)間是最不可或缺的維度之一,而year_month數(shù)據(jù)類(lèi)型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實(shí)戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗(yàn):數(shù)據(jù)趨勢(shì)與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢(shì)變化以及識(shí)別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國(guó)內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對(duì)策略? 長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨(dú)特的門(mén)控機(jī)制,在 ...
2025-07-07統(tǒng)計(jì)學(xué)方法在市場(chǎng)調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場(chǎng)調(diào)研是企業(yè)洞察市場(chǎng)動(dòng)態(tài)、了解消費(fèi)者需求的重要途徑,而統(tǒng)計(jì)學(xué)方法則是市場(chǎng)調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書(shū)考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動(dòng)力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專(zhuān)業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動(dòng)力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開(kāi)啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價(jià)值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03