如何在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文件)