Python openpyxl维度是行和列中的又一个维度

Python openpyxl维度是行和列中的又一个维度,openpyxl,Openpyxl,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_行)和range(1,max_列)

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_行)和range(1,max_列)进行迭代而不添加+1?

经过更多调试后,很明显这些属性都在内存中,只有在您没有添加或访问从excel文件加载的内容之外的内容时才使用它们。最好使用您自己的代码(如下面所示)来查找max_行和max_列:

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 | 

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