- openpyxlでエクセルファイルを保存しようとしたけど、できなかった
- なんだかよくわからないエラーが発生した
- 保存できない原因と対処法を知りたい
このような事態で困っている人は少なくありません。
実際に私も経験しています。
今回は、openpyxlでエクセルファイルが保存できないパターンの中でよくあるものをまとめてみました。
この記事を読むことで、以下のようなことがわかります。
- openpyxlでエクセルファイルが保存できない原因と対処法がわかる
- エラーを防ぐ方法を学べる
openpyxlでエクセルファイルが保存できないパターン3選
まずは状況を確認しましょう。
エラー画面が表示されていると思います。
下記のようなエラーではありませんか?
- 「PermissionError」が発生
- 「FileNotFoundError」が発生
- 「OSError」が発生
それぞれの原因と対処法を解説いたします。
「PermissionError」が発生
上図のようなエラーが発生した場合は、簡単に解決できます。
初めて発生した場合は焦ってしまいますが、まずは落ち着きましょう。
この「PermissionError」は、簡単に説明すると「ファイルが開かれたままだから、保存できないよ!」と言ってきているエラーです。
詳細は長くなるため割愛しますが、気になる方は下記記事をご参考ください。
PermissionErrorが発生する原因
この「PermissionError」が発生する原因は、「保存しようとしているファイルが開かれたままになっている」ということです。
画面下部のタスクバーを見てください。
エクセルファイルのアイコンがありませんか?
また、開いているエクセルファイルは、openpyxlで保存しようとしているファイルではありませんか?
ファイルが読み取り専用になっている場合もこのエラーが発生しますので、確認してみましょう。
PermissionErrorが発生した場合の対処法
対処法は簡単です。
開いているファイル(今回はinput.xlsx)を閉じるだけです。
ファイルが閉じられたのを確認したら、プログラムを再実行してみてください。
記事後半の「エラーを防ぐ方法」の項で、より高度な対処法も紹介しております。
ファイルが読み取り専用になっている場合は、解除しましょう。
自動で解除する方法は、下記記事で解説しております。
「FileNotFoundError」が発生
上記のようなエラーが発生した場合も、簡単に解決できます。
この「FileNotFoundError」は、「ファイルやフォルダにアクセスしようとしたけど、見つからなかったよ!」と言ってきているわけです。
では、このエラーが起きる原因を見ていきましょう。
FileNotFoundErrorが発生する原因
まずは下記のコードを見てください。
import openpyxl
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
wb.save('C:/Utatan/output.xlsx')
既存のエクセルファイルを開いて別名保存する簡単なコードですが、このまま実行すると「FileNotFoundError」が発生します。
注目すべきはフォルダパスです。
開くときのフォルダパス: C:/Utatane/
保存するときのフォルダパス:C:/Utatan/
パスが微妙に違うのがわかります。
要はコードのスペルミスです。
保存する時のフォルダパスは「Utatan」になってしまっているため、「Utatan」というフォルダが見つからなかったよ!とエラーが返ってきたわけです。
このようにファイル保存時に「FileNotFoundError」が発生するときは、下記を確認してみてください。
- フォルダが存在しているか(フォルダの指定ミスがないか)
- フォルダ名が間違っていないか(フォルダのスペルミスがないか)
もうわかったかもしれませんが、対処法を見ていきましょう。
FileNotFoundErrorが発生した場合の対処法
「FileNotFoundError」の対処法は、コードを再確認し、正しいフォルダ名を記述するということです。
実際のフォルダ名と、コードのフォルダ名を比較してみてください。
フォルダ名が長い場合は、フォルダ名をコピペするのが無難です。
「OSError」が発生
上記のエラーも稀に発生しますが、こちらも簡単に解決できます。
今回のエラーでは、「ファイル名やフォルダ名がおかしいよ!」と言ってきています。
では原因を見ていきましょう。
OSErrorが発生する原因
下記のコードを見てください。
import openpyxl
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
wb.save('C:/Utatan/out?put.xlsx')
違和感が1ヵ所あるかと思います。
そうです。保存するファイル名に「?」が入っています。
本来、ファイル名に「?」は使うことができません。
openpyxlでも同じで、これが原因です。
なのでこのような「フォルダ名やファイル名が記述されたエラー」が出たら、フォルダ名やファイル名を再確認しましょう。
使えない文字を入れてしまっている場合が稀にあります。
使ってしまいそうで使えない文字をまとめてみましたので、ご参考ください。
「¥」「:」「?」「<」「>」(すべて半角)
OSErrorが発生した場合の対処法
このようなエラーが発生した場合の対処法は、ずばり「フォルダ名やファイル名には記号を使わないようにする」です。
記号を使いたい場合は、「_」のみにするのが無難です。
これならエラーは発生しません。
最初のうちは、なかなか慣れないかと思いますが、徐々に習慣づけていきましょう。
エラーの発生を防ぐ方法
ここからは、エラーを防ぐ方法を紹介いたします。
基本的なことから、裏技的なものまでありますので、ぜひ最後まで読んでいってください。
コードを再確認する
エラーの原因で意外と多いのが、スペルミスなどの構文エラーです。
保存する際の変数や保存先も間違っているとエラーが発生します。
一文書いたらコードを確認するクセをつけましょう。
例外処理を実行する
Python初心者の中には、エラー画面を見るのもイヤと思う人も多いと思います。
そこで、エラー画面を出さないようにする方法もあります。
それが「例外処理」です。
下記コードを見てください。
import openpyxl
try:
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
wb.save('C:/Utatan/output.xlsx')
print('処理が正常に終了しました。')
except PermissionError:
print('ちょっと待った: ファイルが開かれています。ファイルを閉じて再試行しましょう。')
except FileNotFoundError:
print('ちょっと待った: ファイルのパスが無効です。パスを確認しましょう。')
except OSError:
print('ちょっと待った: ファイル名が無効です。ファイル名を確認しましょう。')
上記プログラムを実行して内部的にエラーが発生したら、エラー画面ではなく「print」の表示で知らせてくれます。
もう少しやさしい口調に変えたり、ダイアログでお知らせすることも可能です。
できるだけストレスが少ない方法を試してみてください。
例外処理の詳細は下記記事をご参考ください。
他のライブラリを試す
VBA(マクロ)が含まれているなど、ファイルの内容によっては他のライブラリを使って保存すると解決することがあります。
「pandas」や「xlwings」などのライブラリも試してみてください。
最後に
openpyxlでエクセルファイルを保存できない場合の原因と対処法を解説いたしました。
当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
挫折せずにPythonを独学で学習する方法は特におすすめです。
最後までお読みいただき、ありがとうございました。がんばってください!