您正在使用只读工作簿。
问题是,和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()'显式禁用只读模式,如异常告诉你。 –