轉(zhuǎn)載請(qǐng)注明:陳熹 chenx6542@foxmail.com (簡(jiǎn)書號(hào):半為花間酒)
若公眾號(hào)內(nèi)轉(zhuǎn)載請(qǐng)聯(lián)系公眾號(hào):早起Python
本例可以學(xué)到的知識(shí)點(diǎn):
openpyxl
模塊的綜合運(yùn)用
練習(xí)數(shù)據(jù):鏈接 https://pan.baidu.com/s/1o3xxsFO2KqozVbH68UwElg 提取碼 r3r2
一、需求描述:
有一份 檔案記錄總表的Excel工作簿, 每天會(huì)根據(jù) 當(dāng)天日期 建立新表蛋褥,每天的表格內(nèi)包含所有檔案信息膜廊,同時(shí)也有可能會(huì)添加新的檔案名。同個(gè)年度的總表在年末可能會(huì)有兩痘昌、三百個(gè)工作表,同時(shí)每個(gè)表中可能也存在千余份檔案信息。
(為了直觀呈現(xiàn)本例以7個(gè)工作表和十余份檔案的形式呈現(xiàn))
表格形式如下:
需要完成的操作:為了方便審查特定檔案信息,需要給出檔案名后生成一份新表先煎,該表包含指定檔案在所有日期(即所有工作表)中的記錄
最終結(jié)果如下(以 檔案x003 為例):
二谤绳、步驟分析
正式寫代碼前可以把需求分析清楚缩筛,將復(fù)雜問題簡(jiǎn)單化
說(shuō)白了瞎抛,這個(gè)需求要求把所有日期工作表中的特定行都提取出來(lái)整合成一個(gè)新表婿失。那么我們可以遍歷每一張表,然后遍歷第一列(名稱列懒浮,也可以看作A列)每一個(gè)有數(shù)據(jù)的單元格砚著,如果單元格中的文字為我們需要的檔案名稽穆,就把這一行提取出來(lái)放到新的表格中
進(jìn)一步梳理步驟為:
- 建立一個(gè)新的EXCEL工作簿
- 新表的表頭和檔案記錄Excel中的一樣舌镶,也是“名稱”餐胀、“配置”、“提交日期”等
- 遍歷檔案記錄Excel的每一張工作表sheet墨技,再遍歷第一列每一個(gè)有數(shù)據(jù)的單元格扣汪,對(duì)內(nèi)容進(jìn)行判斷
- 找到符合條件的單元格后獲取行號(hào)脐嫂,根據(jù)行號(hào)將當(dāng)前表中的特定行提取出來(lái),并將行追加新創(chuàng)建的表中
分析清楚就著手寫代碼
三暗膜、代碼實(shí)現(xiàn)
- 導(dǎo)入需要的庫(kù)
本例中涉及舊表的打開和新表的創(chuàng)建娃善,因此需要從openpyxl
導(dǎo)入load_workbook
和Workbook
(如果是ppt和word用到的模塊就更智能了聚磺,一個(gè)方法就能搞定)
from openpyxl import load_workbook, Workbook
- 導(dǎo)入舊表及創(chuàng)建新表
# 從桌面上獲取總表
filepath = r'C:\Users\chenx\Desktop\臺(tái)賬.xlsm' # 根據(jù)實(shí)際情況進(jìn)行修改
workbook = load_workbook(filepath)
# 創(chuàng)建新的Excel工作簿獲取到工作表
new_workbook = Workbook()
new_sheet = new_workbook.active
# 給新表寫入表頭
new_headers = ['名稱', '配置', '提交日期', '受限操作', '操作時(shí)間', '狀態(tài)', '存儲(chǔ)位置']
new_sheet.append(new_headers)
- 核心步驟:多次遍歷
可以用workbook.sheetnames
獲取工作簿所有工作表名稱的列表,然后遍歷即可
for i in workbook.sheetnames:
sheet = workbook[i]
# 獲取檔案名稱所在列
names = sheet['A']
按照前面的分析,需要遍歷名稱列暮屡,判斷每一個(gè)單元格的值是不是需要的檔案名褒纲。這里應(yīng)注意冕象,如果已經(jīng)循環(huán)到需要的單元格渐扮,就可以停止循環(huán)了墓律,但一定要把符合單元格的行號(hào)傳遞給一個(gè)變量做記錄帕棉,不然一旦break
出循環(huán)就沒有記憶了
flag = 0
for cell in names:
if cell.value == keyword: # 這里的keyword就是檔案名香伴,可以以 檔案x003 為例
flag = cell.row
break
獲得到符合條件的行號(hào)后用sheet[flag]
就可以拿到符合行了。openpyxl
不支持舊表的一整行寫入新表膊畴,因此應(yīng)對(duì)策略就是將這一行的所有單元格具體值組裝成一個(gè)列表,用sheet.append(列表)
的方法寫入新表
遍歷部分的完整代碼如下:
for i in workbook.sheetnames:
sheet = workbook[i]
names = sheet['A']
flag = 0
for cell in names:
if cell.value == keyword:
flag = cell.row
break
if flag: # 如果flag沒有被修改則不需要順序進(jìn)行下列代碼
data_lst = []
for cell in sheet[flag]:
# 這里加上一個(gè)對(duì)內(nèi)容的判斷政勃,是讓無(wú)內(nèi)容的行直接放空,而不是寫入一個(gè) none
if cell.value:
data_lst.append(str(cell.value))
else:
data_lst.append(' ')
new_sheet.append(data_lst)
最后記得保存
new_workbook.save(r'C:\Users\chenx\Desktop\臺(tái)賬查詢.xlsx')
寫在最后
這是經(jīng)過(guò)一定改編的真實(shí)案例,可見python自動(dòng)化辦公確實(shí)能夠幫助我們解放自己的雙手
如果你有正在煩惱的辦公需求诅迷,歡迎在 早起Python 公眾號(hào)后臺(tái)留言