2016-11-07 4 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インスタンスは、キーが(row_idx, col_idx)タプルあるdictにすべての非空のセルを格納し、値がCellインスタンスです。セルが空の場合(値もスタイルもない場合)、dictには格納されません。

ワークブックをread_only=Falseでロードすると、ワークシートを反復せずに反復処理できます。 _cells保護属性にアクセスできます。

あなたは、このようなitre_colsを実装することができます:細胞は、セルのリストがある

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 

座標:

ワークシート内のセルのバウンディングボックスを計算するために、この機能を使用することができます:

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バージョンのExcelで動作します。私はこのエラーがありました:openpyxl.utils.exceptions.InvalidFileException:openpyxlは古い.xlsファイルフォーマットをサポートしていません。xlrdを使用してこのファイルを読み込んだり、最新の.xlsxファイルフォーマットに変換してください –

2

openpyxlは(XLSX/XLSM/xltx/XLTM)古いExcelファイルを処理するために、古いモジュールであり、iter_cols()は、あなたが現在使用しているファイル・アクセス・モードで有効になっていません。あなたはアクセスモードを読み取り専用に変更することができます。 print settingsを使用できます。

あなたのような他の多くのモジュールを使用することができます

さも:ここ の中から選択するいくつかのオプションがあります

  • xlwt(XLSファイルを書き込み)
  • xlrd(XLS/XLSXファイルを読み込む)
  • xlsxwriter (xlsxファイルを書き込む)
+0

"古いExcelファイル"が意味するものを明確にすることができますか?あなたが挙げるものはすべて新しいフォーマットであり、xlsなどは古いものです。だから私があなたの言うことは意味を成さないように思われる何か微妙なものを逃していない限り... – Neil

関連する問題