
python確實是一款很實用的數據分析工具,尤其是在處理重復性工作方面。小編今天給大家推薦的這篇文章就是關于python自動化處理合同的,希望能幫助大家解放雙手,實現合同的自動化處理。
文章來源: 早起Python
作者:陳熹
大家好,又到了Python辦公自動化系列。
今天我們繼續分享一個真實的辦公自動化需求:如何使Python+Excel+Word批量生成指定格式內容的合同。
主要涉及的知識點有:openpyxl模塊的綜合運用與Word文檔的兩種遍歷邏輯。
你是乙方建筑公司,手上有一份空白合同模板的Word文件,如下圖:
另外還有一份Excel合同信息表,其中是所有甲方(發包人)在合同中需要填寫的內容
可見一行為一個公司的全部信息,現在需要把Excel中每一個公司的信息填入空白Word合同模板中,生成各公司的合同,最終結果如下
原本我們需要將Excel匯總表中每一行的信息填進word模板中,生成相應的合同。
現在我們需要交給Python來實現,就引出了一個問題:程序如何知道要將某個信息填到哪個下劃線? 為了解決這個問題,我們需要對模板進行修改。
即將下劃線改成某種標識,讓程序可以看到標識就明白此處應該放什么信息,這里采取的策略是:將需要填寫的下劃線改成匯總表中的列名,即下圖所示
這樣程序就可以識別需要填寫什么內容了。所謂的識別在這里可以換一個特別簡單的詞,即文本替換。只要檢索到#xxxx#(excel中的列名),把這個替換成具體的信息就可以了。
出于這種策略,列名就需要用#xxxx#的格式,否則正常的無關文本中的信息也會被替換,就破壞了原有的需求,最后模板被修改成如下:
通過Excel表我們可以看到,一行為一個公司的信息,而每一列的列名就存在于模板中,用各個公司的實際信息替換到模板中的列名(程序識別和文本替換的依據)
用這樣的方法就可以完成這個需求。整個大需求的實現可以按照下面的步驟:
分析后的步驟:
將 空白合同 調整成 合同模板,需要填寫的下劃線改成專屬的列名
打開Excel表,按行循環,然后按單元格逐個循環各個信息,每個信息都找到模板中存在的對應列名并將其替換(如果不理解下文還有解釋)
每次循環完一行的全部單元格后保存合同,生存各個公司單獨的合同
分析清楚后邏輯就非常簡單了,但有一個隱含的知識點沒有提到,讓我們邊寫代碼邊說!
首先導入模塊,設置路徑,建立文件夾,本例中涉及Excel表的打開和Word的創建,因此需要從openpyxl導入load_workbook,而Word無論打開還是創建,用docx模塊的Document均可
from docx import Document from openpyxl import load_workbook # 利用os模塊建立文件夾,用于存放生成的合同 import os # 給定合同模板和匯總表所在的文件夾路徑,方便復用 path = r'C:\Users\chenx\Desktop\合同' # 結合路徑判斷生成文件夾,規避程序報錯而終止的風險 if not os.path.exists(path + '/' + '全部合同'): os.mkdir(path + '/' + '全部合同')
接著打開Excel文件
workbook = load_workbook(path + '/' + '合同信息表.xlsx') sheet = workbook.active
現在遍歷Excel,生成合同。前面也反復提到,Excel的每一行是一份特定合同的信息,因此docx針對Word文件的實例化和保存一定是在循環體里的,而不像Excel的實例化是在循環體外面
# 有效信息行是從第二行開始的,第二行是表頭,包含列名,也是文本替換的依據 for table_row in range(2, sheet.max_row + 1): # 每循環一行實例化一個新的word文件 wordfile = Document(path + '/' + '合同模板.docx') # 單元格需要逐個遍歷,每一個都包含著有用的信息 for table_col in range(1, sheet.max_column + 1): # 舊的文本也就是列名,已經在模板里填好了,用于文本替換,將row限定在第一行后就是列名 old_text = str(sheet.cell(row=1, column=table_col).value) # 新的文本就是實際的信息,table_col循環到某個數值時,實際的單元格和列名就確定了 new_text = str(sheet.cell(row=table_row, column=table_col).value) # 加上這個判斷是因為日期信息讀進程序是“日期 時間”格式的,如果要保留日期信息可以用字符串方法或者用time/datetime模塊處理 if ' ' in new_text: new_text = new_text.split()[0]
通過下圖進一步理解這個替換:
例如程序已經進入第3個循環(循環到第3個公司),針對單元格的循環進入第4個循環,那么此時獲取的實際值是建設C公園,對應的列名是#工程內容#。
此時就明確了需要被替換的內容了,只要在模板中找到#工程內容#把它替換為建設C公園即可!了解了這個替換后,下一步就是遍歷Word模板,找到對應列名替換!
之前我們說過docx模塊,Word文本存在文檔Document-段落Paragraph-文字塊Run的三級結構,需要遍歷文本可以用以下代碼:
all_paragraphs = wordfile.paragraphs for paragraph in all_paragraphs: print(paragraph.text) for run in paragraph.runs: print(run.text)
針對段落和文字塊均可用.text獲取到文字信息。本需求隱含的陷阱就在這里,注意一下合同最后需要填寫的內容:
這部分內容如果用上述代碼是遍歷不到的。為什么?因為這是Word文檔中的表格!
遍歷表格需要有專門的遍歷邏輯:文檔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)
有了這些補充的知識之后,本案例中最核心的代碼就可以這么寫
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) # 獲取公司名用以生成合同的名稱 company = str(sheet.cell(row=table_row, column=1).value) wordfile.save(path + '/' + f'全部合同/{company}合同.docx')
本次的案例具有較強的實用性,并且需求可以延伸成為:將一份信息匯總表Excel中的每一個單獨信息(每一行或者每一列為個人、公司或者其他的信息)填寫到指定的模板Eord中,生成單獨的文檔,不過在寫自動化腳本之前也要先拆分任務,明確思路再進行!
數據分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
解碼數據基因:從數字敏感度到邏輯思維 每當看到超市貨架上商品的排列變化,你是否會聯想到背后的銷售數據波動?三年前在零售行 ...
2025-05-23在本文中,我們將探討 AI 為何能夠加速數據分析、如何在每個步驟中實現數據分析自動化以及使用哪些工具。 數據分析中的AI是什么 ...
2025-05-20當數據遇見人生:我的第一個分析項目 記得三年前接手第一個數據分析項目時,我面對Excel里密密麻麻的銷售數據手足無措。那些跳動 ...
2025-05-20在數字化運營的時代,企業每天都在產生海量數據:用戶點擊行為、商品銷售記錄、廣告投放反饋…… 這些數據就像散落的拼圖,而相 ...
2025-05-19在當今數字化營銷時代,小紅書作為國內領先的社交電商平臺,其銷售數據蘊含著巨大的商業價值。通過對小紅書銷售數據的深入分析, ...
2025-05-16Excel作為最常用的數據分析工具,有沒有什么工具可以幫助我們快速地使用excel表格,只要輕松幾步甚至輸入幾項指令就能搞定呢? ...
2025-05-15數據,如同無形的燃料,驅動著現代社會的運轉。從全球互聯網用戶每天產生的2.5億TB數據,到制造業的傳感器、金融交易 ...
2025-05-15大數據是什么_數據分析師培訓 其實,現在的大數據指的并不僅僅是海量數據,更準確而言是對大數據分析的方法。傳統的數 ...
2025-05-14CDA持證人簡介: 萬木,CDA L1持證人,某電商中廠BI工程師 ,5年數據經驗1年BI內訓師,高級數據分析師,擁有豐富的行業經驗。 ...
2025-05-13CDA持證人簡介: 王明月 ,CDA 數據分析師二級持證人,2年數據產品工作經驗,管理學博士在讀。 學習入口:https://edu.cda.cn/g ...
2025-05-12CDA持證人簡介: 楊貞璽 ,CDA一級持證人,鄭州大學情報學碩士研究生,某上市公司數據分析師。 學習入口:https://edu.cda.cn/g ...
2025-05-09CDA持證人簡介 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度、美團、阿里等 ...
2025-05-07相信很多做數據分析的小伙伴,都接到過一些高階的數據分析需求,實現的過程需要用到一些數據獲取,數據清洗轉換,建模方法等,這 ...
2025-05-06以下的文章內容來源于劉靜老師的專欄,如果您想閱讀專欄《10大業務分析模型突破業務瓶頸》,點擊下方鏈接 https://edu.cda.cn/g ...
2025-04-30CDA持證人簡介: 邱立峰 CDA 數據分析師二級持證人,數字化轉型專家,數據治理專家,高級數據分析師,擁有豐富的行業經驗。 ...
2025-04-29CDA持證人簡介: 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度,美團,阿里等 ...
2025-04-28CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-27數據分析在當今信息時代發揮著重要作用。單因素方差分析(One-Way ANOVA)是一種關鍵的統計方法,用于比較三個或更多獨立樣本組 ...
2025-04-25CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-25在當今數字化時代,數據分析師的重要性與日俱增。但許多人在踏上這條職業道路時,往往充滿疑惑: 如何成為一名數據分析師?成為 ...
2025-04-24