【openpyxl】エクセルへの書き込みが遅い場合の原因と対処法

スポンサードリンク
Python

この記事の対象者

  • 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を独学で学習する方法は特におすすめです。

最後までお読みいただき、ありがとうございました。がんばってください!

タイトルとURLをコピーしました