代码之家  ›  专栏  ›  技术社区  ›  Mad Physicist

确定openpyxl中的工作表是否为空

  •  2
  • Mad Physicist  · 技术社区  · 9 年前

    我有一个应用程序,如果已经有数据,我会将工作表写入最后一列+2,如果工作表为空,则写入最后一栏+1。我得到了一张我认为是空的工作表,如下所示:

    from openpyxl.workbook.workbook import Workbook
    book = Workbook()
    sheet = book.active
    

    当我这样做的时候 sheet.max_row sheet.max_column ,我知道 1 对于这两个属性。我希望得到零,因此我执行以下操作:

    if sheet.max_row == 1 and sheet.max_column == 1 and not sheet['A1'].value:
        start_col = 1
    else:
        start_col = sheet.max_column + 2
    

    检查单元格的值似乎有点过分,更不用说容易出错了。我最初预期以下内容会奏效:

    if sheet.max_column == 0:
        start_col = 1
    else:
        start_col = sheet.max_column + 2
    

    有什么原因吗 max_row max_column 总是 >= 1 ? 这是一个bug、一个有意的特性还是其他东西的合理副作用?最后,是否有解决办法(例如 sheet.isempty() ).

    顺便说一句,我在浏览bug跟踪器时发现了以下评论: https://bitbucket.org/openpyxl/openpyxl/issues/514/cell-max_row-reports-higher-than-actual#comment-21091771 :

    单元格为空的行仍然是行。它们可能被格式化以供将来使用或其他东西,我们不知道。2.3稍微改进了启发式,但仍将包含空单元格行。

    这个(和另一个我再也找不到链接的评论)让我相信第一个细胞实际上总是存在的。在这种情况下,值得提交功能请求吗?

    2 回复  |  直到 9 年前
        1
  •  5
  •   Charlie Clark    9 年前

    确定工作表是否为“空”的唯一可靠方法是查看 _cells 属性然而,这是内部API的一部分,很容易更改。事实上,它几乎肯定会改变。

    这个 max_row max_column 属性在内部用于计数器,并且必须为1或更多。

    没有相关代码和测试的特性请求将被拒绝,我对“空”工作表的想法持怀疑态度。

        2
  •  0
  •   Moriartyalex    3 年前

    由于我没有找到任何直接的答案,所以我添加了这个。

    from openpyxl import load_workbook
    book = load_workbook('sample.xlsx')
    sheet = book.active
    
    if [cell.value for cells in sheet.rows for cell in cells] == [None]:
        print ("Sheet is empty")
    

    **页。 也可以替换为 板材.柱 ,两者都是分别按行和列迭代单元格的生成器。因此,使用列表理解来列出值将有助于我们检查空表。