【Python】Excel操作 ファイルの読み込み
【はじめに】
今回は個人的にも使用機会の多いExcelの操作方法について残しておきます。
まずは、初歩としてエクセルの読み込み方法についてです。
Pythonからエクセルを操作する方法はいろいろあるようですが、今回はライブラリの「openpyxl」を使った方法になります。
PyCharm環境で実施した方法のメモです。
【openpyxl の使い方】
<ライブラリのインストール>
はじめは、「openpyxl」のライブラリインストールです。
ライブラリをインストールしないと「openpyxl」は使用できないため注意が必要です。
(Pythonファイルの作成方法はこちらを参照)
(1)PyCharmで「Alt」+「Ctrl」+「s」を押して設定画面を開く。
(2)「プロジェクト」>「プロジェクト・インタープリター」を選択。
(3)「+」を選択。
(4)「openpyxl」を検索し、インストール。
(5)下記のように成功が出れば完了です。
<ファイルの読み込み>
ファイルの読み込みとセルやシートの読み出し方法についてメモしておきます。
読み出しファイルは「テスト.xlsx」をPythonファイルと同じフォルダに保管しました。(テスト.xlsxの中身は適当です。)
まずは、今回残しておく処理の全文から。
各部分の詳細については後述してあります。
import openpyxl as xl # ファイル名の記載 fname = 'テスト.xlsx' # ブックを開く book = xl.load_workbook(fname) # シート名の取得 print('ーーシート名の取得ーー') print(book.sheetnames) print(type(book.sheetnames)) print('ーーーーーーーーーーーーーー') #共通処理 sheet1 = book.active sheet2 = book['Sheet2'] # 個別シート名の取得 print('ーーアクティブシート名の取得ーー') print(sheet1.title) print(sheet2.title) print('ーーーーーーーーーーーーーー') # 使用している最大の行・列の取得 print('ーー使用している最大の行・列の取得ーー') print(sheet1.max_row) print(sheet1.max_column) print(sheet2.max_row) print(sheet2.max_column) print('ーーーーーーーーーーーーーー') #セルの値取得 print('ーーセルの値取得ーー') print(sheet1.cell(11,7).value) print(sheet1.cell(row=4, column=2).value) print(sheet1['C1'].value) print('ーーーーーーーーーーーーーー') # シートの全セル値の取得 # 行毎に取得 print('ーー行毎に取得ーー') for row in sheet1.rows: print('ーーーーーーーーーーーーーー') for cell in row: print(cell.value) print('ーーーーーーーーーーーーーー') # 列毎に取得 print('ーー列毎に取得ーー') for column in sheet1.columns: print('ーーーーーーーーーーーーーー') for cell in column: print(cell.value) print('ーーーーーーーーーーーーーー')
<処理の詳細>
「openpyxl」のインポートとファイルの読み込み
import openpyxl as xl # ファイル名の記載 fname = 'テスト.xlsx' # ブックを開く book = xl.load_workbook(fname)
「openpyxl」を インポートすることでこのファイルで使用できるようにしています。ここでは「xl」とすることで使用する際に記述を簡単にしています。
「fname」は開くファイルの名前を記載するために準備しました。絶対パスを含めて書くことで、同じフォルダにファイルがなくても処理ができます。
「xl.load_workbook(fname)」でファイルを読み込み、そのデータを「book」に入れています。「book」にはエクセルワークブックのデータ全体が入っているイメージです。
ここでの処理はこの後の処理を行う際には必ず必要な処理です。
シート名の取得
# シート名の取得 print(book.sheetnames)
「.sheetnames」でシート名を取得することができます。
取得したシート名はリスト型になっています。
#共通処理 sheet1 = book.active sheet2 = book['Sheet2'] # 個別シート名の取得 print(sheet1.title) print(sheet2.title)
今回はエクセルブック上に「Sheet1」と「Sheet2」があり、アクティブなシートは「Sheet1」です。
「.active」で現在のシートのデータ、「['Sheet2']」の様にシート名を記載することでそのシートのデータになり、共通処理でそのデータを「sheet1」、「sheet2」に入れています。
「.title」でそのシートのシート名を取得できます。
使用セル範囲の取得
# 使用している最大の行・列の取得 print(sheet1.max_row) print(sheet1.max_column) print(sheet2.max_row) print(sheet2.max_column)
「.max_row」でシートの使用している最終行、「.max_column」で最終列を取得することができます。
セルの値の取得
#セルの値取得 print(sheet1.cell(11,7).value) print(sheet1.cell(row=4, column=2).value) print(sheet1['C1'].value)
セルの値取得は、行列を数値で指定する方法と「C1」の様に指定する方法がありました。セルを指定して、「.value」をつけることで値を取得できます。(余談ですがVBAでは指定がない場合は「.value」が補完されるのですがPythonでは補完されないため、VBAになれている方は注意が必要です。)
全セル値の取得
# シートの全セル値の取得 # 行毎に取得 for row in sheet1.rows: for cell in row: print(cell.value) # 列毎に取得 for column in sheet1.columns: for cell in column: print(cell.value)
「.row」では行毎のデータが格納されているイメージで「.column」では列毎のデータが格納されているイメージです。その中のセルのデータを順番に取得することで全セルのデータを取得しています。
【後書き】
今回は、「openpyxl」のインストールとエクセルの読み込み方法について記載しました。他にも取得な必要なデータはあると思いますので、それは必要になった際に残していきたいと思います。
【参考サイト】
今回の作業にあたり、下記サイトを参考にさせて頂きました。
www.python-izm.com
qiita.com