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