【PythonでExcelを操る】openpyxlの導入~ブックとシート・セルの基本操作を徹底解説

スポンサーリンク
Python外部ライブラリ(openpyxl)➀_改訂版 openpyxl

当サイト「Pythonでもっと自由を」のコンセプト

本サイトは、現在人気No.1プログラミング言語である「Python」を使って、「日常の面倒な作業を自動化し効率アップを目指す!ことを目標に、毎回さまざま役立つライブラリ(モジュール)を紹介しています。

なぜ? Pythonなのか・・・

・Pythonには、私たちのの身近なアプリケーションを操作し自動化をサポートしてくれるさまざまなライブラリ(モジュール)が提供されている。

・初心者でも理解しやすいスクリプト言語でありながら、本格的なオブジェクト指向の側面を合わせ持つバランスの良い言語である。

何を? 自動化する・・・

ビジネスシーンにおいて、もっとも身近に使われるアプリケーションといえば、、、真っ先に思い浮かべるものとしては、MS-Officeの「Excel」「Word」「PowerPoint」・・・あたりではないでしょうか?

Officeソフト群
図1 ビジネスで多用されるOfficeソフト

毎日使う「定番必須ツール」だからこそ、これらに関わる作業の自動化や効率を上げることのインパクトは非常に大きいと言えます。


そこで今回の連載記事ではOfficeの中でももっとも活用頻度が高いと思われる「表計算ソフトExcel」を「Python」で操作する方法とそのライブラリを紹介していきたいと思います。

Excelには、とても多くの機能が備わっていますので、この記事だけで全てを網羅することはできません。次のようなテーマに沿って複数回の連載記事にわたって詳細解説します。

Part1_目次
図2 本記事の解説範囲

この記事を読むことで次のようなことが「できる・わかる」ようになりますので最後までお付き合いください。

この記事で学べること
  • Excel起動させることなくPythonだけでファイルを作成することができる
  • openpyxlライブラリの基本的な使い方を習得できる
  • ライブラリが提供するクラス・オブジェクトの階層構造の理解ができる
スポンサーリンク

1.Excelを操作するライブラリ「openpyxl

PythonからExcelを操作する方法としてはいくつか専用のライブラリがあります。

たとえば、Excelに限らずOffice全般の操作することができる「pywin32」、Excelの操作に特化した「openpyxl」があります。また、「pandas」というデータにラベル付けして管理するライブラリに含まれる一部のメソッドを使う方法や標準ライブラリ「xlrd」を導入するといった方法があります。

さすが、MS-Office超強力ソフトExcelとだけあって、関連するライブラリはWordやPowerPointなどよりも選択肢が多いといった印象です。

そのような中でも、Excelの操作に特化し、Excel同様の機能を使うことができるPythonの定番ライブラリが「openpyxl」です

そこで、今回の連載記事ではこのopenpyxlライブラリについて基礎から詳細に解説していきたいと思います。

1.1 openpyxlについて

先にも述べたとおり、openpyxlというライブラリを使えばほぼ本家Excelでできる操作を一通りプログラムすることが可能となります。

ただし、クラスや関数(メソッド)などはExcelに準拠しているわけではなくこのライブラリ独自のものになります。つまりOfficeディベロッパーセンターのVBAリファレンスが参考にならないのです。

(もちろん基本的な考え方は同じなのでVBAの知識があればすんなりと理解できます。)

従いまして、技術サイトや書籍・公式ドキュメント(以下)などを適宜参照してください。

openpyxl公式ドキュメント

https://openpyxl.readthedocs.io/en/stable/

なお、ここで紹介しているものは、本ライブラリを使う上で最低限必要なものを厳選しています。 引数のオプションなど詳細については公式ドキュメントを参照して下さい。

記事内で動作確認した開発環境とバージョン情報は次のとおりとなります。異なる環境・バージョンのライブラリを使う際はこの点、ご留意ください。

・Python 3.7.6(64bit)

・openpyxl 3.0.3

・JupyterNotebook 6.0.3

・Microsoft Office Personal 2016

1.2 インストールと動作確認

次にインストールと動作確認の方法について解説します。

本ライブラリはAnacondaディストリビューションには同梱されていないため、Anacondaによって開発環境を構築した場合には下記コマンドなどで別途インストールする必要があります。

Pythonパッケージ管理ツール「pip」を使ってインストールする場合はプロンプトに次のコマンドを入力します。

pip install openpyxl

openpyxlには使う目的に応じてさまざまなクラスをインポートする必要がありますが、まずは基本モジュールであるopenpyxlをインポートをしましょう。

エイリアス名は任意でよいのですが、慣例としてpxと宣言しています。

import openpyxl as px

この時点で実行しエラーメッセージが表示されなければインストール成功です。

2.openpyxlの基本的な使い方

Python_基本文法_内包表記

本節では、openpyxlの基本的な使い方を解説してききます。

まず、Excelを構成するオブジェクトの階層構造の概要を示すと下のようになります。

基本的に上位層から順番にオブジェクトを取得し関連する関数や属性をつかって所望のExcelファイルを作成していくことになります。

openpyxlオブジェクトの階層構造
図3 オブジェクトの階層構造

以降では上位層から順番に Workbookオブジェクト Worksheetオブジェクト および Cellオブジェクト の基本的な使い方について解説していきます。

2.1 ブックを読込む・新規作成する(Workbookオブジェクトの取得)

openpyxlを使ってExcelを操作するにはまずWorkbookオブジェクトを取得する必要があります。WorkbookオブジェクトはExcelファイルそのものであって数多くある配下のクラスやメソッド・属性などを使って目的を満たしていきます。

Workbookオブジェクトを取得するには、既存のExcelファイル(ブック)を読込む場合と新規ファイルを作成する場合の2つがあります。

まず、既存のブックを読込む場合ですが、 load_workbook関数 を次の書式で使います。

openpyxlモジュール (load_workbook関数)

Workbookオブジェクト = openpyxl.load_workbook(filename, data_only)


引数1: filename :目的ブック名をパス付きで指定

引数2: data_only :データを読み込むならTrue(キーワード引数で指定する)

戻り値: Workbookオブジェクト

公式Document(load_workbook)

次はList1は”sample.xlsx”をload_workbook関数で読込んで、そのインスタンスの属性を表示するプログラム例です。

import openpyxl as px	# openpyxlモジュールをpxとしてインポートする

wb = px.load_workbook('sample.xlsx', data_only=True) # sample.xlsx を読み込み、Workbookオブジェクトを取得してwbとする
print(type(wb))       # wbの属性を調べる <class 'openpyxl.workbook.workbook.Workbook'>
wb.close()		        # Workbookオブジェクトを閉じる

4行目の変数wbのtype関数の出力結果は<class’openpyxl.workbook.workbook.Workbook’>となっており、これはWorkbookオブジェクトが取得できたことを意味します。

イメージは次のようになります。

load_workbook関数のイメージ
図4 load_workbook関数のイメージ

プログラム終了前にはWorkbookオブジェクトを保存(save関数)するか、閉じる(close関数)ようにしますがこれについては後述します。

次に、新規ブックを作成するには、「Workbook関数」を以下の書式のように引数なしで使います。

openpyxlモジュール (Workbook関数)

Workbookオブジェクト = openpyxl.Workbook()


戻り値: Workbookオブジェクト

公式Document(Workbook)

Workbook関数のイメージです。Workbook関数のプログラム例は(save関数)と一緒に掲載します。

Workbook関数のイメージ
図5 Workbook関数のイメージ

2.2 ブックを保存する

ブックを作成したら次はそれを保存する必要がありますが、保存するにはsave関数を使います。書式は次の通りで引数に保存するパス付のブック名を指定します。

Workbookオブジェクト (save関数)

Workbookオブジェクト.save(filename)


引数1:filename: 保存するファイル名を指定する

(カレントディレクトリ以外の場合はPath付きで指定する)

公式Document(save)

List2は新規ブックを“new.xlsx”として保存するプログラム例です。先のWorkbook関数でオブジェクトを生成してからsave関数で保存しています。

import openpyxl as px

wb = px.Workbook()   # Workbookオブジェクトを新規取得してwbとする
print(type(wb))      # wbの属性を調べる <class 'openpyxl.workbook.workbook.Workbook'>
wb.save('new.xlsx')  # Workbookオブジェクトに名前を付けて(new.xlsx)保存する
Workbook関数のイメージ
図6 save関数のイメージ➀

また、既存のブック”sample.xlsx”を読込んで別名“sample_copy.xlsx”で保存する例は次のList3のとおりです。既存ブックを変更せずに別名で新たなブックが作成され ます。

import openpyxl as px

wb = px.load_workbook('sample.xlsx', data_only=True)    # sample.xlsx をWorkbookオブジェクトとして読み込む

# Workbookオブジェクトに名前を付けて(sample_copy.xlsx)保存する(別名にして保存)
wb.save('sample_copy.xlsx')
save関数のイメージ
図7 save関数のイメージ②

2.3 ワークシートの操作(Worksheetオブジェクトの取得)

Workbookオブジェクトの次はその配下に位置するWorksheetオブジェクトを生成してきます。

Worksheetオブジェクトを取得するにはWorkbookオブジェクト同様に既存のシートのオブジェクトを取得する場合と新規オブジェクトを追加する場合の2つがあります。

まず、既存シートのオブジェクトを取得する場合ですが、activeプロパティworksheetsプロパティを使います。

またオブジェクトではなくワークシート名(文字列)を取得するにはsheetnamesプロパティを次の書式のように使います。

Workbookオブジェクト (sheetnames, Active, worksheetsプロパティ各種)

Workbookオブジェクト.sheetnames

戻り値:ワークシート名のリスト

公式Document(sheetnames)


Worksheetオブジェクト = Workbookオブジェクト.active

戻り値:Worksheetオブジェクト(現在アクティブなワークシートのWorksheetオブジェクトを取得する)

公式Document(active)


Worksheeetオブジェクトのリスト = Workbookオブジェクト.worksheets

戻り値:Worksheetオブジェクトのリスト

公式Document(worksheets)

ここでこれらのプロパティを使ったサンプル例を示します。次(図8上)のようなシート構成をもった”sample.xlsx”からシート名と、選択中および全てのWorksheetオブジェクトを取得しています。

import openpyxl as px

wb = px.load_workbook('sample.xlsx', data_only=True)    # sample.xlsx をWorkbookオブジェクトとして読み込む
print(wb.sheetnames)    # sample.xlsxに含まれるワークシート名を取得する >> ['Sheet1', 'Sheet2', 'Sheet3']

ws = wb.active    # sample.xlsxの現在選択されているワークシート(Worksheetオブジェクト)を取得する
print(ws)         # >> <Worksheet "Sheet1">

ws_list = wb.worksheets    # sample.xlsxに含まれるワークシート(Worksheetオブジェクト)を全て(リスト形式で)取得する
print(ws_list)             # >> [<Worksheet "Sheet1">, <Worksheet "Sheet2">, <Worksheet "Sheet3">]

wb.close()
worksheets,activeプロパティ関数イメージ
図8 各種プロパティ

2.3.1 ワークシートを追加する

Worksheetオブジェクトが取得できました、次は新規ワークシートを追加してみましょう。ワークシートの新規追加にはcreate_sheet関数を次の書式で使います。

Workbookオブジェクト (create_sheet関数)

Workbookオブジェクト.create_sheet(sheet_name, num)関数


引数1:sheet_name:追加するシート名

引数2:num:追加するシートの順番※

※「0」と指定すると一番上のシート(左端)を示す

戻り値:ワークシート名のリスト

公式Document(create_sheet)

サンプルコードを示します、既存のブック内(図9上)の先頭と最後に1枚づつワークシートを追加しています。ポイントはCreate_sheet関数の第2引数の指定です。先頭に挿入する場合は「0」を、最後に挿入する場合は「既存のワークシート枚数」を指定することで対応できます。

import openpyxl as px

wb = px.load_workbook('sample.xlsx', data_only=True)	 # sample.xlsx をWorkbookオブジェクトとして読み込む

wb.create_sheet('追加したシート(先頭)', 0) 		           # 第2引数に'0'を指定して先頭にワークシートを追加する

ws_num = len(wb.sheetnames)			                       # 現在のワークシート総数
wb.create_sheet('追加したシート(末尾)', ws_num) 	       # 第2引数に既存のシート数を指定して末尾にワークシートを追加する

wb.save('sample.xlsx')

List5実行後のシート構成は次のようになりました。(図9下)

openpyxl_create_worksheet関数の実行例
図9 create_sheet関数で新規シートを追加

2.3.2 ワークシートを削除する

不要になったシートを削除するには、remove関数を次の書式のように使います。

Workbookオブジェクト (remove関数)

Workbookオブジェクト.remove(worksheet)関数


引数1:worksheet:削除対象のWorksheetオブジェクトを指定

公式Document(remove)

2.3.3 ワークシートを複製(コピー)する

ワークシートの複製は、copy_worksheet関数を次の書式のように使います。

Workbookオブジェクト (copy_worksheet関数)

Workbookオブジェクト.copy_worksheet(worksheet)関数


引数1:worksheet:コピーするWorksheetオブジェクトを指定

公式Document(copy_worksheet)

注意が必要なのはopenpyxlでは同一のブック内のシートのコピーは可能ですが、異なるブック間におけるシートのコピーはcopy_worksheet関数では対応できない点です。

openpyxl_copy_worksheet関数の適用範囲
図10 異なるブック間の一括コピーはできない

では、サンプルコードで確認してみましょう。元のブック(図11上)のSheet1をコピーし、Sheet2を削除しています。copy_worksheet関数 の引数を省略した場合は、ブックの最後のシートにコピーされ“元のシート名_Copy”というシート名が自動で付与されます。

import openpyxl as px

wb = px.load_workbook('sample.xlsx', data_only=True)   # sample.xlsx をWorkbookオブジェクトとして読み込む

wb.copy_worksheet(wb['Sheet1'])                        # 同一ブック内のワークシートをコピーする
wb.remove(wb['Sheet2'])                                # ワークシートを削除する

wb.save('sample.xlsx')

List6実行後のシート構成は次のようになりました。(図11下)

openpyxl_copy_worksheet関数の実行例
図11 copy_worksheet関数/remove関数によるシートの複製・削除

3. 行/列/セルのオブジェクトについて

Excelと同じようにopenpyxlでワークシート上のデータを操作するには、行、列・セルの単位で扱います。それぞれ、Row/Column/Cellオブジェクトとして取得し操作します。

コードを書く際にはその包含関係や階層構造を常に意識しておかなければなりません。重要なので冒頭のオブジェクトの階層構造図を再掲します。

openpyxlオブジェクトの階層構造
図12 主要オブジェクトの改造構造

Excelのワークシート上に各々のオブジェクトの位置関係を重ねたのが図13になります。

各オブジェクトの位置関係(Excelシート上)
図13 Row/Column/Cellオブジェクトの位置関係図

また、openpyxlでデータを取得する際の基準点は「A1セル」となります。ここから1行目1列目として各オブジェクトを操作します。(通常のインデックスのように「0」はじまりではありませんので注意してください。)

また、openpyxl特有の考え方として、この後に紹介する行・列・セルの各オブジェクトの有効範囲は、図14の網掛部分のように完全に「A1セル」から完全に空白で囲まれていない領域が対象となります。

また、点線囲部のように途中の何も入力されていないセル(ブランク)は「NULL」文字が入力されているものとして処理します。

オブジェクトの有効範囲図(Excelシート上)
図14 openpyxlオブジェクト有効範囲

3.1 行の取得(Rowオブジェクトの取得)

データ処理を行単位で行うには Rowオブジェクト を取得します。書式としては次の3種類があります。

それぞれ戻り値は、目的のRowオブジェクト、もしくはRowオブジェクトを要素とするジェネレータとなります。

通常、行番号は「1」からはじまる整数を指定しますが、rowsプロパティ の戻り値はタプル形式となりインデックスで指定しますので「0」からとなります。

Rowオブジェクト

➀.Worksheetオブジェクト[row]

引数:row: 対象行の行番号を指定する 行番号は1からはじまる(0ではないので注意)

戻り値:Rowオブジェクト


➁. Worksheetオブジェクト.rowsプロパティ

戻り値: Rowオブジェクトのジェネレータ


➂.Worksheetオブジェクト.iter_rows(min_row, max_row, min_col, max_col)

引数1:min_row:イテレーションを開始する行 以下全てオプショナル引数

引数2:max_row:イテレーションを終了する行

引数3:min_col:イテレーションを開始する列

引数4:max_col:イテレーションを終了する列

戻り値:Rowオブジェクトのジェネレーター

その他、Rowオブジェクトに関連するメソッド・プロパティは以下のようなものがあります。

メソッド・プロパティ機能その他詳細
Worksheetオブジェクト.min_rowプロパティデータを含むセルがある最初の行番号
(整数)を取得
Worksheetオブジェクト.max_rowプロパティデータを含むセルがある最終行の番号
(整数)を取得

Worksheetオブジェクト.insert_rows(idx, amount)Rowオブジェクトを挿入する引数:idx:Rowオブジェクトを挿入する行番号を指定
引数:amount:挿入する行数の指定を指定
Worksheetオブジェクト.deleate_rows(idx, amount)Rowオブジェクトを削除する引数:idx:Rowオブジェクトを削除する行番号を指定
引数:amount:削除する行数の指定を指定

Rowオブジェクトの取得に関するコード例を示します。

コードの概要は、[A]でWorksheetオブジェクトのインデックス指定で、1行目のRowオブジェクト(Cellを要素としたタプル)を取得し、[B][C]でrowsプロパティ、iter_rows()メソッドでRowオブジェクトのジェネレータを得ています。

最後[D]では、insert_rows()メソッドで2行目以降に2行分のRowオブジェクトを挿入し、挿入前後の行数を確認しています。

なお、“Sample.xlsx”ファイルを読込み、A1:C2のセルに値が書かれているとします。

from openpyxl import load_workbook
from openpyxl import Workbook

wb = load_workbook('Sample.xlsx')
ws = wb.active


# [A]----------------------------------------------------------------------------------
# Rowオブジェクトの取得➀ Worksheetオブジェクト[row]

print(ws[1])
# >> (<Cell 'Sheet1'.A1>, <Cell 'Sheet1'.B1>, <Cell 'Sheet1'.C1>)


# [B]----------------------------------------------------------------------------------
# Rowオブジェクトの取得➁ Worksheetオブジェクト.rowsプロパティ

print(ws.rows)
# >> <generator object Worksheet._cells_by_row at 0x0000017B7929C7C8>

for row in ws.rows:
    print(row)

# >> (<Cell 'Sheet1'.A1>, <Cell 'Sheet1'.B1>, <Cell 'Sheet1'.C1>)
# >> (<Cell 'Sheet1'.A2>, <Cell 'Sheet1'.B2>, <Cell 'Sheet1'.C2>)

# [C]----------------------------------------------------------------------------------
# Rowオブジェクトの取得➂ Worksheetオブジェクト.iter_rowsメソッド

# 2行目以降でかつ2列目以降のRowオブジェクト
for row in ws.iter_rows(min_row=2, min_col=2):
    print(row)

# >> (<Cell 'Sheet1'.B2>, <Cell 'Sheet1'.C2>)


# [D]----------------------------------------------------------------------------------
# その他、Rowオブジェクト関連のメソッド・プロパティ
print(ws.min_row)   # >> 1 最初の行番号
print(ws.max_row)   # >> 2 最後の行番号

ws.insert_rows(2,2) # >> 2行目以降に2行追加
print(ws.max_row)   # >> 4 2行追加されたことを確認

List7の実行結果は以下のとおりとなります。また、コード内の戻り値の型も確認してください。

Rowオブジェクトの取得コードの実行結果
図15 List7の参照範囲と実行結果

3.2 列の取得(Columnオブジェクトの取得)

データ処理を列単位で行うには Columnオブジェクト を取得します。書式としては次の3種類の方法がありますが、Rowオブジェクトからは、基準が行→列にかわっただけで用法は同じです。

Columnオブジェクト

➀.Worksheetオブジェクト[col]

引数: col : 対象列の列名を指定する(‘A’,’B’,’C’といったようにアドレス指定)

戻り値:Columnオブジェクト


➁. Worksheetオブジェクト.columnsプロパティ

戻り値: Columnオブジェクトのジェネレータ


➂.Worksheetオブジェクト.iter_cols(min_row, max_row, min_col, max_col)

引数1: min_row :イテレーションを開始する行 以下全てオプショナル引数

引数2: max_row :イテレーションを終了する行

引数3: min_col :イテレーションを開始する列

引数4: max_col :イテレーションを終了する列

戻り値:Columnオブジェクトのジェネレーター

その他、Columnオブジェクトに関連するメソッド・プロパティもRowと同様に以下のようなものがあります。

メソッド・プロパティ機能その他詳細
Worksheetオブジェクト.min_columnプロパティデータを含むセルがある最初の列番号
(整数)を取得
Worksheetオブジェクト.max_columnプロパティデータを含むセルがある最終列の番号
(整数)を取得

Worksheetオブジェクト.insert_cols(idx, amount)Columnオブジェクトを挿入する引数:idx:Columnオブジェクトを挿入する列番号を指定
引数:amount:挿入する列数の指定を指定(オプション引数)
Worksheetオブジェクト.deleate_cols(idx, amount)Columnオブジェクトを削除する引数:idx:Columnオブジェクトを削除する列番号を指定
引数:amount:削除する列数の指定を指定(オプション引数)

Columnオブジェクトの取得に関するコード例も示しておきます。Rowオブジェクトからは基準が変わっただけなので、解説と実行結果は省きます。

from openpyxl import load_workbook
from openpyxl import Workbook

wb = load_workbook('Sample.xlsx')
ws = wb.active


#----------------------------------------------------------------------------------
# Columnオブジェクトの取得➀ Worksheetオブジェクト[col]

print(ws['A'])
# >> (<Cell 'Sheet1'.A1>, <Cell 'Sheet1'.A2>)


#----------------------------------------------------------------------------------
# Columnオブジェクトの取得➁ Worksheetオブジェクト.columnsプロパティ

print(ws.columns)
# Columnオブジェクトのジェネレータを取得
# >> <generator object Worksheet._cells_by_col at 0x0000017B7BD3A048>

for col in ws.columns:
    print(col)
    
# Columnオブジェクトの中身(Cellオブジェクトのタプル)を1件ずつ表示
# >> (<Cell 'Sheet1'.A1>, <Cell 'Sheet1'.A2>)
# >> (<Cell 'Sheet1'.B1>, <Cell 'Sheet1'.B2>)
# >> (<Cell 'Sheet1'.C1>, <Cell 'Sheet1'.C2>)


#----------------------------------------------------------------------------------
# Columnオブジェクトの取得➂ Worksheetオブジェクト.iter_colsメソッド

for col in ws.iter_cols(min_row=2, min_col=2):
    print(col)
    
# 2行目以降でかつ2列目以降のColumnオブジェクトの中身(Cellオブジェクトのタプル)を1件ずつ表示
# >> (<Cell 'Sheet1'.B2>,)
# >> (<Cell 'Sheet1'.C2>,)


#----------------------------------------------------------------------------------
# その他、Columnオブジェクト関連のメソッド・プロパティ

print(ws.min_column)   # >> 1 最初の行番号
print(ws.max_column)   # >> 3 最後の行番号

ws.insert_cols(3,2)    # >> 3列目以降に2列追加
print(ws.max_column)   # >> 5 2行追加されたことを確認

3.3 セル単位の操作(Cellオブジェクトの取得)

最小処理単位となるセルを操作するためには Cellオブジェクト を取得します。このオブジェクトの取得方法もまた「インデックス指定」「メソッド・プロパティ」を使うなどいくつかの書式が用意されています。

引数の指定方法は他のオブジェクト同様、A1セル基準を「0」とするもの「1」とするものとアドレス方式で指定するものさまざまですので気を付けてください。

Cellオブジェクト

➀. Worksheetオブジェクト[row_index][col_index]

インデックス1: row_index:A1セルを「1」とする行番号(整数)を指定

インデックス2: col_index:A1セルを「1」とする列番号(整数)を指定 ※

(※ 列名’A’, ’B’などと指定するとエラーになるので注意)

戻り値:Cellオブジェクト


➁. Worksheetオブジェクト[cell_adr]

インデックス: cell_adr:セルアドレス方式(‘A1’,’B2’など)で指定する

戻り値:Cellオブジェクト


➂. Worksheetオブジェクト.cell(row, column)

引数1: row: A1セルを「1」とする行番号(整数)を指定

引数2: column: A1セルを「1」とする列番号(整数)を指定 ※

(※ 列名’A’, ’B’などと指定するとエラーになるので注意)

戻り値:Cellオブジェクト


➃. Worksheetオブジェクト.valuesプロパティ

戻り値:各行のCell値のタプル(ジェネレータ) ※

(※ valuesで取得できる範囲は、A1セルから値の入っている最終行、最終列まで)


➄. Rowオブジェクト[row_index]

インデックス: row_index:A1セルを「0」とする行番号(整数)を指定 ※

(※タプルのインデックスなので0始まりなので注意)

戻り値: Cellオブジェクト


➅. Columnオブジェクト[col_index]


インデックス: col_index: A1セルを「0」とする列番号(整数)を指定 ※

(※タプルのインデックスなので0始まりなので注意)

戻り値: Cellオブジェクト

Cellオブジェクト取得に関する例を示します。

セルの値は、Cellオブジェクトの valueプロパティ にて取得しています。

from openpyxl import load_workbook
from openpyxl import Workbook

wb = load_workbook('Sample.xlsx')
ws = wb.active

#---------------------------------------------------------------------
# Cellオブジェクトの取得➀ Worksheetオブジェクトのインデックス指定
#---------------------------------------------------------------------

# セルのインデックスを指定する場合
# A1セルは行が1、列が0と指定する
print(ws[1][0]);  print(ws[1][0].value)

# >><Cell 'Sheet1'.A1>  >>1

# 列のインデックスは列名で指定することはできません。次のようにエラーとなります。
# print(ws[1]['A'])

# >>TypeError: tuple indices must be integers or slices, not str

# セルのアドレスを指定する場合
print(ws['A1']);  print(ws['A1'].value)

# >><Cell 'Sheet1'.A1>  >>1


#---------------------------------------------------------------------
# Cellオブジェクトの取得➁ cellメソッドによる取得
#---------------------------------------------------------------------

# 行, 列の順番で引数を指定する
print(ws.cell(1, 1)); print(ws.cell(1, 1).value)

# >><Cell 'Sheet1'.A1>   >>1

# 名前付き引数で指定した場合
print(ws.cell(row=1, column=1)); print(ws.cell(row=1, column=1).value)

# >><Cell 'Sheet1'.A1>   >>1


#---------------------------------------------------------------------
# Cellオブジェクトの取得➂ valuesによる取得
#---------------------------------------------------------------------

# ジェネレータ(各行のCell値のタプル)
print(ws.values)

# >><generator object Worksheet.values at 0x0000017B7BDB0CC8>


# 値として出力されるので、valueプロパティを使う必要なし
for row in ws.values:
    print(row); print(row[0]); print(row[1]); print(row[2])

# >> (1, 2, 3) >> 1  >> 2  >> 3
# >> (4, 5, 6) >> 4  >> 5  >> 6

#---------------------------------------------------------------------
# Cellオブジェクトの取得➃ Row/Columnオブジェクトから展開するパターン
#---------------------------------------------------------------------

# <Rowオブジェクトから展開>
for row in ws.rows:
    for cell in row:
        print(cell); print(cell.value)

# >> <Cell 'Sheet1'.A1>; >> 1
# >> <Cell 'Sheet1'.B1>; >> 2
# >> <Cell 'Sheet1'.C1>; >> 3
# >> <Cell 'Sheet1'.A2>; >> 4
# >> <Cell 'Sheet1'.B2>; >> 5
# >> <Cell 'Sheet1'.C2>; >> 6


# <Columnオブジェクトから展開>
for col in ws.columns:
    for cell in col:
        print(cell); print(cell.value)
        
# >> <Cell 'Sheet1'.A1>; >> 1x
# >> <Cell 'Sheet1'.A2>; >> 4
# >> <Cell 'Sheet1'.B1>; >> 2
# >> <Cell 'Sheet1'.B2>; >> 5
# >> <Cell 'Sheet1'.C1>; >> 3
# >> <Cell 'Sheet1'.C2>; >> 6

実行結果はコード内のコメントを参考にして下さい。

Cellオブジェクトについては、他にも様々な用途・操作方法があります、関連記事として以下も併せてご覧ください。

4.まとめ

いかがでしたでしょうか?

今回はMS-OfficeのExcelを操作する外部ライブラリとして「openpyxl」を取り上げました。Excelファイルの新規作成や保存といった基本操作と、ファイルを構成する基幹オブジェクトの取り扱いについて解説してきました。

ここでこの記事のポイントを整理しておきましょう。

➀. Excelを操作できるPython外部・内部ライブラリはいくつかある、その中でも使いやすく、豊富な機能を提供するライブラリが「openpyxl」である。

➁. ファイルの新規作成、読み込み、保存など基本的な操作は数ステップのコードを書くだけで対応可能である。

➂. Excelを操作する際に重要になるのは、行・列・セルの各オブジェクトの階層・包含関係を理解すること。それが分かれば感覚的にopenpyxlでコーディングができる。


Excelで出来る様々な操作をopenpyxlを使って対応できます。とりわけ、セルの取り扱いはExcel作業の主目的となるものです。

そこで、次回の記事ではさらにセル(Cellオブジェクト)について深堀解説していきます。ぜひ、次の記事も参考にして頂けたら幸いです。リンク先はこちらになります。↓

最後までお読みいただきありがとうございました。

タイトルとURLをコピーしました