我使用openpyxl 2.5.6和py 3.7.0。我的目标是读取Excel工作簿,并将每个单元格的内容和格式打印到CSV中。例如,如果一个单元格是蓝色的文本“数据”,那么我会在单元格值前加上一个标签"blu“,打印到CSV作为"bluData”,并同样地使用一个粗体的单元格和其他填充颜色,等等。
对于带有静态格式的单元格,我可以很好地做到这一点,但对于条件格式则不行。我的问题是,我不知道如何判断是否应用了条件格式规则。我找到了conditional_formatting._cf_rules
dxf,但我只看到了公式、优先级、dxfId和dxf规则本身之类的属性。我想相信是否应用了cf规则的数据可能存储在某个地方,但我找不到它可能在哪里。
到目前为止,我的代码看起来是这样的。
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文件看起来像这,
我的规则看起来像这,
从上述代码接收到的控制台输出是
---------------------------- C1 ----------------------------
FF92D050 rgb ['$A1-$B1>0'] None 2
FFFF0000 rgb ['$A1-$B1<0'] None 1
输出显示规则是正确的,但是我想知道是否有一种方法来判断这些规则中的哪一条,如果有的话,实际上适用于单元格。
我越来越怀疑它是在Excel运行时计算出来的,所以我的替代方法是编写一个Excel公式解释器,但我真的希望通过任何方法来避免这种情况,因为我不确定我是否有能力这样做。
发布于 2022-05-09 06:12:02
如果您找不到更好的选择,那么下面我的评论就是一个例子,说明了您可以使用Xlwing做些什么。
对于示例输出,A1比B1高,因此单元格C1是绿色的。
A1 = 1236
B1 = 1235
如果将A1更改为1234,则C1颜色返回为红色,如果在保存工作簿后运行相同的代码,则“应用于条件格式单元格的颜色:”将用于“条件格式1”,即红色
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("")
输出
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
https://stackoverflow.com/questions/72145347
复制相似问题