如何使用Python更有效地查找表的高度

时间:2015-06-02 17:06:12

标签: algorithm python-2.7 openpyxl

我正在使用openpyxl从Excel电子表格中复制数据。数据是库存数据库的表,其中每行是数据库中的条目。我使用for循环一次读取一行表。为了确定for循环的范围,我编写了一个函数来检查表中的每个单元格以查找表的高度。

代码:

def find_max(self, sheet, row, column):
    max_row = 0
    cell_top = sheet.cell(row = row - 1, column = column)
    while cell_top.value != None:
        cell = sheet.cell(row = row, column = column)
        max = 0
        while cell.value != None or sheet.cell(row = row + 1, column = column).value != None:
            row += 1
            max = max + 1
            cell = sheet.cell(row = row, column = column)
        if max > max_row:
            max_row = max
        cell_top = sheet.cell(row = row, column = column + 1) 

    return max_row

为了总结该功能,我移动到工作表中的下一列,然后遍历该表中的每个单元格,跟踪其高度,直到没有更多列。关于这个函数的问题是它必须连续找到两个空单元格才能使条件失败。在之前的版本中,我使用了类似的方法,但只使用了一列,并在找到空白单元格后立即停止。我必须更改它,以便在用户忘记填写列时程序仍然会运行。这个函数适用于小型表,但在具有数百个条目的表上,这使得程序运行得慢得多。

我的问题是:我可以做些什么来提高效率?我知道嵌套一个while循环,这会让程序花费更长时间,但我不知道如何解决它。我必须使程序尽可能万无一失,所以我需要检查多个列来阻止用户错误导致程序失败

2 个答案:

答案 0 :(得分:0)

这是未经测试的,但每次我使用openpyxl时,我会迭代所有行,如下所示:

for row in active_worksheet:
    do_something_to(row)

所以你可以算作:

count = 0
for row in active_worksheet:
    count += 1

编辑:这是一个更好的解决方案:Is it possible to get an Excel document's row count without loading the entire document into memory?

答案 1 :(得分:0)

只读模式在源上逐行工作,因此您可能希望将其挂钩。或者,您可以将工作表的单元格传递给Pandas矩阵,该矩阵具有空单元格的索引。