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

Determine if worksheet is empty in openpyxl

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

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

当我执行 sheet.max_rowsheet.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_rowmax_column 总是 >= 1?这是错误、有意设计的功能还是其他东西的合理副作用?最后,是否有解决方法(例如 sheet.isempty())。

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

Rows with empty cells are still rows. They might be formatted for future use or other stuff, we don't know. 2.3 has slightly improved heuristics but will still contain rows of empty cells.

这个(以及我再也找不到 link 的另一个评论)让我相信第一个单元格实际上总是存在的。在这种情况下,是否值得提交功能请求?

确定工作表是否为 "empty" 的唯一可靠方法是查看 _cells 属性。但是,这是内部 API 的一部分,可能会更改。事实上它几乎肯定会改变。

max_rowmax_column 属性在内部用于计数器,必须为 1 或更多。

没有相关代码和测试的功能请求将被拒绝,我对 "empty" 工作表的想法总体上持怀疑态度。

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

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")

**sheet.rows也可以换成sheet.column,都是生成器来迭代分别按行和列排列的单元格。所以使用列表理解来列出值将帮助我们检查空 sheets.