如何在python中创buildopenpyxl中的列表

import openpyxl infoFilePath='test.xlsx' workbook = openpyxl.load_workbook(infoFilePath,read_only=True) first_sheet = workbook.get_sheet_names()[0] worksheet = workbook.get_sheet_by_name(first_sheet) workbook.active def iter_rows(ws): for row in ws.iter_rows(): yield [cell.value for cell in row] rows = list(iter_rows(worksheet)) print(rows) 

正如你所看到的,我已经成功地将打印“行”列为一个列表。 但是如何打印“列”作为列表? 当我使用ws.iter_cols()时,发生错误。

您正在使用只读工作簿。

问题在于Worksheet.iter_rows()Worksheet.iter_cols()方法通过使用Worksheet.cell()dynamic创build“缺less”单元格来改变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) 

openpyxl是一个旧的模块来处理旧的excel文件(xlsx / xlsm / xltx / xltm), iter_cols()在您当前正在使用的文件访问模式下未启用。 您可以更改只读访问模式。 您可以使用打印设置 。

否则,您可以使用许多其他模块,例如:以下是一些可供select的选项:

  • xlwt (写入xls文件)
  • xlrd (读取xls / xlsx文件)
  • xlsxwriter (写入xlsx文件)