Pythonとopenpyxlを使ってExcelスプレッドシートを操作する方法
Pythonはプレゼンテーションが必要ない汎用プログラミング言語です。元々はグイド・バン・ロッスムによって書かれ、1991年に最初のリリースを迎えました。この記事執筆時点での最新の安定バージョンは3.10です。このチュートリアルでは、Excelスプレッドシートを操作するためにopenpyxlライブラリと一緒に使用する方法を見ていきます。
このチュートリアルでは、あなたが学ぶことができる:
- メモリ内でワークブックを作成する方法
- ワークブックからシートを取得、作成、コピー、移動、削除する方法
- ファイルからワークブックを作成する方法
- セルの範囲にアクセスする方法
- 行と列を反復処理する方法
使用されるソフトウェア要件と規約
openpyxlライブラリのインストール
私たちのオペレーティングシステムにopenpyxlライブラリを取得するには、2つの方法を使用できます。最初の方法は、好きなディストリビューションのリポジトリにあるパッケージをネイティブパッケージマネージャを使用してインストールすることです。二つ目は、普遍的な方法で、pip、Pythonのパッケージマネージャを利用することです。両方の方法を探ってみましょう。
openpyxlパッケージは、Debian(およびその派生版)、Fedora、Archlinuxなど、最も使用されているいくつかのLinuxディストリビューションのデフォルトリポジトリに利用可能です。前述のディストリビューションにパッケージをインストールするには、それぞれ次のコマンドを実行できます:
Install openpyxl on Debian and derivatives
sudo apt install python3-openpyxl
Install openpyxl on Fedora
sudo dnf install python3-openpyxl
Install openpyxl on Archlinux
sudo pacman -S python-openpyxl
上記のコマンドはディストリビューション固有です。openpyxl(または他の任意のPythonライブラリ)をインストールするためにクロスディストリビューションの方法を使用したい場合、Pythonパッケージマネージャーであるpipを使用できます(もちろん、pip自体は私たちのシステムにインストールされている必要があります)。
pip install openpyxl --user管理者権限なしでpipを起動し、--userオプションを使用してパッケージをユーザー専用にインストールしたことに気づくことができます。これがパッケージマネージャを使用する推奨の方法です。一度ライブラリがシステムにインストールされると、作業を始めることができます。
メモリ内にシンプルなスプレッドシートを作成する
簡単に始めましょう。ワークブックを作成するには、すべてのドキュメントの他の部分を含むコンテナを表すWorkbookクラスをインポートして作業するだけです。Workbookクラスのインスタンスを作成すると、新しいスプレッドシートもデフォルトで作成されます。activeプロパティを介してアクセスできます:
from openpyxl import Workbook
workbook = Workbook()
spreadsheet = workbook.active
新しいスプレッドシートが作成されると、セルは含まれていません。それらは動的に生成されるため、貴重なメモリを無駄にしないように直接アクセスする方が良いです。スプレッドシートのセルは、辞書のキーのように参照できます。例えば、‘A1’セルの値を取得するには、次のように書きます:
a1_value = spreadsheet['A1']
同様に、同じセルに値を割り当てるには、次のように書きます:
spreadsheet['A1'] = 'Hello World'
スプレッドシートのセルにアクセスする別の方法は、Worksheetオブジェクトのcell()メソッドを使用し、行/列の座標を引数として渡すことです:
Get the value of the cell
a1_value = spreadsheet.cell(row=1, column=1)
Populate the cell
spreadsheet.cell(row=1, column=1, value='Hello World')
作成して操作したワークシートを保存するには、Workbookオブジェクトのsaveメソッドを使用し、引数として保存先ファイルの名前を渡すだけです。たとえば、ワークシートをworksheet.xlsxとして保存するには、次のように実行します:
workbook.save('worksheet.xlsx')
このメソッドを呼び出すと、指定された名前のファイルが私たちのファイルシステムに作成されます。こちらがその内容です(この場合、私はLibreOffice Calcで開きました):
ワークブックにシートを追加する
前の例では、ワークブックのアクティブなスプレッドシートにアクセスする方法を見ました。しかし、ワークブックには複数のワークシートが含まれる可能性があるため、新しいワークシートを作成したい場合はどうすればよいでしょうか?それは、Workbookオブジェクトのcreate_sheetメソッドを介して行うことができます。
new_sheet = workbook.create_sheet('new')
create_sheet メソッドは、2つのオプション引数を受け取ります: title と index です。前者(文字列である必要があります)を使用して新しいシートに名前を付け、後者(整数)を使用してシートを挿入する位置を指定できます。このメソッドは新しいシートを作成し、返します。上記の例では、タイトルとして “new ” を使用して新しいシートを作成しました。このタイトルは後でスプレッドシートを取得するために使用できます。
sheet = workbook['new']
シートのコピーと移動
既存のシートをコピーするには、copy_worksheet メソッドを使用し、コピー対象のワークシートを引数として渡すことができます。アクティブなワークシートをコピーするには、例えば次のように書きます:
sheet_copy = workbook.copy_worksheet(workbook.active)
このメソッドは、作成されたシートのコピーを返します。この場合、私たちはsheet_copy変数を介してそれを参照しました。
既存のシートをワークブック内の特定の位置に移動するには、move_sheetメソッドを使用します。このメソッドは2つの引数を受け取ります。最初の引数sheetは必須で、移動させたいワークシートです。2番目の引数はオプションで(デフォルトは0)、シートの位置を指定するためのオフセットです。例を見てみましょう。この場合、デフォルトのワークシート「Sheet」はワークブック内で最初のものです。それを2番目の位置に移動させるためには、以下のように記述します:
workbook.move_sheet(workbook["Sheet"], 1)
ワークブックに属するすべてのシートのリストは、worksheetsプロパティを介して取得できます。
シートを取り外す
ワークブックからシートを削除するには、Workbookクラスのremoveメソッドを使用します。このメソッドは、削除したいシートを表すオブジェクトという1つの必須引数を受け取ります。もし私たちがワークブックから「new」シートを削除したい場合、次のように書きます:
workbook.remove(workbook['new'])
ファイルからワークブックを作成する
既存のExcelスプレッドシートファイルを読み込むのは、openpyxlを使えば非常に簡単です。私たちが行う必要があるのは、ライブラリからload_workbook関数を読み込むことだけです。この関数の唯一の必須パラメータはfilenameで、開きたいファイルのパスでなければなりません。このファイルの名前がspreadsheet.xlsxであると仮定すると、次のように書きます:
from openpyxl import load_workbook
workbook = load_workbook('spreadsheet.xlsx')
このメソッドは、ファイルの扱い方を変更するのに役立ついくつかのオプションパラメータも受け入れます:
| パラメーター | 説明 | デフォルト |
|---|---|---|
| 読み取り専用 | ファイルを読み取り最適化モードで開いてください。編集できません。 | False |
| VBAを保持する | VBAコンテンツを保持するかどうか | False |
| データのみ | セル内の数式を保持するか、それとも単にその中に含まれる値を報告するか | False |
| リンクを保持する | 外部ワークブックへのリンクを保持するべきかどうか | True |
スプレッドシートファイルを読み込むと、load_workbookによって返されるWorkbookクラスのインスタンスを介してスプレッドシートにアクセスできます。
複数のセルにアクセスする
単一のセルの値ではなく、セルの範囲の値を取得したい場合はどうすればよいでしょうか?私たちがすべきことは、次の構文で範囲を指定することだけです:
cell_values = spreadsheet['A1':'D1']
範囲を指定した結果は、指定された各行に対してタプルを含むタプルになります。上の例では、A1からD1までのセルを指定したため、行は1行のみであり(それらは確かに同じ行にあります)、これが結果になります:
((<Cell 'Sheet'.A1>, <Cell 'Sheet'.B1>, <Cell 'Sheet'.C1>, <Cell 'Sheet'.D1>),)
最初の3行の列「A」から「D」のセルを表すオブジェクトを取得したい場合は、代わりに次のように書きます:
cell_values = spreadsheet['A1':'D3']
次の結果を得ることになります:
(
(<Cell 'Sheet'.A1>, <Cell 'Sheet'.B1>, <Cell 'Sheet'.C1>, <Cell 'Sheet'.D1>),
(<Cell 'Sheet'.A2>, <Cell 'Sheet'.B2>, <Cell 'Sheet'.C2>, <Cell 'Sheet'.D2>),
(<Cell 'Sheet'.A3>, <Cell 'Sheet'.B3>, <Cell 'Sheet'.C3>, <Cell 'Sheet'.D3>)
)
今回のタプルには、前述の通り、各行に対して1つずつの三つのタプルが含まれています。列のすべてのセルにアクセスするには、行番号を指定せずに列名だけを指定します。たとえば、「A」列のすべてのセルを取得するには、次のように記述します:
cells = spreadsheet['A']
列AからDまでのすべてのセルを取得するには、代わりに次のように書きます:
cells = spreadsheet['A':'D']
同様に、番号の範囲を指定することで、全体の行にアクセスすることができます。最初の2行のすべてのセルを取得するには、次のように記述します:
cells = spreadsheet[1:3]
iter_rows()およびiter_cols()メソッドを使用して行と列を反復処理します。
一連のセルの値にアクセスするために範囲を指定する代わりに、スプレッドシートの iter_rows() と iter_cols() メソッドを使用することができます。両方のメソッドは同じオプション引数を受け付けます:
| パラメーター | 説明 |
|---|---|
| ミン・ロウ | 最小の行インデックス |
| 最大行 | 最も大きな行インデックス |
| ミンコル | 最小の列インデックス |
| マックスコール | 最も大きな列インデックス |
| 値のみ | セルの値のみを返すべきかどうか |
両方のメソッドで、min_row/max_rowおよびmin_col/max_colパラメータを使用して、イテレーションを行う行と列の範囲を指定します。二つの違いは、iter_rows()が行ごとに整理されたセルを返すのに対し、iter_cols()は列ごとに整理されたセルを返すことです。いくつかの実用的な例を見てみましょう。最初から5列目までの最初の3つの行をイテレートし、行ごとに整理されたセルを取得したいとします。以下が実行する内容です:
for i in spreadsheet.iter_rows(min_row=1, max_row=3, min_col=1, max_col=5):
for cell in i:
print(cell)
上記のコードを実行すると、以下の結果が返されます:
<Cell 'Sheet'.A1>
<Cell 'Sheet'.B1>
<Cell 'Sheet'.C1>
<Cell 'Sheet'.D1>
<Cell 'Sheet'.E1>
<Cell 'Sheet'.A2>
<Cell 'Sheet'.B2>
<Cell 'Sheet'.C2>
<Cell 'Sheet'.D2>
<Cell 'Sheet'.E2>
<Cell 'Sheet'.A3>
<Cell 'Sheet'.B3>
<Cell 'Sheet'.C3>
<Cell 'Sheet'.D3>
<Cell 'Sheet'.E3>
ご覧のように、セルは行によって整理されています。同じセルを列によって整理する場合は、iter_cols()メソッドに同じ引数を渡すことになります:
for i in spreadsheet.iter_rows(min_row=1, max_row=3, min_col=1, max_col=5):
for cell in i:
print(i)
同じセルが返されます。今回は、列に整理されています。
<Cell 'Sheet'.A1>
<Cell 'Sheet'.A2>
<Cell 'Sheet'.A3>
<Cell 'Sheet'.B1>
<Cell 'Sheet'.B2>
<Cell 'Sheet'.B3>
<Cell 'Sheet'.C1>
<Cell 'Sheet'.C2>
<Cell 'Sheet'.C3>
<Cell 'Sheet'.D1>
<Cell 'Sheet'.D2>
<Cell 'Sheet'.D3>
<Cell 'Sheet'.E1>
<Cell 'Sheet'.E2>
<Cell 'Sheet'.E3>
結論
このチュートリアルでは、Pythonのopenpyxlライブラリを使用してExcelスプレッドシートファイルを操作する方法を学びました。メモリ内またはファイルからワークブックを作成する方法、シートを取得、作成、コピー、移動、削除する方法、セルおよびセルの範囲にアクセスする方法、そして最後に行と列を繰り返し処理する方法を見ました。このようなチュートリアルに興味がありますか?ぜひ私たちのPythonの記事をチェックしてみてください!

