2016-11-07 114 views
0
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()时,发生错误。如何在python中创建openpyxl中的列列表

+1

'iter_cols()'显式禁用只读模式,如异常告诉你。 –

回答

3

您正在使用只读工作簿。

问题是,​​和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) 
+0

只是在excel的更新版本中工作。我有这个错误:openpyxl.utils.exceptions.InvalidFileException:openpyxl不支持旧的.xls文件格式,请使用xlrd读取此文件,或将其转换为更新的.xlsx文件格式 –

2

openpyxl是一个旧模块来处理旧的Excel文件(XLSX/XLSM/XLTX/XLTM),该iter_cols()不是在你当前正在使用的文件访问模式下启用。您可以更改只读访问模式。你可以使用print settings

否则,您可以使用许多其他的模块,如: 这里有一些选项可以选择:

+0

你能否澄清你的意思是“旧的excel文件”,因为你列出的都是较新的格式,而xls等是较旧的格式。所以,除非我错过了一些微妙的东西,你认为这似乎没有道理...... – Neil