openpyxl3.0官方文檔(27)—— 條件格式

Excel支持三種不同類型的條件格式:內(nèi)置、標準和自定義俺抽。內(nèi)置條件格式將特定的規(guī)則與預(yù)定義的樣式結(jié)合起來。標準條件格式將特定規(guī)則與自定義格式結(jié)合起來蒋伦。此外沃斤,還可以定義使用差異樣式應(yīng)用自定義格式的自定義公式圣蝎。
注意
不同規(guī)則的語法變化很大刃宵,所以openpyxl不可能知道規(guī)則是否正確衡瓶。
創(chuàng)建格式規(guī)則的基本語法是:

    >>> from openpyxl.formatting import Rule
    >>> from openpyxl.styles import Font, PatternFill, Border
    >>> from openpyxl.styles.differential import DifferentialStyle
    >>> dxf = DifferentialStyle(font=Font(bold=True), fill=PatternFill(start_color='EE1111', end_color='EE1111'))
    >>> rule = Rule(type='cellIs', dxf=dxf, formula=["10"])
    

由于某些規(guī)則非常復(fù)雜,因此有一些方便的工廠函數(shù)來創(chuàng)建它們牲证。

內(nèi)置格式?

內(nèi)置條件格式為:

  • ColorScale
  • IconSet
  • DataBar

內(nèi)置格式包含一系列格式設(shè)置哮针,這些設(shè)置類型與整數(shù)結(jié)合起來進行比較√古郏可能的類型有:“num”十厢、“percent”、“max”捂齐、“min”蛮放、“formula”、“percentile”奠宜。

ColorScale?

你可以有2或3種顏色的色階包颁。兩個色階從一種顏色到另一種顏色產(chǎn)生漸變;三個色階對兩個漸變使用附加顏色压真。
創(chuàng)建色階規(guī)則的代碼為:

    >>> from openpyxl.formatting.rule import ColorScale, FormatObject
    >>> from openpyxl.styles import Color
    >>> first = FormatObject(type='min')
    >>> last = FormatObject(type='max')
    >>> # colors match the format objects:
    >>> colors = [Color('AA0000'), Color('00AA00')]
    >>> cs2 = ColorScale(cfvo=[first, last], color=colors)
    >>> # a three color scale would extend the sequences
    >>> mid = FormatObject(type='num', val=40)
    >>> colors.insert(1, Color('00AA00'))
    >>> cs3 = ColorScale(cfvo=[first, mid, last], color=colors)
    >>> # create a rule with the color scale
    >>> from openpyxl.formatting.rule import Rule
    >>> rule = Rule(type='colorScale', colorScale=cs3)
    

有一個創(chuàng)建色階規(guī)則的便利函數(shù)

    >>> from openpyxl.formatting.rule import ColorScaleRule
    >>> rule = ColorScaleRule(start_type='percentile', start_value=10, start_color='FFAA0000',
    ...                       mid_type='percentile', mid_value=50, mid_color='FF0000AA',
    ...                       end_type='percentile', end_value=90, end_color='FF00AA00')
    

IconSet?

可以從以下圖標集中選擇:“3Arrows”娩嚼、“3ArrowsGray”、“3Flags”滴肿、“3TrafficLights1”岳悟、“3TrafficLights2”、“3Signs”泼差、“3Symbols”贵少、“3Symbols2”、“4Arrows”堆缘、“4ArrowsGray”滔灶、“4RedToBlack”、“4Rating”套啤、“4TrafficLights”宽气、“5Arrows”、“5ArrowsGray”潜沦、“5Rating”萄涯、“5Quarters”`
創(chuàng)建IconSet規(guī)則的代碼為:

    >>> from openpyxl.formatting.rule import IconSet, FormatObject
    >>> first = FormatObject(type='percent', val=0)
    >>> second = FormatObject(type='percent', val=33)
    >>> third = FormatObject(type='percent', val=67)
    >>> iconset = IconSet(iconSet='3TrafficLights1', cfvo=[first, second, third], showValue=None, percent=None, reverse=None)
    >>> # assign the icon set to a rule
    >>> from openpyxl.formatting.rule import Rule
    >>> rule = Rule(type='iconSet', iconSet=iconset)
    

創(chuàng)建IconSet規(guī)則有一個方便的功能:

    >>> from openpyxl.formatting.rule import IconSetRule
    >>> rule = IconSetRule('5Arrows', 'percent', [10, 20, 30, 40, 50], showValue=None, percent=None, reverse=None)
    

DataBar?

目前,openpyxl支持原始規(guī)范中定義的數(shù)據(jù)庫唆鸡。在后來的擴展中添加了一些邊界和方向涝影。
創(chuàng)建DataBar的代碼為:

    >>> from openpyxl.formatting.rule import DataBar, FormatObject
    >>> first = FormatObject(type='min')
    >>> second = FormatObject(type='max')
    >>> data_bar = DataBar(cfvo=[first, second], color="638EC6", showValue=None, minLength=None, maxLength=None)
    >>> # assign the data bar to a rule
    >>> from openpyxl.formatting.rule import Rule
    >>> rule = Rule(type='dataBar', dataBar=data_bar)
    

有一個創(chuàng)建DataBar的便利函數(shù):

    >>> from openpyxl.formatting.rule import DataBarRule
    >>> rule = DataBarRule(start_type='percentile', start_value=10, end_type='percentile', end_value='90',
    ...                    color="FF638EC6", showValue="None", minLength=None, maxLength=None)
    

標準條件格式?

標準條件格式為:

  • Average
  • Percent
  • Unique or duplicate
  • Value
  • Rank
    >>> from openpyxl import Workbook
    >>> from openpyxl.styles import Color, PatternFill, Font, Border
    >>> from openpyxl.styles.differential import DifferentialStyle
    >>> from openpyxl.formatting.rule import ColorScaleRule, CellIsRule, FormulaRule
    >>>
    >>> wb = Workbook()
    >>> ws = wb.active
    >>>
    >>> # Create fill
    >>> redFill = PatternFill(start_color='EE1111',
    ...                end_color='EE1111',
    ...                fill_type='solid')
    >>>
    >>> # Add a two-color scale
    >>> # Takes colors in excel 'RRGGBB' style.
    >>> ws.conditional_formatting.add('A1:A10',
    ...             ColorScaleRule(start_type='min', start_color='AA0000',
    ...                           end_type='max', end_color='00AA00')
    ...                           )
    >>>
    >>> # Add a three-color scale
    >>> ws.conditional_formatting.add('B1:B10',
    ...                ColorScaleRule(start_type='percentile', start_value=10, start_color='AA0000',
    ...                            mid_type='percentile', mid_value=50, mid_color='0000AA',
    ...                            end_type='percentile', end_value=90, end_color='00AA00')
    ...                              )
    >>>
    >>> # Add a conditional formatting based on a cell comparison
    >>> # addCellIs(range_string, operator, formula, stopIfTrue, wb, font, border, fill)
    >>> # Format if cell is less than 'formula'
    >>> ws.conditional_formatting.add('C2:C10',
    ...             CellIsRule(operator='lessThan', formula=['C$1'], stopIfTrue=True, fill=redFill))
    >>>
    >>> # Format if cell is between 'formula'
    >>> ws.conditional_formatting.add('D2:D10',
    ...             CellIsRule(operator='between', formula=['1','5'], stopIfTrue=True, fill=redFill))
    >>>
    >>> # Format using a formula
    >>> ws.conditional_formatting.add('E1:E10',
    ...             FormulaRule(formula=['ISBLANK(E1)'], stopIfTrue=True, fill=redFill))
    >>>
    >>> # Aside from the 2-color and 3-color scales, format rules take fonts, borders and fills for styling:
    >>> myFont = Font()
    >>> myBorder = Border()
    >>> ws.conditional_formatting.add('E1:E10',
    ...             FormulaRule(formula=['E1=0'], font=myFont, border=myBorder, fill=redFill))
    >>>
    >>> # Highlight cells that contain particular text by using a special formula
    >>> red_text = Font(color="9C0006")
    >>> red_fill = PatternFill(bgColor="FFC7CE")
    >>> dxf = DifferentialStyle(font=red_text, fill=red_fill)
    >>> rule = Rule(type="containsText", operator="containsText", text="highlight", dxf=dxf)
    >>> rule.formula = ['NOT(ISERROR(SEARCH("highlight",A1)))']
    >>> ws.conditional_formatting.add('A1:F40', rule)
    >>> wb.save("test.xlsx")
    

格式化整行?

有時您希望將條件格式應(yīng)用于多個單元格,例如包含特定值的一行單元格争占。

    >>> ws.append(['Software', 'Developer', 'Version'])
    >>> ws.append(['Excel', 'Microsoft', '2016'])
    >>> ws.append(['openpyxl', 'Open source', '2.6'])
    >>> ws.append(['OpenOffice', 'Apache', '4.1.4'])
    >>> ws.append(['Word', 'Microsoft', '2010'])
    

我們想突出顯示開發(fā)者是微軟的行燃逻。我們通過創(chuàng)建一個表達式規(guī)則并使用一個公式來識別哪些包含微軟開發(fā)的軟件序目。

    >>> red_fill = PatternFill(bgColor="FFC7CE")
    >>> dxf = DifferentialStyle(fill=red_fill)
    >>> r = Rule(type="expression", dxf=dxf, stopIfTrue=True)
    >>> r.formula = ['$A2="Microsoft"']
    >>> ws.conditional_formatting.add("A1:C10", r)
    

注意
公式對引用的列使用絕對引用,在本例中為“B”伯襟;但對應(yīng)用格式的范圍使用相對行號(在本例中為“1”)猿涨。正確處理此問題可能很困難,但即使規(guī)則已添加到工作表的Conditional
format集合中姆怪,也可以對其進行調(diào)整叛赚。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市稽揭,隨后出現(xiàn)的幾起案子俺附,更是在濱河造成了極大的恐慌,老刑警劉巖溪掀,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件事镣,死亡現(xiàn)場離奇詭異,居然都是意外死亡揪胃,警方通過查閱死者的電腦和手機璃哟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來只嚣,“玉大人沮稚,你說我怎么就攤上這事〔嵛瑁” “怎么了蕴掏?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長调鲸。 經(jīng)常有香客問我盛杰,道長,這世上最難降的妖魔是什么藐石? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任即供,我火速辦了婚禮,結(jié)果婚禮上于微,老公的妹妹穿的比我還像新娘。我一直安慰自己株依,他們只是感情好,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布抹锄。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伙单。 梳的紋絲不亂的頭發(fā)上获高,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音念秧,去河邊找鬼扫沼。 笑死出爹,一個胖子當著我的面吹牛庄吼,可吹牛的內(nèi)容都是我干的缎除。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼总寻,長吁一口氣:“原來是場噩夢啊……” “哼器罐!你這毒婦竟也來了渐行?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤肴沫,失蹤者是張志新(化名)和其女友劉穎蕴忆,沒想到半個月后颤芬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體套鹅,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年菱魔,在試婚紗的時候發(fā)現(xiàn)自己被綠了吟孙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡杰妓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出稚失,到底是詐尸還是另有隱情,我是刑警寧澤吸占,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站矾屯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏件蚕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一牵啦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哈雏,春花似錦、人聲如沸裳瘪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泪酱。三九已至,卻和暖如春西篓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背岂津。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工吮成, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留橱乱,地道東北人粱甫。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像危纫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子种蝶,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355