首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在openpyxl中,是否有一种方法可以查看对单元格应用了哪些条件格式规则?

在openpyxl中,是否有一种方法可以查看对单元格应用了哪些条件格式规则?
EN

Stack Overflow用户
提问于 2022-05-06 17:27:58
回答 1查看 370关注 0票数 1

我使用openpyxl 2.5.6和py 3.7.0。我的目标是读取Excel工作簿,并将每个单元格的内容和格式打印到CSV中。例如,如果一个单元格是蓝色的文本“数据”,那么我会在单元格值前加上一个标签"blu“,打印到CSV作为"bluData”,并同样地使用一个粗体的单元格和其他填充颜色,等等。

对于带有静态格式的单元格,我可以很好地做到这一点,但对于条件格式则不行。我的问题是,我不知道如何判断是否应用了条件格式规则。我找到了conditional_formatting._cf_rules dxf,但我只看到了公式、优先级、dxfId和dxf规则本身之类的属性。我想相信是否应用了cf规则的数据可能存储在某个地方,但我找不到它可能在哪里。

到目前为止,我的代码看起来是这样的。

代码语言:javascript
复制
from openpyxl import load_workbook

wb = load_workbook('Workbook_Name.xlsx', data_only = True)
ws = wb['Worksheet1']

# Code that shows me each cf rule's formula, fill type, priority, etc
cellrangeslist = list(ws.conditional_formatting._cf_rules)
for cellrange in cellrangeslist:
    print('{:30s}{:^10s}{:30s}'.format('----------------------------',str(cellrange.sqref),'----------------------------'))
    for i in cellrange.cfRule:
        print('{:10s}{:8s}{:40s}{:10s}{:10s}'.format(str(i.dxf.fill.bgColor.index), str(i.dxf.fill.bgColor.type), str(i.formula), str(i.stopIfTrue), str(i.priority)))


# This is where I want to be able to identify which cf rule is applied to a given cell
#
#
#

# Code that interprets cell styling into appropriate tags, e.g.
for r in ws.iter_rows(min_row = ws.min_row, max_row = ws.max_row, min_col = ws.min_column, max_col = ws.max_column):
     for cell in r:
          if cell.font.b == True:
                 cell.value = "[bold]"+cell.value

# Code to write each cell as a string literal to a CSV file
#
#
#

我的Excel文件看起来像

  • A1 == 1234
  • B1 == 1235
  • C1 == '=A1-B1‘

我的规则看起来像

  • 公式:=$A1 - $B1 < 0,格式:红色填充,适用于:=$C$1
  • 公式:=$A1 - $B1 > 0,格式:绿色填充,适用于:=$C$1

从上述代码接收到的控制台输出是

代码语言:javascript
复制
----------------------------      C1    ----------------------------
FF92D050  rgb     ['$A1-$B1>0']                           None      2
FFFF0000  rgb     ['$A1-$B1<0']                           None      1

输出显示规则是正确的,但是我想知道是否有一种方法来判断这些规则中的哪一条,如果有的话,实际上适用于单元格。

我越来越怀疑它是在Excel运行时计算出来的,所以我的替代方法是编写一个Excel公式解释器,但我真的希望通过任何方法来避免这种情况,因为我不确定我是否有能力这样做。

EN

回答 1

Stack Overflow用户

发布于 2022-05-09 06:12:02

如果您找不到更好的选择,那么下面我的评论就是一个例子,说明了您可以使用Xlwing做些什么。

对于示例输出,A1比B1高,因此单元格C1是绿色的。

A1 = 1236

B1 = 1235

如果将A1更改为1234,则C1颜色返回为红色,如果在保存工作簿后运行相同的代码,则“应用于条件格式单元格的颜色:”将用于“条件格式1”,即红色

代码语言:javascript
复制
import xlwings as xw
from xlwings.constants import RgbColor


def colour_lookup(cfc):
    cell_colour = (key for key, value in colour_dict.items() if value == cfc)
    for key in cell_colour:
        return key


colour_dict = { key: getattr(RgbColor, key) for key in dir(RgbColor) if not key.startswith('_') }


wb = xw.Book('test.xlsx)
ws = wb.sheets('Sheet1')

cf = ws['C1'].api.FormatConditions
print("Number of conditional formatting rules: " + str(cf._inner.Count))
print("Colour applied to conditional format cell:\n\tEnumerated: " +
      str(cf._inner.Parent.DisplayFormat.Interior.Color))
print("\tRGBColor: " + colour_lookup(cf._inner.Parent.DisplayFormat.Interior.Color))

print("------------------------------------------------")

for idx, cf_detail in enumerate(cf, start=1):
    print("Conditional Format " + str(idx))
    print(cf_detail._inner.Formula1)
    print(cf_detail._inner.Interior.Color)
    print("\tRGBColor: " + colour_lookup(cf_detail._inner.Interior.Color))
    print("")

输出

代码语言:javascript
复制
Number of conditional formatting rules: 2
Colour applied to conditional format cell:
    Enumerated: 32768.0
    RGBColor: rgbGreen
------------------------------------------------
Conditional Format 1
=$A1-$B1<0
255.0
    RGBColor: rgbRed

Conditional Format 2
=$A1-$B1>0
32768.0
    RGBColor: rgbGreen

木翅

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72145347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档