この記事の対象者
- openpyxlを使用していて、エクセルへの書き込みが遅いと感じたことがある
- openpyxlでの書き込みを速くしたい
- Python初心者で、できるだけわかりやすく説明してほしい
この記事を読んでわかること
- openpyxlでの書き込みが遅い原因がわかる
- openpyxlでの書き込みが遅い場合の対処法がわかる
openpyxlで書き込みが遅い場合の原因と対処法
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
書き込みが遅い原因としてよくあるのは以下の4つです。
- セル1つ1つに書き込みしている
- 大量の書式を変更しようとしている
- エクセルファイルが重い
- 空きメモリが少ない
1つ1つ対処法も含めて解説していきます。
セル1つ1つに書き込みしている
セル1つ1つに書き込みをしている場合、処理が遅くなるときがあります。
コードとしては以下のような場合です。
ws['A1'] = 1
ws['B1'] = 2
ws['C1'] = 3
ws['A2'] = 4
ws['B2'] = 5
ws['C2'] = 6
ws['A3'] = 7
ws['B3'] = 8
ws['C3'] = 9
下記のfor文も同様に遅いです。
x, y=1, 1
data = [[1, 2, 3],[4, 5, 6],[7, 8, 9]]
for row in data:
for cell in row:
ws.cell(row=y, column=x).value = cell
x += 1
y += 1
x = 1
これらの書き方が悪いわけではありません。
確かにこの書き方は「簡単でわかりやすい」ので、特に初心者はこの書き方をしてしまいがちです。
私のブログでも、わかりやすくするために、この書き方を採用している記事もあります。
しかしながら、この書き方は「1人ずつにメールを送る」ようなもので、処理は遅いです。
処理を速くしたい場合は、「一斉送信」をするような書き方をする必要があります。
そんな「一斉送信」で書き込みが速くなるコードは以下のとおりです。
data = [[1, 2, 3],[4, 5, 6],[7, 8, 9]]
for row in data:
ws.append(row)
こちらのコードは、「行ごとに書き込み」をしています。
これで全体の書き込み速度が改善する場合があります。
大量のデータを書き込みする場合、500行や1000行ずつデータを分割してバッチ処理を行うことで、処理が速くなる場合があります。
# 大量のデータを準備(例として10000行のデータを用意)
data = [[f"Row {i}", i] for i in range(1, 10001)] # [ ["Row 1", 1], ["Row 2", 2], ..., ["Row 10000", 10000] ]
# バッチサイズを設定
batch_size = 1000
# バッチ処理でデータを書き込み
for i in range(0, len(data), batch_size):
batch = data[i:i + batch_size] # データを1000行ごとに分割
for row in batch:
ws.append(row) # 一度に1000行書き込む
バッチ処理を行うことで、一行ずつ書き込むよりさらに速く処理が進みます。
大量の書式を変更しようとしている
フォントの色や罫線など書式を大量に変更しようとすると、処理が遅くなる場合があります。
例えていえば、「部屋の配置換え」や「壁紙の貼り替え」を行うようなものです。
エクセルが数十部屋あるマンションだと考えると、遅くてあたりまえですよね。
処理が遅いと感じたら、優先度の低い書式設定は省くことも考えてみてください。
エクセルファイルが重い
読み書きするエクセルファイルが重い場合、書き込みは遅くなります。
軽い荷物は速く運べますが、重い荷物は運ぶのに時間がかかるのと同じことです。
速く処理できるように、できるだけ軽くしておきましょう。
不必要な部分は削除して、軽量化しましょう。
空きメモリが少ない
エクセルファイルを読み書きするためには、メモリを使用します。
処理によっては大量のメモリを必要とする場合があるため、空きメモリが少ないと書き込みが遅くなります。
メモリはよく「机の上」に例えられます。
「空きメモリが少ない = 机に空いたスペースが少ない」ということです。
少ないスペースでは作業がしにくいように、メモリの空きが少ないと処理は遅くなります。
不要になった変数を削除してメモリを解放するか、PCを再起動してメモリをリセットしてみてください。
それでも解決しない時は
前項で「openpyxlの書き込みを速くする方法」をいくつか紹介しましたが、改善しない場合もあるかと思います。
そんな時は、少し方向性を変えてみましょう。
エクセルファイルを編集するPythonライブラリは、「openpyxl」だけではありません。
この機会に別のライブラリも試してみてはいかがでしょうか。
特に「pandas」ライブラリは処理も速くてオススメです。
「pandas」ライブラリの「DataFrame」を使えば、エクセルファイルを編集することができます。
しかしながら、「DataFrame」では、エクセルファイルを一旦「仮想のデータベース」に取り込んで処理するため、計算式が値になってしまったり、書式が引き継げなかったりとデメリットはあります。
下記記事を参考に、目的に合っていると感じたら試してみてください。
最後に
openpyxlで書き込みが遅い原因と対処法を解説いたしました。
当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
挫折せずにPythonを独学で学習する方法は特におすすめです。
最後までお読みいただき、ありがとうございました。がんばってください!