2016-11-07 47 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