OpenPyXL-以相反的顺序遍历行,从ws.max_row到1

时间:2018-08-15 20:44:52

标签: python python-3.x openpyxl

我希望使用OpenPyXL删除工作表中的空白行,并认为最好的方法是从底部开始使用max_row,然后向上迭代。

我知道要以相反的顺序遍历集合,请使用reversed():

a = ["foo", "bar", "baz"]
for i in reversed(a):
    print(i)

但是,我不确定如何将其转换为OpenPyXL行集合。

目前,我有这个,但我想知道是否有更好的方法来继续使用reversed()

for i in range(ws.max_row, 1, -1):
    print(i)

重要说明:我正在标识和删除空行,并想知道这将如何影响遍历 collection 的行?

2 个答案:

答案 0 :(得分:1)

rows = list(sheet.iter_rows(min_row=1, max_row=sheet.max_row)
if needReversed:
    rows = reversed(rows)
for row in rows:
    print(row[0].value)

答案 1 :(得分:0)

对,所以这就是我的做法。尽管作者查理·克拉克(Charlie Clark)建议使用reversed,但我仍未确定使用该方法的语法。

但是,这很好:

print('BEGIN: sheet.max_row: ' + str(sheet.max_row))

for rr in range(sheet.max_row, 1, -1):
    hasData = False
    for cc in range(1, sheet.max_column+1):
        tmp = AlphaFromIndex(cc)
        ref = str(tmp) + str(rr)
        val = sheet[ref].value
        if val is not None: hasData = True
    if not hasData:
        print('Row: ' + str(rr) + ' -- Deleting row: ' + str(rr))
        sheet.delete_rows(rr, 1)
    else:
        print('Row: ' + str(rr) + ' of (' +str(sheet.max_row)+')')

print('END: sheet.max_row: ' + str(sheet.max_row))

def AlphaFromIndex(num):
    ab = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
    return ab[num - 1]

*但是*

此练习的主要好处是,OpenPyXL不会更新任何已删除行下方的行中的公式。因此,在OpenPyXL 中删除空白行是一个坏主意,因为任何现有公式现在都将引用错误的行。