2017-04-20 14 views
0

私は、さまざまなデータを変換してOpenPyXL 2.4.5経由でXLSXに出力するPython 2.7スクリプトを持っています。現在、私は "max_row"と "max_column"を使って絞り込んだすべてのセルを反復処理しています。これは私にとって非常に速くて効率的ではありません。以下を設定する最も速い方法は何ですか?あなたが一般的な方法を提案できるなら、私はそれを感謝します。以下のラフなベンチマークは、Windows 7 SP1 x64(16 GB RAMおよびIntel [email protected] GHz)です。最も速いフォーマット方法

  • 国境(35880個のセルをフォーマットすると、40代がかかります。)
  • フォントとアライメント(35880個のセルをフォーマットすると、42Sかかります。)
  • シェーディング(35880個のセルをフォーマットすると、28Sかかります。)
  • 未使用の行/列を(非表示16,380列×1,039,606行の非表示は数分かかります。列のみの非表示は.2秒です)。

以下は反復方法です。

def format_xlsx(csv_list, ws_to_format): 
    """ Use OpenPyXL to format a XLSX. """ 
    process_start = timer() 
    for row in csv_list: 
     count = count + 1 
     ws_to_format.append(row) 
    row_count = ws_to_format.max_row 
    column_count = ws_to_format.max_column 
    for y_axis in range(1, column_count+1): 
     for x_axis in range(1, row_count+1): 
      ws_to_format = xlsx_borders(ws_to_format, x_axis, y_axis) 
      ws_to_format = xlsx_shading(ws_to_format, x_axis, y_axis) 
      ws_to_format = xlsx_font_and_alignment(ws_to_format, x_axis, y_axis) 
    ws_to_format = xlsx_hide_unused_colrow(ws_to_format) 
    return 

以下は、未使用の行/列を非表示にする方法論です。彼らは彼らが呼ばているたびに計算されているよう

def xlsx_hide_unused_colrow(ws_to_format): 
    row_count = ws_to_format.max_row 
    column_count = ws_to_format.max_column 
    start_range = column_number_to_letter(column_count+2) 
    end_range = column_number_to_letter(16384) 
    ws_to_format.column_dimensions.group(start_range, end_range, hidden=True) 
    start_range = row_count+2 
    for y in xrange(start_range, 1048577): 
     ws_to_format.row_dimensions[y].hidden=True 

答えて

0

あなたは、ループ内ws.max_rowws.max_columnを呼び出してはなりません。ワークシートのサイズは作業中に変更されないため、一度呼び出すだけで済みます。

さらに、行と列のディメンションにスタイルを適用すると、期待通りの効果が得られない可能性がありますので、これに関するドキュメントを参照してください。関連する行と列のセルにスタイルを適用する必要があります。フォーマットするセルがたくさんある場合は、名前付きスタイルを使用します。

+0

- ポインタがありがとうございます。私はPythonの初心者ですので、愚かであれば疑問を言い訳しますが、forループの外側に "max_row"/"max_column"を指定していないのですか? – Burzin

+0

ネストした関数で 'max_column'を呼び出し、forループでこの関数を呼び出します。 –

関連する問題