如何迭代 StyleFrame 中的行?

How to iterate rows in StyleFrame?

我想通过遍历行来查找彩色单元格。

我知道如何迭代列,但不知道如何迭代行。
在 pandas 数据框中,它将是

for i in range(0, len(df.index), 1):
    print(df.loc[i, 1])

但是StyleFrame没有loc。我如何迭代它并检查彩色单元格?

谢谢!

这里是 StyleFrame 维护者...那很有趣...

这里的问题由两部分组成:

  • Pandas' read_excel(StyleFrame 使用)的默认行为是跳过空白行。值得庆幸的是,它接受一个关键字参数来改变这种行为,StyleFrame 的 read_excel 将它不知道的每个关键字参数传递给 Pandas。因此这个问题可以很容易地解决:

    StyleFrame.read_excel('test.xlsx', read_style=True, skip_blank_lines=False)
    
  • 第二个 issue/problematic 行为是 openpyxl 设置背景未更改(或已设置为 "automatic" 或 "no fill" 的单元格的背景颜色,取决于您的电子表格软件)到“000000”,这是黑色的。

    这在 StyleFrame 中引入了一个错误,老实说,我不确定直到现在才浮出水面。

    要解决此问题,您可以对 StyleFrame 的代码进行少量更改。 styler.py 中的第 111 行(假设您使用的是 StyleFrame 的 2.0.5 版)应从

    更改
    bg_color = openpyxl_style.fill.fgColor.rgb
    

    bg_color = openpyxl_style.fill.fgColor.rgb if openpyxl_style.fill.patternType is not None else utils.colors.white
    

    此更改将包含在下一版本中。

然后,在解决了以上两个问题之后,解决您的实际问题就变得相对容易了(尽管没有我希望的那么容易):

from StyleFrame import StyleFrame, utils

def only_cells_with_colored_background(cell):
    return cell if cell.style.bg_color not in {utils.colors.white, 'FFFFFFFF'} else np.nan

sf = StyleFrame.read_excel('test.xlsx', read_style=True, skip_blank_lines=False)
sf = StyleFrame(sf.applymap(only_cells_with_colored_background).dropna(axis=(0, 1),
                how='all'))
print(sf)

会输出

   Unnamed: 0
2           a
3           b
4           c
9           a
10          b
11          c


我计划在未来的版本中实现一个 .style 访问器,所以希望上面的例子会像

一样简单
sf = StyleFrame.read_excel('test.xlsx', read_style=True, skip_blank_lines=False)
sf = sf.loc[~(sf['Unnamed: 0'].style.bg_color == utils.colors.white)]

当我尝试在 StyleFrame 中使用 skip_blank_lines=False 时,出现以下错误: TypeError: read_excel() got an unexpected keyword argument 'skip_blank_lines'