【问题标题】:Python openpyxl dimensions are one more in rows and columnsPython openpyxl 维度在行和列中多了一个
【发布时间】:2020-10-03 08:13:21
【问题描述】:

openpyxl 工作表的尺寸似乎比实际的电子表格多一个。例如,我创建了一个 3x3 Excel 文件,如下所示:

food | price | weight |
banana | 15 | 20.3 |
orange | 13 | 33.2 |

但是openpyxl工作表ws有以下属性:

ws.max_column = 4
ws.max_row = 4
ws.dimensions = A1:D4

是否故意这样做,以便我们可以使用 range(1, max_row) 和 range(1, max_column) 进行迭代而不添加 +1?

【问题讨论】:

  • 听起来您在现有工作表中添加了一些单元格。您几乎不需要在自己的代码中使用ws.max_rowws.max_column
  • 查理,你是对的——max_row、max_column和维度都是内存中的只读属性。当我们添加一个新单元格甚至只是访问一个单元格时,它们会发生变化。我必须查找 ws["D4"] 而不在 shell 中设置一个值,使其成为 4x4 ws。现在我用“ws[”D4”] = None”将它保存到一个excel文件中,然后将其加载回来,这次它显示为3x3。所以我想只要我们不向工作表添加或访问新单元格,我们仍然可以使用它们。教程有这个注意:直接访问它们会在内存中创建它们,即使你没有给它们赋值。

标签: openpyxl


【解决方案1】:

经过更多调试,很明显这些属性都在内存中,并且只有在您没有添加或访问超出从 Excel 文件加载的内容时才使用它们。最好使用您自己的代码来查找 max_row 和 max_column,如下所示:

def nRows(self):    # Assume Column A has the most rows
    n = 100
    for i in range(1, n):
        rowA = self.ws['A'+str(i)]  # Column A, row i
        if self.ws['A'+str(i)].value is None:
            break
    self.nRows = i - 1
 
def nColumns(self):
    n = 0
    alphabets = [chr(i) for i in range(ord('A'), ord('Z'))] # Assume no more than 26 columns
    for j in alphabets:
        n += 1
        if self.ws[j + str(1)].value is None:   # Column j, row 1 (heading row)
            break
    self.nColumns = n - 1

以下是每个函数依次调用后的值:

所以如果你以后打印它们

for i in self.ws.values:
    for j in i:
        print(j, end = ' | ')
    print()

你得到一个额外的行和列:

food | price | weight | None | 
banana | 15 | 20.3 | None | 
orange | 13 | 33.2 | None | 
None | None | None | None | 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 2020-05-18
    • 2022-06-10
    • 2018-09-25
    • 2017-01-22
    • 2016-04-05
    • 1970-01-01
    相关资源
    最近更新 更多