您正在使用只讀工作簿。
問題是,和Worksheet.iter_cols()
方法通過使用Worksheet.cell()
動態創建「缺失」單元來改變工作表的內部結構。
如果事實上,Worksheet
實例存儲所有非空細胞在dict
,其中鍵是(row_idx, col_idx)
元組,和值Cell
實例。如果一個單元格是空的(沒有值,沒有樣式),它不存儲在dict
。
如果使用read_only=False
加載工作簿,則可以迭代工作表而不會改變它。您可以訪問_cells
受保護的屬性。
您可以使用此功能來計算一個工作表單元格的邊框:
def calculate_indexes(cells):
# Really efficient and low memory consuming (was profiled) algorithm
min_row_idx, min_col_idx = next(iter(cells), (1, 1))
max_row_idx, max_col_idx = min_row_idx, min_col_idx
for row_idx, col_idx in cells:
min_col_idx = min_col_idx if min_col_idx < col_idx else col_idx
min_row_idx = min_row_idx if min_row_idx < row_idx else row_idx
max_col_idx = max_col_idx if col_idx < max_col_idx else col_idx
max_row_idx = max_row_idx if row_idx < max_row_idx else row_idx
return min_col_idx, min_row_idx, max_col_idx, max_row_idx
凡細胞是細胞的座標列表:
然後你可以實現一個itre_cols
這樣:
def iter_cols(ws):
min_col_idx, min_row_idx, max_col_idx, max_row_idx = calculate_indexes(ws._cells.keys())
for col_idx in range(min_col_idx, max_col_idx + 1):
yield [(ws._cells[(row_idx, col_idx)] if (row_idx, col_idx) in ws._cells else None)
for row_idx in range(min_row_idx, max_row_idx + 1)]
for col in iter_cols(ws):
print(col)
'iter_cols()'顯式禁用只讀模式,如異常告訴你。 –