轉(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é)到的主要內(nèi)容:
openpyxl
綜合操作glob
進(jìn)行批處理- 對(duì) Excel 樣式進(jìn)行調(diào)整
需求描述
你是一個(gè)公司小職員婉烟,興高采烈整理完了 200 份嬰兒產(chǎn)品的電商數(shù)據(jù)(本文以 30 份為例)彤避,每個(gè)表格格式相同如下所示:
結(jié)果給上級(jí)一看副签,上級(jí)說了句:表頭不太合適募判,得改成中文的肤晓。然后購(gòu)買數(shù)超過 100 的是潛在重點(diǎn)客戶意系,要把他的消息在表格中標(biāo)出來拱燃!
解釋成落地的語(yǔ)言就是:
- 所有表的表頭修改為【用戶ID碎浇,商店ID腾仅,貨物ID乒裆,購(gòu)買數(shù),日期】
- 將購(gòu)買數(shù)超過 100 用戶的整條信息標(biāo)紅推励、加粗鹤耍、加邊框
雖然此時(shí)你可能有諸多不滿,但事情終歸要做验辞。如果一個(gè)一個(gè)表格打開修改表頭稿黄,并且通過篩選修改樣式,工作量實(shí)在太大跌造,故你想到了用 Python 實(shí)現(xiàn)辦公自動(dòng)化
邏輯梳理
這種類似問題的批量操作有一個(gè)原則:對(duì)多個(gè)表格的批處理操作建議首先嘗試在一個(gè)表格上完成杆怕,當(dāng)我們打開示例的 電商嬰兒數(shù)據(jù).xlsx
后,留給我們的問題就變成了:
- 獲取第一行壳贪,將 5 個(gè)單元格內(nèi)的數(shù)據(jù)改為【用戶ID陵珍,商店ID,貨物ID违施,購(gòu)買數(shù)互纯,日期】
- 遍歷所有行,當(dāng)購(gòu)買數(shù)超過 100 時(shí)磕蒲,記錄這一行的行號(hào)至一個(gè)列表
- 重新遍歷列表種記錄行號(hào)的特定行留潦,對(duì)每個(gè)單元格進(jìn)行樣式修改
上面的步驟第 2 步和第 3 步有點(diǎn)繁瑣只盹,是由于 openpyxl
無(wú)法支持遍歷到符合要求的行同時(shí)修改其樣式,同時(shí)單元格是最小的操作單位兔院,因此采用了以上策略
理論存在殖卑,實(shí)踐開始
代碼實(shí)現(xiàn)
打開一份 Excel 文件用 load_workbook
,如果是創(chuàng)建新的 Excel 用 Workbook
from openpyxl import load_workbook
# 數(shù)據(jù)所在的文件夾目錄
path = 'C:\xxxxxxx'
workbook = load_workbook(path + r'\電商嬰兒數(shù)據(jù).xlsx')
sheet = workbook.active
表頭是第 1 行秆乳,提到獲取多個(gè)單元格的數(shù)值可以復(fù)習(xí)之前的知識(shí)點(diǎn):
因此表頭用一行簡(jiǎn)單代碼 heading = sheet[1]
就可以獲取懦鼠。這是一個(gè)元祖,可以通過下標(biāo)獲取每一個(gè)元素并修改為期望的內(nèi)容:
heading = sheet[1]
heading[0].value = '用戶ID'
heading[1].value = '商店ID'
heading[2].value = '貨物ID'
heading[3].value = '購(gòu)買數(shù)'
heading[4].value = '日期'
另外一個(gè)思路是需要修改的數(shù)據(jù)所在的單元格分別是 A1/B1/C1/D1/E1屹堰,
可以直接通過 sheet[單元格].value = xxx
修改:
sheet[A1].value = '用戶ID'
sheet[B1].value = '商店ID'
sheet[C1].value = '貨物ID'
sheet[D1].value = '購(gòu)買數(shù)'
sheet[E1].value = '日期'
完成了第一步小需求肛冶,接下來我們看看怎么篩選出購(gòu)買數(shù)相關(guān)的行。先看代碼:
buy_amount = sheet['D']
row_lst = []
for cell in buy_amount:
if isinstance(cell.value, int) and cell.value > 100:
row_lst.append(cell.row)
print(row_lst )
通過觀察我們可以發(fā)現(xiàn)扯键,“購(gòu)買數(shù)”在表格的第 D 列睦袖,通過 buy_amount = sheet['D']
可以獲取。接下來創(chuàng)建一個(gè)新列表荣刑,如果數(shù)值超過 100 就將其行號(hào)放入一個(gè)空列表中馅笙,間接完成了篩出符合條件的行。
這里如果運(yùn)行會(huì)報(bào)錯(cuò)厉亏,因?yàn)榭赡苡械膯卧?cell 的值 value 不是數(shù)值類型董习,因此需要用 isinstance()
進(jìn)行判斷:
運(yùn)行后就成功弄到了購(gòu)買數(shù)超過 100 的行號(hào)。這里要求的修改樣式有圍繞字體的標(biāo)紅爱只、加粗皿淋,也有針對(duì)單元格的邊框,因此需要導(dǎo)入 Font
, Side
, Border
三個(gè)方法恬试,并進(jìn)行設(shè)置:
from openpyxl.styles import Font, Side, Border
# 先設(shè)置后邊的樣式窝趣,包括粗細(xì)和顏色
side = Side(style='thin', color='FF000000')
# 再選擇加邊框的方向,這里選擇上下左右都加
border = Border(left=side, right=side, top=side, bottom=side)
# 設(shè)置字體為加粗训柴、顏色為紅色
font = Font(bold=True, color='FF0000')
樣式預(yù)設(shè)好了以后重新根據(jù)行號(hào)遍歷并設(shè)置樣式:
for row in row_lst:
for cell in sheet[row]:
cell.font = font
cell.border = border
workbook.save(path + r'\電商嬰兒數(shù)據(jù)_修改.xlsx')
現(xiàn)在我們就完成了一個(gè)表格的修改:
接下來只需要通過 glob
建立批處理框架就能夠完成批量文件修改哑舒,添加的代碼不過幾行:
import glob
path = r'C:\xxxx'
for file in glob.glob(path + r'\*.xlsx'):
pass
加上批處理后完整代碼如下:
from openpyxl import load_workbook
from openpyxl.styles import Font, Side, Border
import glob
path = r'C:\xxx'
for file in glob.glob(path + r'\*.xlsx'):
workbook = load_workbook(file)
sheet = workbook.active
heading = sheet[1]
heading[0].value = '用戶ID'
heading[1].value = '商店ID'
heading[2].value = '貨物ID'
heading[3].value = '購(gòu)買數(shù)'
heading[4].value = '日期'
buy_mount = sheet['D']
row_lst = []
for cell in buy_mount:
if isinstance(cell.value, int) and cell.value > 100:
row_lst.append(cell.row)
print(row_lst)
side = Side(style='thin', color='FF000000')
border = Border(left=side, right=side, top=side, bottom=side)
font = Font(bold=True, color='FF0000')
for row in row_lst:
for cell in sheet[row]:
cell.font = font
cell.border = border
workbook.save(file)