<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在前幾天的文章中我們講解了如何從Word表格中提取指定資料並按照格式儲存到Excel中,今天我們將再次以一位讀者提出的真實需求來講解如何使用Python從Excel中計算、整理資料並寫入Word中,其實並不難,主要就是以下兩步:
那我們開始吧!
首先來看下我們需要處理的Excel部分資料,因涉及隱私已經將資料皮卡丘化
可以看到資料非常多,並且還存在重複資料。而我們要做的就是對每一列的資料按照一定的規則進行計算、整理並使用Python自動填入到Word中,大致的要求如下
上面僅是部分要求,真實需要填入word中的資料要更多!
除了對按照格式進行處理並存入Word中指定位置之外,還有一個需求:最終輸出的word檔名還需要按照一定規則生成:
OK,需求分析完畢,接下來看Python如何解決!
首先我們使用Python對該Excel進行解析
from openpyxl import load_workbook import os # 獲取桌面的路徑 def GetDesktopPath(): return os.path.join(os.path.expanduser("~"), 'Desktop') path = GetDesktopPath() + '/資料/' # 形成資料夾的路徑便後續重複使用 workbook = load_workbook(filename=path + '資料.xlsx') sheet = workbook.active # 獲取當前頁 # 可以用程式碼獲取資料範圍,如果要批次處理迴圈迭代也方便 # 獲取有資料範圍 print(sheet.dimensions) # A1:W10
利用openpyxl讀取單元格有以下幾種用法
cells = sheet['A1:A4'] # 返回A1-A4的4個單元格 cells = sheet['A'] # 獲取A列 cells = sheet['A:C'] # 獲取A-C列 cells = sheet[5] # 獲取第5行 # 注意如果是上述用cells獲取返回的是巢狀元祖 for cell in cells: print(cell[0].value) # 遍歷cells依然需要取出元祖中元素才可以獲取值 # 獲取一個範圍的所有cell # 也可以用iter_col返回列 for row in sheet.iter_rows(min_row=1, max_row=3,min_col=2, max_col=4): for cell in row: print(cell.value)
明白了原理我們就可以解析獲取Excel中的資料了
# SQE SQE = sheet['Q2'].value # 供應商&製造商 supplier = sheet['G2'].value # 採購單號 C2_10 = sheet['C2:C10'] # 返回cell.tuple物件 # 利用列表推導式後面同理 vC2_10 = [str(cell[0].value) for cell in C2_10] # 用set簡易去重後用,連線,填word表用 order_num = ','.join(set(vC2_10)) # 用set簡易去重後用&連線,word檔名命名使用 order_num_title = '&'.join(set(vC2_10)) # 產品型號 T2_10 = sheet['T2:T10'] vT2_10 = [str(cell[0].value) for cell in T2_10] ptype = ','.join(set(vT2_10)) # 產品描述 P2_10 = sheet['P2:P10'] vP2_10 = [str(cell[0].value) for cell in P2_10] info = ','.join(set(vP2_10)) info_title = '&'.join(set(vP2_10)) # 日期 # 用datetime庫獲取今日時間以及相應格式化 import datetime today = datetime.datetime.today() time = today.strftime('%Y年%m月%d日') # 驗貨數量 V2_10 = sheet['V2:V10'] vV2_10 = [int(cell[0].value) for cell in V2_10] total_num = sum(vV2_10) # 計算總數量 # 驗貨箱數 W2_10 = sheet['W2:W10'] vW2_10 = [int(cell[0].value) for cell in W2_10] box_num = sum(vW2_10) # 生成最終需要的word檔名 title = f'{order_num_title}-{supplier}-{total_num}-{info_title}-{time}-驗貨報告' print(title)
通過上面的程式碼,我們就成功的從Excel中提取出來資料,這樣Excel部分就結束了,接下來進行word的填表啦,由於這裡我們預設讀取的word是.docx格式的,實際上讀者的需求是.doc格式檔案,所以windows使用者可以用如下程式碼批次轉化doc,前提是安裝好win32com
# pip install pypiwin32 from win32com import client docx_path = path + '模板.docx' # doc轉docx的函數 def doc2docx(doc_path,docx_path): word = client.Dispatch("Word.Application") doc = word.Documents.Open(doc_path) doc.SaveAs(docx_path, 16) doc.Close() word.Quit() print('n doc檔案已轉換為docx n') if not os.path.exists(docx_path): doc2docx(docx_path[:-1], docx_path)
不過在Mac下暫時沒有好的解決策略,如果有思路歡迎交流,好了有docx格式檔案後我們繼續操作Word部分
docx_path = path + '模板.docx' from docx import Document # 範例化 document = Document(docx_path) # 讀取word中的所有表格 tables = document.tables # print(len(tables)) # 15
確定好每個表格數後即可進行相應的填報操作,table的用法和openpyxl中非常類似,注意索引和原生python一樣都是從0開始
tables[0].cell(1, 1).text = SQE tables[1].cell(1, 1).text = supplier tables[1].cell(2, 1).text = supplier tables[1].cell(3, 1).text = ptype tables[1].cell(4, 1).text = info tables[1].cell(5, 1).text = order_num tables[1].cell(7, 1).text = time
上面程式碼完成Word中這一部分表格
我們繼續用Python填寫下一個表格
for i in range(2, 11): tables[6].cell(i, 0).text = str(sheet[f'T{i}'].value) tables[6].cell(i, 1).text = str(sheet[f'P{i}'].value) tables[6].cell(i, 2).text = str(sheet[f'C{i}'].value) tables[6].cell(i, 4).text = str(sheet[f'V{i}'].value) tables[6].cell(i, 5).text = str(sheet[f'V{i}'].value) tables[6].cell(i, 6).text = '0' tables[6].cell(i, 7).text = str(sheet[f'W{i}'].value) tables[6].cell(i, 8).text = '0' tables[6].cell(12, 4).text = str(total_num) tables[6].cell(12, 5).text = str(total_num) tables[6].cell(12, 7).text = str(box_num)
這裡需要注意兩個細節:
按照上面的辦法,將之前從Excel中取出來的資料一一填充到Word中對應位置就大功告成!最後儲存一下即可。
document.save(path + f'{title}.docx') print('n檔案已生成')
回顧上面的過程,其實從需求和檔案格式上看,這次檔案的讀寫解析任務較複雜,碼程式碼和思考時間會較久,所以當我們在考慮使用Python進行辦公自動化之前需要想清楚這個問題:這次需要完成的任務是否工作量很多,或者以後長期需要進行,用Python是否可以解放雙手?如果不是,實際上手動就可以完成,那麼就失去了自動化辦公的意義!
以上就是Python辦公自動化從Excel中計算整理資料並寫入Word的詳細內容,更多關於Python Excel資料寫入Word的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45