LoginSignup
17
15

More than 3 years have passed since last update.

openpyxlのアクセス方法による処理速度の違い

Last updated at Posted at 2018-09-12

Exelファイルをアップロードしてごにょごにょする機能でタイムアウトが発生した際に見つけたこと

workbook = load_workbook(hoge_file, read_only=True)
sheet = workbook.get_sheet_by_name('Sheet1')

for row in range(7, 1000):
    data = sheet['C%d' % row].value

workbook = load_workbook(hoge_file, read_only=True)
sheet = workbook.get_sheet_by_name('Sheet1')

for rows in sheet.iter_rows(min_row=7, max_col=5, max_row=1000):
    data = rows[0].value

当初は上の書き方のようにセル番地直接指定でデータにアクセスしていました。
実装時は、数ループでの動作確認しかしていなかったため処理速度の低下には気づきませんでしたが、実業務を想定したデータ(10000行程)を突っ込むといつまで経っても処理が終わらない...って事態に...。

1500行程のデータで十分に処理速度の低下が実感できました。

そこでセル番地直接指定でなく、後者のようにイテレーションさせながらアクセスするようにするとものの数秒で処理が正常終了

ある程度の行数が見込まれるExcelファイルへのopenpyxlを使用したデータアクセスはイテレーションさせながらアクセスしましょう。

追記

get_sheet_by_name はdeprecated (2020/06/30 確認時点)になっているので、この場合はworkbook['Sheet1]を利用しましょう。
参考: https://openpyxl.readthedocs.io/en/stable/_modules/openpyxl/workbook/workbook.html#Workbook.get_sheet_by_name

17
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
15