Pythonを使用してExcelのファイルからセルの値・行・列・セル番地を取得する方法
2021/08/08
Pythonを使用してExcelのファイルからセルの値・行・列・セル番地を取得する方法について紹介。
Excelのファイルからセルの値取得などはPythonでExcelを操作する上で基本的な操作になってきます。覚えておくことで特定のセルの値取得などができるようになります。
複数のExcelファイルからいちいち値のみを取得するとなると時間がかかるため、Pythonで自動化してしまえば、その時間は優雅にティータイムや別作業にあてておきたい。
pythonでExcel(エクセル)のシート名取得・読み込み
今回は2つの方法で紹介しようと思う。
- openpyxlを使用したセルの値・行・列・セル番地を取得
- win32comを使用したセルの値・行・列・セル番地を取得
どちらの方法でも同じような結果を出すことが出来る。個人的な使い分けとしては、Excelファイルのみで完結するのか?どうかで使い分けをしている。
【openpyxl】
- Excelのデータの集計や自動化のみをしたい場合はこちらがオススメ。単純なデータ分析の自動化などExcelのみで完結して、その他Officeとの連携は考えていない。
【win32com】
※win32comはPCのOSがWindowsで、かつExcelがインストールされている必要あり
- officeでの連携を考えている場合はコチラがオススメ。例えば、Excelのファイルを作成後にOutlookでメールを送る・Excelで集計した結果をWordに張り付けるなど。さらに複雑なExcelの操作をしたい場合もコチラがオススメとなります。
使用データ
今回は「日本の祝日」と「天気」をまとめた(japan_ingo.xlsx)のデータを使用。
「日本の祝日」は、内閣府が出している「国民の祝日」についてのデータを使用。「天気」は、気象庁の過去データを使用。
これはサンプルのため、個人でExcelファイルを用意してもらえればと。
前提知識
事前にPythonでExcelの操作方法を簡単に学んでおいたほうがいい。下記で簡単なExcelファイルの操作方法を学べる。
openpyxlの場合
最初はopenpyxlというライブラリを使用した場合のセルの値・行・列・セル番地を取得方法を紹介していきます。
基本で使用する構文は下記となります。
import openpyxl #ファイルのパスを指定 file_path = r"C:\Users\user\Desktop\sample\japan_info.xlsx" #ファイルを開く excelBook = openpyxl.load_workbook(file_path) #特定のシートを読み込む excelSheet = excelBook['祝日'] #特定セルの指定 #セルの値取得 #セルの行・列・セル番地の取得 #セルの値取得(行・列数値指定) #最大行・最大列の取得 #ループでセルの値を取得
値取得
セルの値取得
#特定セルの指定 excelCell = excelSheet["A2"] #セルの値取得 print(excelCell.value) # >>> 1955-01-01 00:00:00
セルの行・列・セル番地の取得
セルの行番号・列番号・セル番地の取得
#特定セルの指定 excelCell = excelSheet["A2"] #セルの行・列・セル番地の取得 print("行:" + str(excelCell.row)) # >>> 行:2 print("列:" + str(excelCell.column)) # >>> 列:1 print("セル番地:" + str(excelCell.coordinate)) # >>> セル番地:A2
セルの値を取得(行番号・列番号指定)
行番号と列番号を指定してセルの値を取得
#セルの値を取得(行・列数値指定) print(excelSheet.cell(row=2, column=1).value) # >>> 1955-01-01 00:00:00
最大行・最大列の取得
シートの最大行・最大列の取得
#最大行・最大列の取得 print("最大行:" + str(excelSheet.max_row)) # >>> 最大行:976 print("最大列:" + str(excelSheet.max_column)) # >>> 最大列:2
ループでセルの値を取得
行番号と列番号を指定してループでセルの値を取得
#ループでセルの値を取得 for i in range(1,5): print(excelSheet.cell(row=i, column=1).value) # >>> 国民の祝日・休日月日 # >>> 1955-01-01 00:00:00 # >>> 1955-01-15 00:00:00 # >>> 1955-03-21 00:00:00
範囲を指定してセルの値を取得
セルの範囲を指定してループでセルの値を取得
#範囲を指定してセルの値を取得 excelCells = excelSheet["A1:A4"] for x in excelCells: for y in x: print(y.value) # >>> 国民の祝日・休日月日 # >>> 1955-01-01 00:00:00 # >>> 1955-01-15 00:00:00 # >>> 1955-03-21 00:00:00
win32comの場合
次はwin32comというライブラリを使用した場合のセルの値・行・列・セル番地を取得方法を紹介していきます。
基本で使用する構文は下記となります。
import win32com.client file_path = r"C:\Users\user\Desktop\sample\japan_info.xlsx" #Excelファイル操作のための準備 excel = win32com.client.Dispatch("Excel.Application") #ファイルを開く excelBook = excel.Workbooks.Open(Filename=file_path) #特定のシートを読み込む excelSheet = excelBook.worksheets('祝日') #特定セルの指定 #セルの値取得 #セルの行・列・セル番地の取得 #セルの値取得(行・列数値指定) #最大行・最大列の取得 #ループでセルの値を取得 #Excelを閉じる excel.Quit()
値取得
セルの値取得
#特定セルの指定 excelCell = excelSheet.Range("A2") #セルの値取得 print(excelCell.value) # >>> 1955-01-01 00:00:00+00:00
セルの行・列・セル番地の取得
セルの行番号・列番号・セル番地の取得
#特定セルの指定 excelCell = excelSheet.Range("A2") #セルの行・列・セル番地の取得 print("行:" + str(excelCell.row)) # >>> 行:2 print("列:" + str(excelCell.column)) # >>> 列:1 print("セル番地:" + str(excelCell.address)) # >>> セル番地:$A$2
セルの値を取得(行番号・列番号指定)
行番号と列番号を指定してセルの値を取得
#セルの値を取得(行・列数値指定) print(excelSheet.cells(2, 1).value) # >>> 1955-01-01 00:00:00+00:00
最大行・最大列の取得
シートの最大行・最大列の取得
#最大行・最大列の取得 print("最大行:" + str(excelSheet.UsedRange.Rows.Count)) # >>> 最大行:976 print("最大列:" + str(excelSheet.UsedRange.Columns.Count)) # >>> 最大列:2
ループでセルの値を取得
行番号と列番号を指定してループでセルの値を取得
#ループでセルの値を取得 for i in range(1,5): print(excelSheet.cells(i, 1).value) # >>> 国民の祝日・休日月日 # >>> 1955-01-01 00:00:00+00:00 # >>> 1955-01-15 00:00:00+00:00 # >>> 1955-03-21 00:00:00+00:00
範囲を指定してセルの値を取得
セルの範囲を指定してループでセルの値を取得
#範囲を指定してセルの値を取得 excelCells = excelSheet.Range("A1:A4") for x in excelCells: print(x.value) # >>> 国民の祝日・休日月日 # >>> 1955-01-01 00:00:00+00:00 # >>> 1955-01-15 00:00:00+00:00 # >>> 1955-03-21 00:00:00+00:00
まとめ
PythonでExcelを操作する場合は、Workbook/Worksheet/Cellなどの操作はかなり基本的で重要なものとなってきます。
今回の使い方の具体例でいえば、例えばExcelの複数シートのD2のセルにExcelのSum関数で合計値を出しておき、それを一括で取得するなどの方法があげられます。
ある程度Excel関数が使えるようになっているという前提がありますが、関数+Pythonでの値取得は強力です。
基本は定期的に作業を行うという前提となりますが、定期的に特定ファイルの値を取得したいときは便利なものとなります。
2つの使い方を紹介しておりますが、基本的な操作であればopenpyxlでも問題ありません。ただ、複雑な操作や他Officeとの連携をする場合は、win32comがオススメとなります。
win32.comはドキュメントが無いため、プログラムの書き方は分かりずらいのですが、VBAと同じような書き方となりますので、VBAの本を購入することをオススメしております。