如何使用 OpenPyxl 确定 Excel 工作表中的行是否被删除

How to determine if a row is striked in Excel sheet using OpenPyxl

提问人:Quicky 提问时间:11/10/2023 更新时间:11/10/2023 访问量:54

问:

我正在使用 openpyxl 读取 excel 文件,但遇到以下问题:

有些单元格似乎在 excel 中被罢工,并且它们的单元格罢工属性为 True,我成功地使用 Openpyxl 处理了它们

但是有些单元格似乎在 excel 中被删除,但格式单元格删除属性为 False。 这是因为设置了行罢工属性。

我的问题是我无法成功使用 OpenPyxl 访问行的罢工属性

    sheet = book[sheet_name]
    for row in sheet[0:sheet.max_row]:
        if sheet.row_dimensions[row[0].row].font.strike:
            break

我的代码永远不会中断,尽管有些行被删除了

奇怪的是,当我查看row_dimensions工作表时,我没有看到每行的条目,而只看到某些行的条目,而我没有任何删除的行的条目。 我不明白在什么标准上,有些行有相应的row_dimensions,有些没有

您知道如何进行或对此有所了解吗?

python excel openpyxl

评论

0赞 Corralien 11/10/2023
sheet[0:sheet.max_row]它真的有效吗?
0赞 Quicky 11/10/2023
是的,效果很好!
1赞 Charlie Clark 11/10/2023
如文档中所述,与样式并不真正相关;你总是必须一个单元格一个单元格地走。row_dimensions
0赞 Quicky 11/11/2023
@CharlieClark,但正如我所提到的,当设置行属性罢工时,即使在 excel 中,您也没有单元格级别的信息。行有自己的属性,这些属性不会出现在单元格级别,因此独立于 Openpyxl,您逐个单元格处理的解决方案无关紧要
0赞 Charlie Clark 11/14/2023
该规范对行和列格式非常清楚,openpyxl 为可能想要使用它的应用程序预设了它。

答:

0赞 Corralien 11/10/2023 #1

使用此输入:

enter image description here

下面的代码似乎有效:

from openpyxl import Workbook

book = load_workbook(filename='Book 1.xlsx')
sheet = book['Sheet1']

for row_id, row in sheet.row_dimensions.items():
    if row.font.strike:
        print(f'{row_id}: strike row')

for row in sheet.iter_rows():
    for cell in row:
        cell_id = f'{cell.column_letter}{cell.row}'
        if cell.font.strike:
            print(f'{cell_id}: strike cell')

输出:

1: strike row
A1: strike cell
B1: strike cell
C1: strike cell
D1: strike cell
B2: strike cell
D2: strike cell

评论

0赞 Quicky 11/10/2023
嗨,我在我的 excel 文件上尝试了您的代码,只显示罢工单元格消息。未检测到罢工行。您使用哪个版本的 openpyxl ?
0赞 Corralien 11/10/2023
openpyxl==3.1.2(最新版本)。对于这个版本,我不能使用sheet[0:sheet.max_row]
0赞 Quicky 11/11/2023
好的,我有 3.0.10 版,我会要求有 3.1.2 版
0赞 Quicky 11/15/2023
事实上,它没有出现在行属性中,因为它是由于条件格式。似乎当条件格式应用于单元格时,修改不会出现在 Excel 中的单元格格式信息中,而 openpyxl 反映了这一点