今回も前回に続いてエクセルファイルのデータを読み出します。前回同様に処理するエクセルデータと実行するPythonスクリプトは同じフォルダ(デスクトップ上にあるsampleフォルダ)にあるものとします。
今回使用するエクセルのファイルは前回と若干異なり、2枚目のシートが追加されています。
複数あるワークシートから特定のセルを読み出す
エクセルでは複数のワークシートが含まれる場合があります。このため、特定のシートにある特定のセルを読み出す必要が出てきます。ワークシートへのアクセス方法はいくつかあります。まず、ワークシートの名前がわかっている場合です。この場合は以下のように[]内に引用符で囲んでワークシート名を指定するだけです。
以下の例ではワークシート名Sheet2のA2セルの内容が表示されます。
import openpyxl
wb = openpyxl.load_workbook('Book1.xlsx',data_only=True)
ws = wb['Sheet2']
print(ws['A2'].value)
ワークシート名がわからない場合はworksheets[〜]のように指定します。〜の中には0以上の整数値が指定できます。0が一番最初(一番左側)のワークシート)になり、次のワークシートが1、その次が2というようになります。
以下のように指定すると左から2番目のワークシートのA2セルの内容が表示されます。
import openpyxl
wb = openpyxl.load_workbook('Book1.xlsx',data_only=True)
ws = wb.worksheets[1]
print(ws['A2'].value)
あと、前回はセルの位置を指定するのに以下のような表記を使いました。
cell(row=2, column=1)
最初に行、次に列を指定すると確定しているなら以下のようにcell()の中は行番号,列番号として数字のみで大丈夫です。
import openpyxl
wb = openpyxl.load_workbook('Book1.xlsx',data_only=True)
ws = wb['Sheet2']
print(ws.cell(2,1).value)
行数と列数を表示
セルの内容を読み出してシェルスクリプトで処理する場合、行数と列数が必要になります。
行数はmax_rowで、列数はmax_columnで取得できます。
以下のようにすると行数と列数が表示されます。
import openpyxl
wb = openpyxl.load_workbook('Book1.xlsx',data_only=True)
ws = wb['Sheet2']
print(ws.max_row)
print(ws.max_column)
コマンドライン引数を取得
シェルスクリプトと組み合わせて使用する場合、Python側でコマンドラインから渡されたパラメーターを取得する必要があります。
コマンドラインからのパラメーターを取得する場合は以下のようになります。以下の例ではコマンドラインから渡された3つのパラメーターが表示されます。なお、最初のパラメーターはスクリプトファイルのパスになります。
import sys
print(sys.argv[0])
print(sys.argv[1])
print(sys.argv[2])
なお、指定されたパラメーターが指定されていない場合は図のようなエラーになります。が、ここでは必ずパラメーターを指定しているものとして進めます。(エラー処理は考慮しません)
コマンドラインでセルの位置を指定
次にコマンドラインでセルの位置を指定して内容を表示してみましょう。コマンドラインからのパラメーターは数字でも文字列となるのでint(sys.argv[1])のようにintを使って整数値にします。
以下の例ではコマンドラインで指定した行位置、列位置のセルの内容を表示します。
import sys
import openpyxl
wb = openpyxl.load_workbook('Book1.xlsx',data_only=True)
ws = wb['Sheet2']
n = ws.cell(int(sys.argv[1]),int(sys.argv[2]))
print(n.value)
セルの数だけ繰り返す
次にシェルスクリプトでセルの数だけ読み出してみましょう。と、その前に2つだけスクリプトを用意しておきます。用意するスクリプトはワークシートの行数と列数を返すものです。ワークシート名やファイル名を決め打ちしていますが、アクティブなワークシートを対象にするのであればws = wb['Sheet2']は前回使用したwb.activeにすればよいでしょう。
まずは行数を返すスクリプトです。これは以下のようになります。このスクリプトはrow.pyという名前で保存しておきます。
import openpyxl
wb = openpyxl.load_workbook('Book1.xlsx')
ws = wb['Sheet2']
print(ws.max_row)
同様に列数の場合は以下のスクリプトになります。このスクリプトはcolumn.pyという名前で保存しておきます。
import openpyxl
wb = openpyxl.load_workbook('Book1.xlsx')
ws = wb['Sheet2']
print(ws.max_column)
ここまでできれば、あとはセルの列と行の数だけシェルスクリプトで繰り返すだけです。Pythonからの値を変数に入れる場合は$()を使います。他は定番のforによる一定回数の繰り返しなので難しくはないでしょう。以下のスクリプトをe.shという名前で保存して実行権限を付加します。
#!/bin/bash