openpyxlでエクセルファイルを読み込みしたいんだけど、
シート名が毎回違ったりしてエラーが出る…。
シートの位置も違う時があるし、なんかいい方法は無いの?
なるほど…。
では今回は、「openpyxlでエクセルを読み込みする方法」をまとめて紹介いたします。
できるだけわかりやすく解説いたしますので、ぜひ最後まで読んでいってください。
openpyxlでエクセル(ブック)を読み込みする方法
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
今回サンプルとして読み込みするファイルは下図のとおり、シートが3つあるエクセルファイルです。
エクセルファイルを読み込み・編集するには、まずはエクセルファイルのブックを読み込みする必要があります。
コードは以下のとおりです。
import openpyxl
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
1行目の「インポート」は解説を割愛します。また「openpyxl」を初めて使う場合はインストールが必要です。
下記の「インストールを解説した記事」をご参考ください。
3行目でエクセルファイルのブックを読み込みしています。
まず新しい名前の変数を書いたら、「=(イコール)」を書きます。
今回はわかりやすくするため、変数名を「WorkBook」略して「wb」という名前にしていますが、なんでも構いません。
しかしながら、つけることができない名前があったり、注意すべきこともありますので、下記記事を事前にご覧ください。
イコールの後に、「openpyxl.load_workbook()」を書きます。
()内の引数には、「読み込みするファイルのアドレス」を書いてください。
アドレスはフルパス(フォルダパス/ファイル名)で指定するのが無難です。
フォルダパスは、ファイルが置いてあるフォルダを開き、アドレスバーからコピーできます。
アドレスをコードにコピペした後、「/」が「\」や「¥」になってしまっている場合は、「/」に変更してください。
「2024input.xlsx」「input001.xlsx」などのように、ファイル名が毎回微妙に違う場合は、「glob」を使うと便利です。
import openpyxl
import glob
files = glob.glob('C:/Utatane/*input*.xlsx')
wb = openpyxl.load_workbook(files[0])
【4行目】
ファイル名の両サイドに「*(アスタリスク)」が追加されています。
これで、ファイル名に「input」が含まれるファイルが読み込みされ、配列「files」に入ります。
配列については下記記事をご参考ください。
【6行目】
これまで解説したコードとほぼ同じですが、()内の引数には4行目で取得した配列の0番目を指定します。
【注意点】
フォルダ内に「input」を含むファイルが複数ある場合は、想定していないファイルを読み込みする可能性がありますのでご注意ください。
これで、エクセルファイルのブックが読み込みされます。
エラーが出た場合は、「うまく動作しない場合の対処法」の項をご参考ください。
次に、シートを読み込みする方法を見ていきましょう。
openpyxlでエクセル(シート)を読み込みする方法
シートを読み込みする方法を3つ紹介いたします。
- アクティブシートを指定して読み込み
- シート名を指定して読み込み
- シート番号を指定して読み込み
それぞれ「メリット」と「デメリット」があります。
1つ1つ見ていきましょう。
アクティブシートを指定して読み込み
まずは「アクティブシートを指定して読み込み」する方法です。
アクティブシートとは、「最終保存する直前に選択されていたシート」のことで、下図の場合は「Sheet2」がアクティブシートとなります。
では、このアクティブシートである「Sheet2」を読み込んでみましょう。
import openpyxl
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
ws = wb.active
コードの3行目は前項で解説した「ブック」を読み込む方法でしたね。
コードの4行目でアクティブシートを読み込みしています。
新しい名前の変数を書いたらイコールを書き、ブックを読み込んだ変数に続けて「.active」を書きます。
これでアクティブシートを読み込むことができます。
※メリット・デメリットは後述
シート名を指定して読み込み
次に、「シート名を指定して読み込み」する方法を見ていきましょう。
シート名である「Sheet1」を指定して読み込んでみましょう。
import openpyxl
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
ws = wb['Sheet1']
4行目を見てください。
アクティブシートの読み込み方法と似ていますが、右辺が違います。
ブックを読み込んだ変数の後に、[]を書きます。
[]内にシート名を記述してください。
【注意点】
1.シート名は「’(クォーテーション)」で囲ってください。
2.デフォルト名である「Sheet1」の先頭は大文字の「S」です。「sheet1」とならないようにしましょう。
シート番号を指定して読み込み
最後に「シート番号を指定して読み込み」する方法を紹介いたします。
import openpyxl
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
ws = wb.worksheets[0]
4行目の右辺で、ブックを読み込んだ変数に続けて、「.worksheets[]」を書きます。
[]内には「シート番号」を記述してください。
【シート番号とは】
シートの順番を表す番号です。
1番左のシートは[0]となります。[1]ではないので間違えないようにしましょう。
左から2番目のシートは[1]、左から3番目のシートは[2]となります。
シート番号[-1]を指定すると、一番右のシート(下図ではSheet3)を読み込みすることができます。
3つの方法のメリット・デメリット
それぞれの方法にはメリットとデメリットがあります。
一覧にしましたのでご確認ください。
【アクティブシート指定で読み込み】
<メリット>
□シート名が不明でも読み込める
□シートの順番(位置)が不明でも読み込める
□エラーが出にくい
<デメリット>
●別のシートがアクティブシートになっていると、そちらを読み込んでしまう
【シート名指定で読み込み】
<メリット>
□シートの順番(位置)が不明でも読み込める
□アクティブシートが不明でも読み込める
<デメリット>
●シート名が不明だったり、変わったりすると読み込めない(エラーが出る場合あり)
【シート番号指定で読み込み】
<メリット>
□シート名が不明でも読み込める
□アクティブシートが不明でも読み込める
<デメリット>
●シートの順番(位置)が不明だったり、変わったりすると読み込めない(エラーが出る場合あり)
ご自分の目的に合った方法で読み込みしてください。
うまく動作しない場合の対処法
エラーが出る
No such file or directory: ○○
これは、読み込むファイルやフォルダが見つからないというエラーです。
読み込むファイルのファイル名と構文のファイル名が一致しているか確認しましょう。
詳しい解説は、下記記事をご参考ください。
Permission denied: ○○
操作しようとしているファイルにアクセスできないというエラーです。
「ファイルを開いている状態なので編集できない」と言っていることが多いので、開いていれば閉じて再度トライしましょう。
詳しい解説は、下記記事をご参考ください。
Worksheet ○○ does not exist
「指定したシートがありません」というエラーです。
指定のシート名が間違っていないか、「sheet1」など先頭が小文字になっていないか確認しましょう。
詳しい解説は、下記記事をご参考ください。
○○ is not defined
今まで出てきていない変数などを処理しようとした時に出るエラーです。
変数名などが間違っていないかチェックしましょう。
詳しい解説は、下記記事をご参考ください。
list index out of range
規定を超える部分を操作しようとした時に出るエラーです。
今回の場合では、実際にないSheet3(シート番号2)などを指定した場合にも起こります。
ファイルとコードを再確認しましょう。
その他のエラー
その他のエラーが出た場合は、エラー文をコピーしてNETで検索してみましょう。
最後に
openpyxlでエクセルファイルを読み込みする方法を解説いたしました。
当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
挫折せずにPythonを独学で学習する方法は特におすすめです。
最後までお読みいただき、ありがとうございました。がんばってください!