[Python] 自動(dòng)化辦公 批量修改Excel特定內(nèi)容和樣式

轉(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)容:

  1. openpyxl 綜合操作
  2. glob 進(jìn)行批處理
  3. 對(duì) Excel 樣式進(jìn)行調(diào)整

https://pan.baidu.com/s/1A9Zc9BNepZ0UTRy9fY22yg 提取碼:ganh

需求描述

你是一個(gè)公司小職員婉烟,興高采烈整理完了 200 份嬰兒產(chǎn)品的電商數(shù)據(jù)(本文以 30 份為例)彤避,每個(gè)表格格式相同如下所示:

結(jié)果給上級(jí)一看副签,上級(jí)說了句:表頭不太合適募判,得改成中文的肤晓。然后購(gòu)買數(shù)超過 100 的是潛在重點(diǎn)客戶意系,要把他的消息在表格中標(biāo)出來拱燃!

解釋成落地的語(yǔ)言就是:

  1. 所有表的表頭修改為【用戶ID碎浇,商店ID腾仅,貨物ID乒裆,購(gòu)買數(shù),日期】
  2. 將購(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 后,留給我們的問題就變成了:

  1. 獲取第一行壳贪,將 5 個(gè)單元格內(nèi)的數(shù)據(jù)改為【用戶ID陵珍,商店ID,貨物ID违施,購(gòu)買數(shù)互纯,日期】
  2. 遍歷所有行,當(dāng)購(gòu)買數(shù)超過 100 時(shí)磕蒲,記錄這一行的行號(hào)至一個(gè)列表
  3. 重新遍歷列表種記錄行號(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)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市幻馁,隨后出現(xiàn)的幾起案子洗鸵,更是在濱河造成了極大的恐慌,老刑警劉巖仗嗦,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件预麸,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡儒将,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門对蒲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钩蚊,“玉大人贡翘,你說我怎么就攤上這事∨槁撸” “怎么了鸣驱?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蝠咆。 經(jīng)常有香客問我踊东,道長(zhǎng),這世上最難降的妖魔是什么刚操? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任闸翅,我火速辦了婚禮,結(jié)果婚禮上菊霜,老公的妹妹穿的比我還像新娘坚冀。我一直安慰自己,他們只是感情好鉴逞,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布记某。 她就那樣靜靜地躺著,像睡著了一般构捡。 火紅的嫁衣襯著肌膚如雪液南。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天勾徽,我揣著相機(jī)與錄音滑凉,去河邊找鬼。 笑死捂蕴,一個(gè)胖子當(dāng)著我的面吹牛譬涡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播啥辨,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼涡匀,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了溉知?” 一聲冷哼從身側(cè)響起陨瘩,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎级乍,沒想到半個(gè)月后舌劳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡玫荣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年甚淡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捅厂。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贯卦,死狀恐怖资柔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情撵割,我是刑警寧澤贿堰,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站啡彬,受9級(jí)特大地震影響羹与,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜庶灿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一纵搁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧跳仿,春花似錦诡渴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至山上,卻和暖如春眼耀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背佩憾。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工哮伟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人妄帘。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓楞黄,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親抡驼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鬼廓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容