在我們的工作中,面臨著大量的重復性工作,通過人工方式處理往往耗時耗力易出錯。而Python在自動化辦公方面具有極大的優
勢,可以解決我們工作中遇到的很多重復性問題,分分鐘搞定辦公需求。快速下班回家陪老婆…
在我們經濟交往中,有時會涉及到銷售合同的批量制作。比如我們需要根據如下合同數據(Excel),進行批量生成銷售合同
(Word)。
我們首先要准備好一份合同模板(Word),將需要替換的合同數據用{ {}}表示,如下:
openpyxl是一個操作Excel非常好用的庫,功能相對於xlrd、xlwt來說更為完整,我們首先安裝它:
pip install openpyxl
docxtpl 是一個操作Word非常好用的庫,其主要通過對docx文檔模板加載,從而對其進行修改,我們也安裝下這個庫。
pip install docxtpl
我們可以通過load_workbook方法打開合同數據(Excel表),然後讀取每一個合同數據並存入到data字典,再將每個字典放入到
列表datas中。PS:由於讀取的簽約日期是一個時間戳,需要通過strftime方法轉為標准的年月日格式。
python學習交流Q群:906715085####
from docxtpl import DocxTemplate
from openpyxl import load_workbook
wb = load_workbook("合同數據.xlsx")
ws = wb['Sheet1']
datas = []
for row in range(2, ws.max_row):
name1 = ws[f"A{
row}"].value
name2 = ws[f"B{
row}"].value
price = ws[f"C{
row}"].value
product = ws[f"D{
row}"].value
count = ws[f"E{
row}"].value
deadline = ws[f"F{
row}"].value
time = ws[f"G{
row}"].value
time = time.strftime("%Y-%m-%d")
data = {
"甲方": name1,
"乙方": name2,
"合同價款": price,
"產品名稱": product,
"產品數量": count,
"付款期限": deadline,
"簽約時間": time}
datas.append(data)
datas
當然,我們也可以通過pandas大法來讀取合同數據,主要運用到dataframe_to_rows方法,將pandas格式的數據轉為一行一行的
數據。index=False表示不需要索引,header=False表示不需要表頭。
import pandas as pd
from openpyxl.utils.dataframe import dataframe_to_rows
df = pd.read_excel("合同數據.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],
"合同價款": row[2],
"產品名稱": row[3],
"產品數量": row[4],
"付款期限": row[5],
"簽約時間": row[6]}
datas.append(data)
datas
我們可以打印datas,效果如下:
[{
'甲方': 'J哥',
'乙方': '老王',
'合同價款': 1000000,
'產品名稱': '菜J學Python',
'產品數量': 1,
'付款期限': 30,
'簽約時間': '2022-05-20'},
{
'甲方': 'K哥',
'乙方': '張三',
'合同價款': 20000,
'產品名稱': '冰箱',
'產品數量': 2,
'付款期限': 40,
'簽約時間': '2022-05-21'},
{
'甲方': 'C哥',
'乙方': '李四',
'合同價款': 30000,
'產品名稱': '電腦',
'產品數量': 3,
'付款期限': 50,
'簽約時間': '2022-05-22'},
{
'甲方': 'B哥',
'乙方': '王五',
'合同價款': 40000,
'產品名稱': '洗衣機',
'產品數量': 4,
'付款期限': 60,
'簽約時間': '2022-05-23'},
{
'甲方': 'P哥',
'乙方': '趙六',
'合同價款': 50000,
'產品名稱': '微波爐',
'產品數量': 5,
'付款期限': 70,
'簽約時間': '2022-05-24'}]
這裡運用for語句遍歷每一個合同數據data(字典格式),打開合同模板,並將data替換掉合同模板中的數據,然後保存為新的銷售合同。
for data in datas:
tpl = DocxTemplate('合同模板.docx')
tpl.render(data)
tpl.save(f'合同生成/{
data["甲方"]}的銷售合同{
data["簽約時間"]}.docx')
print(f'{
data["甲方"]}的銷售合同已生成')
代碼運行後,效果如下:
打開其中一個銷售合同,效果如下:
有沒有學會呀!!今天這個案例還是十分簡單的,適合小白拿來練手手。想要動手操作的小伙伴趁熱打鐵,現在就趕緊去碼一
波。對於這篇文章不懂或者有疑惑的,都可以在評論區告訴我…