Python代碼操作Excel條件格式的實(shí)戰(zhàn)指南
?
周一早上九點(diǎn),你的郵箱被各種報表塞滿。
打開財務(wù)發(fā)來的季度銷售數(shù)據(jù),幾千行數(shù)字?jǐn)D在屏幕上,眼睛掃過去一片黑壓壓。老板在旁邊等著匯報,問你這個季度哪個產(chǎn)品賣得最好、哪些區(qū)域掉得厲害。你拿著鼠標(biāo)劃來劃去,半天找不出個所以然。
這場景,但凡用Excel干過活的人都懂——數(shù)據(jù)有了,但看不見。
條件格式就是干這個用的。它能讓數(shù)字“開口說話”:高于平均值的自動標(biāo)綠,低于警戒線的自動飄紅,重復(fù)值、排名、異常點(diǎn)一眼掃過去清清楚楚。但問題來了,每月、每周甚至每天都要手動重復(fù)這些操作,時間全耗在“格式化”上了。
Python能幫你解決這個麻煩。
用代碼操作Excel條件格式,本質(zhì)上就是把你手動點(diǎn)鼠標(biāo)的步驟寫成腳本。數(shù)據(jù)更新了,腳本跑一遍,格式自動生成。市面上主流的幾個庫——openpyxl、xlsxwriter、Spire.XLS——各有各的脾氣,選對了工具,事半功倍。
一、openpyxl:最接地氣的全能選手
openpyxl是處理Excel最常用的庫,讀寫都支持,對條件格式的支持也比較完善。它的設(shè)計思路很符合直覺:先定規(guī)則,再上格式。
比如你想把成績表里不及格(小于60分)的單元格標(biāo)紅,代碼可以這么寫:
from openpyxl import load_workbook
from openpyxl.styles import PatternFill
from openpyxl.formatting.rule import CellIsRule
wb = load_workbook('成績表.xlsx')
ws = wb.active
# 定義紅色填充
red_fill = PatternFill(start_color='FF0000', end_color='FF0000', fill_type='solid')
# 添加條件格式規(guī)則:單元格值小于60
ws.conditional_formatting.add('B2:B100',
CellIsRule(operator='lessThan',
formula=['60'],
fill=red_fill))
wb.save('成績表_格式化.xlsx')
這段代碼干的事,和你手動點(diǎn)“條件格式>突出顯示單元格規(guī)則>小于”一模一樣,區(qū)別在于——下次再來100份報表,它也能一秒干完。
openpyxl支持的規(guī)則類型不少:CellIsRule(基于值)、FormulaRule(基于公式)、ColorScaleRule(色階)、IconSetRule(圖標(biāo)集)、DataBarRule(數(shù)據(jù)條)都有。想做復(fù)雜點(diǎn)的邏輯,比如“既要大于平均線,又要屬于前10%”,用公式規(guī)則就能搞定。
有個坑得提醒你:openpyxl在讀取帶條件格式的現(xiàn)有文件時,規(guī)則信息可能會丟失。所以用它創(chuàng)建格式?jīng)]問題,但別指望完美讀取別人設(shè)好的規(guī)則。
二、xlsxwriter:寫報表的一把好手
如果你只需要“生成”報表,不需要修改已有文件,xlsxwriter是更輕量級的選擇。它專注于寫入,功能純粹,性能也不錯。
xlsxwriter的語法有點(diǎn)不一樣,用的是字典傳參:
import xlsxwriter
workbook = xlsxwriter.Workbook('銷售報表.xlsx')
worksheet = workbook.add_worksheet()
# 準(zhǔn)備數(shù)據(jù)
data = [320, 450, 280, 490, 350, 420, 380]
worksheet.write_column('A1', data)
# 定義兩種格式
green_format = workbook.add_format({'bg_color': 'green'})
red_format = workbook.add_format({'bg_color': 'red'})
# 設(shè)置條件格式:大于400標(biāo)綠,小于等于400標(biāo)紅
worksheet.conditional_format('A1:A7', {'type': 'cell',
'criteria': '>',
'value': 400,
'format': green_format})
worksheet.conditional_format('A1:A7', {'type': 'cell',
'criteria': '<=',
'value': 400,
'format': red_format})
workbook.close()
xlsxwriter最實(shí)用的功能之一是配合pandas用。你拿pandas做完數(shù)據(jù)處理,直接用pd.ExcelWriter指定xlsxwriter引擎,然后調(diào)用條件格式方法,數(shù)據(jù)分析+報表生成一條龍。
import pandas as pd
df = pd.DataFrame({'銷售額': [320, 450, 280, 490, 350]})
writer = pd.ExcelWriter('報表.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='銷售數(shù)據(jù)', index=False)
workbook = writer.book
worksheet = writer.sheets['銷售數(shù)據(jù)']
# 對B列(銷售額)應(yīng)用三色階
worksheet.conditional_format('B2:B6', {'type': '3_color_scale'})
writer.close()
xlsxwriter不支持讀取已有文件,也不能修改。但如果你是從零開始建報表,它夠快、夠穩(wěn)、夠干凈。
三、Spire.XLS:商業(yè)級功能的代表
Spire.XLS是個商業(yè)庫,功能覆蓋面比前兩個更廣。它的API設(shè)計更接近Excel本身的邏輯,支持的操作也更多——比如設(shè)置公式條件、處理跨工作表引用、精細(xì)化控制格式選項。
有些場景下,用前兩個庫實(shí)現(xiàn)起來比較費(fèi)勁,比如“隔行變色”這種需求。用Spire.XLS可以寫得很直白:
from spire.xls import *
from spire.xls.common import *
workbook = Workbook()
workbook.LoadFromFile("數(shù)據(jù).xlsx")
sheet = workbook.Worksheets[0]
# 添加條件格式
conditionalFormat = sheet.ConditionalFormats.Add()
conditionalFormat.AddRange(sheet.Range[2, 1, sheet.LastRow, sheet.LastColumn])
# 偶數(shù)行設(shè)白色背景
condition1 = conditionalFormat.AddCondition()
condition1.FirstFormula = "=MOD(ROW(),2)=0"
condition1.FormatType = ConditionalFormatType.Formula
condition1.BackColor = Color.get_White()
# 奇數(shù)行設(shè)淺灰背景
condition2 = conditionalFormat.AddCondition()
condition2.FirstFormula = "=MOD(ROW(),2)=1"
condition2.FormatType = ConditionalFormatType.Formula
condition2.BackColor = Color.get_LightGray()
workbook.SaveToFile("隔行變色.xlsx", ExcelVersion.Version2016)
workbook.Dispose()
Spire.XLS還支持一些“開箱即用”的高級功能:Top/Bottom規(guī)則、高于/低于平均值、介于兩個數(shù)之間。這些在Excel里是內(nèi)置選項,用openpyxl得繞個彎,用Spire.XLS直接調(diào)方法就行。
不過它是收費(fèi)庫,有30天試用期。項目預(yù)算夠、追求開發(fā)效率的情況下可以考慮。
四、怎么選?看你的場景
三個庫沒有絕對的好壞,關(guān)鍵看你想干什么。
openpyxl最適合“既要讀又要寫”的場景。你需要修改現(xiàn)有文件、保留原有內(nèi)容、同時添加新格式,用它最穩(wěn)妥。社區(qū)活躍,遇到問題好搜答案。
xlsxwriter適合“純生成”的場景。跑數(shù)據(jù)分析腳本,自動輸出帶格式的報表,發(fā)給老板或客戶。性能好,文件體積控制得也不錯。配合pandas用,體驗(yàn)很順。
Spire.XLS適合復(fù)雜格式需求的場景。要做多條件嵌套、大量使用公式規(guī)則、或者嫌自己造輪子太麻煩。商業(yè)環(huán)境、預(yù)算允許的情況下,能省不少開發(fā)時間。
五、幾個實(shí)戰(zhàn)技巧
- 公式規(guī)則里,引用要寫對。在條件格式里用公式,注意相對引用和絕對引用。
=A1>100是針對每個單元格判斷,=A$1>100就變成全跟第一行比。 - 規(guī)則有順序。Excel按規(guī)則添加順序執(zhí)行,后面的規(guī)則可能覆蓋前面的。代碼里添加規(guī)則的順序,就是最終生效的順序。
- 別貪多。一個工作表里規(guī)則太多,文件打開會卡。能用一兩條規(guī)則解決的,別繞復(fù)雜邏輯。
- 先清空再添加。如果反復(fù)運(yùn)行腳本,記得先刪掉舊規(guī)則再添新的,不然會疊加上去,結(jié)果亂套。
回到開頭那個周一早上的場景。
用Python寫完條件格式腳本之后,你只需要把新季度數(shù)據(jù)拖進(jìn)文件夾,雙擊運(yùn)行。再打開Excel時,銷售冠軍已經(jīng)標(biāo)成綠色,下滑區(qū)域標(biāo)成橙色,異常值標(biāo)成紅色。老板指著屏幕問“這個月怎么回事”,你三秒就能找到問題出在哪。
那多出來的半小時,不用再對著黑壓壓的數(shù)字發(fā)呆。
以上就是Python代碼操作Excel條件格式的實(shí)戰(zhàn)指南的詳細(xì)內(nèi)容,更多關(guān)于Python操作Excel條件格式的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
基于python腳本實(shí)現(xiàn)軟件的注冊功能(機(jī)器碼+注冊碼機(jī)制)
用戶運(yùn)行程序后,通過文件自動檢測認(rèn)證狀態(tài),如果未經(jīng)認(rèn)證,就需要注冊。這篇文章主要介紹了基于python腳本實(shí)現(xiàn)軟件的注冊功能(機(jī)器碼+注冊碼機(jī)制)的相關(guān)資料,需要的朋友可以參考下2016-10-10
python裝飾器-限制函數(shù)調(diào)用次數(shù)的方法(10s調(diào)用一次)
下面小編就為大家分享一篇python裝飾器-限制函數(shù)調(diào)用次數(shù)的方法(10s調(diào)用一次),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04
一文教會你用Python獲取網(wǎng)頁指定內(nèi)容
Python用做數(shù)據(jù)處理還是相當(dāng)不錯的,如果你想要做爬蟲,Python是很好的選擇,它有很多已經(jīng)寫好的類包,只要調(diào)用即可完成很多復(fù)雜的功能,下面這篇文章主要給大家介紹了關(guān)于Python獲取網(wǎng)頁指定內(nèi)容的相關(guān)資料,需要的朋友可以參考下2022-03-03
Python獲取excel內(nèi)容及相關(guān)操作代碼實(shí)例
這篇文章主要介紹了Python獲取excel內(nèi)容及相關(guān)操作代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08
python+opencv實(shí)現(xiàn)高斯平滑濾波
這篇文章主要為大家詳細(xì)介紹了python+opencv實(shí)現(xiàn)高斯平滑濾波,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12
python數(shù)學(xué)建模(SciPy+?Numpy+Pandas)
這篇文章主要介紹了python數(shù)學(xué)建模(SciPy+?Numpy+Pandas),文章基于python的相關(guān)資料緊接上一篇文章內(nèi)容展開主題詳情,需要的小伙伴可以參考一下2022-07-07
Python中l(wèi)ambda表達(dá)式的用法示例小結(jié)
本文主要展示了一些lambda表達(dá)式的使用示例,通過這些示例,我們可以了解到lambda表達(dá)式的常用語法以及使用的場景,感興趣的朋友跟隨小編一起看看吧2024-04-04
Python實(shí)現(xiàn)滑動平均(Moving Average)的例子
今天小編就為大家分享一篇Python實(shí)現(xiàn)滑動平均(Moving Average)的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08
python OpenCV的imread不能讀取中文路徑問題及解決
這篇文章主要介紹了python OpenCV的imread不能讀取中文路徑問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07

