【Python×Excel】openpyxlの基本(導入からブック・シート・セルの使い方)【徹底解説】

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

English is here >>

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

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

なぜ? Pythonなのか・・・

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

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

何を? 自動化する・・・

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

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

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


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

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

openpyxl_目次_完結版_rev0.1
図2. 連載記事のテーマと本記事の解説範囲

連載1回目となる今回は、ライブラリの導入方法から、「Workbook/Worksheetの新規作成」「行・列・セルの操作」までを取り上げます。

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

この記事で学べること
  • Excelを起動させることなくPythonだけでWorkbookの作成ができる
  • 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.10.6(64bit)

・openpyxl 3.0.9

・JupyterNotebook 6.4.8

・lxml4.5.0

・PIL(Python Imaging Library) 7.0.0

・Microsoft Office Personal 2019

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

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

本ライブラリはパッケージ管理ツール「Anaconda」には同梱されていないため、Pythonパッケージ管理ツール「pip」を使って別途インストールする必要があります。

Anacondaプロンプトに次のコマンドを入力します。

pip install openpyxl

このコマンド一つで、openpyxlはもちろんのこと、依存関係の確認や必要な周辺ライブラリも自動でインストールされます。

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

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

import openpyxl as px

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

スポンサーリンク

2. openpyxlの使い方の基本

Python_基本文法_内包表記

本節では、openpyxlのオブジェクト構造と、ブックを作成する・シートを追加するといった基本操作について解説します。

Excelは、ワークブック・ワークシート・行・列・セルといった構成ユニットを持ちますopenpyxlも同様に、各構成ユニットごとに専用のオブジェクトを用意し管理しています。 openpyxlのオブジェクトのレイヤー構造を下(図3)に示します。

基本的には、上位のレイヤーから順番にオブジェクトを取得していき、関連するメソッドや属性をつかって所望のコンテンツを含むワークブック(.xlsxファイル)を作成していくことになります。

Python_openpyxlオブジェクトの階層構造_rev0.2
図3. オブジェクトのレイヤー構造

以降では、上位のレイヤーから順番に WorkbookオブジェクトWorksheetオブジェクト および Cellオブジェクト の扱い方について解説していきます。

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

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

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

まず、既存のブックを読込む場合については、load_workbookクラス を次の書式のようにしてインスタンスを生成します。

load_workbookクラス

from openpyxl import load_workbook

load_workbook(filename, read_only, keep_vba, data_only)


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

引数: read_only :読み込み専用(Read-only mode)で読み込む デフォルト(False)

引数: keep_vba :xlsmファイルのマクロを有効にして読込む デフォルト(False)

引数: data_only: 数式を数式のまま読込む場合は、Falseを指定する。デフォルト(False)

戻り値: Workbookオブジェクト

引数:filename は必須ですが、その他の引数はオプショナルで初期値は“False”です。

引数:read_only はブックを読込み専用(Read-only mode)として読込みます。読込みモードにすることで、編集不可となりますがメモリの消費量を大幅に下げパフォーマンス向上に寄与します。

引数:keep_vba は、マクロを含むブック(.xlsm)に対してマクロを有効/無効の選択ができます。

もう一つ 引数:data_only はワークシートの数式を数式のまま読込む場合は“False”(デフォルト)を指定します。

普通は、「引数filename」だけを指定すれば問題ありません。

次の<List1>は”sample.xlsx”を load_workbookクラス で読込むだけのプログラム例です。

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

wb = px.load_workbook('sample.xlsx') # 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オブジェクトが取得できたことを意味します。

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

openpyxl_load_workbook関数のイメージ_rev0.3
図4. load_workbookクラスのイメージ

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


一方、新規ブックを作成するには、Workbookクラス を次の書式のようにしてインスタンスを生成します。

Workbookクラス

from openpyxl import Workbook

Workbook(write_only)


引数: write_only :Trueにすると書き込み専用(Write-only mode)にする デフォルト(False)

戻り値: Workbookオブジェクト

Workbookクラスは通常、引数なしでオブジェクトを生成しますが、openpyxlには書き込み専用(Write-only mode)モードが用意されており、引数:write_only に“True”を設定することで有効になります。(デフォルトはFalse)

書込み専用モードも、メモリの消費量を抑えることでパフォーマンスの向上が図れます。しかし、制約が多いため通常は使うことはないでしょう。

Workbookクラスのイメージです。プログラム例は(saveメソッド)と一緒に掲載します。

openpyxl_Workbook関数のイメージ_rev0.2
図5. Workbookクラスのイメージ

2.2 ブックを保存する

次に作成したブックを保存します。ブックの保存には saveメソッド を使います。引数:filename には保存するブック名を拡張子(.xlsx)付きで指定します。また、保存先が、カレントディレクトリ出ない場合はPathも含めて指定します。

Workbookオブジェクト(saveメソッド)

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


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

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

次の<Lsit2>は既存のブック”sample.xlsx”を読込んで別“sample_copy.xlsx”で保存する例です。既存のブックを変更することなく、別名で新規ブックが作成・保存されます。

なお、同名を指定した場合は上書き保存されますが、特に事前に警告メッセージは表示されませんので注意してください。

import openpyxl as px

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

# Workbookオブジェクトに名前を付けて(sample_copy.xlsx)保存する(別名にして保存)
wb.save('sample_copy.xlsx')
openpyxl_saveメソッドのイメージ_rev0.2
図6. saveメソッド(別名で保存/上書き保存)

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

Workbookオブジェクトの次のレイヤーは Worksheetオブジェクト です。

Worksheetオブジェクトを取得するには「ブック上に存在しているシートのオブジェクトを取得する」場合と「新規Worksheetオブジェクトを追加する」場合の2つがあります。

2.3.1 ワークシート(既存)の取得

既存シートのオブジェクトを取得する場合については、Workbookオブジェクト配下の activeプロパティworksheetsプロパティ を使います。またオブジェクトではなくワークシート名(文字列)を取得するには sheetnamesプロパティ などもあります。

Workbookオブジェクト(active/worksheets/sheetnames属性)

Workbookオブジェクト.active

アクティブな(選択されている)ワークシートを取得する

戻り値: Worksheetオブジェクト


Workbookオブジェクト.worksheets

ブックに存在する全てのワークシート(オブジェクト)を取得する

戻り値: Worksheetオブジェクトを要素とするリスト


Workbookオブジェクト.sheetnames

ブックに存在する全てのワークシートの名前を取得する

戻り値: ワークシート名を要素とするリスト

worksheetsプロパティsheetnamesプロパティ は、ブック内にある全てのシート情報を取得します。それぞれ、Worksheetオブジェクトとシート名を要素とするリストを返します。リスト形式なので、For文などでイテラブルに各要素にアクセスできますし、[index]のようにインデックスで個別指定もできます。


ここで、これらプロパティの使用例を示します。(図7)上のようなワークシートで構成された

”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()
openpyxl_worksheets,activeプロパティ_rev0.2
図7. Worksheetオブジェクトの取得

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

次は、新しいWorksheetオブジェクトを追加してみましょう。ワークシートを追加するには create_sheet()メソッド を次の書式のようにして使います。

Workbookオブジェクト(create_sheetメソッド)

Workbookオブジェクト.create_sheet(title, index)


引数: title : シート名を設定する デフォルト(None) オプショナル

引数: index : 追加するシート挿入位置を指定する  デフォルト(None) オプショナル

戻り値:ワークシート名を要素とするリスト

create_sheet()メソッド の使用例をサンプルコードで確認します。読込んだワークブック(図8上)の先頭と最後に1枚づつワークシートを追加しています。

ポイントは create_sheet()メソッド引数:index の指定です。先頭に挿入する場合は「0」を、最後に挿入する場合は「既存のワークシート枚数」もしくは「-1」を指定することで対応できます。

リスト同様に0始まりのインデックスであることに注意しましょう。

import openpyxl as px

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

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

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

wb.save('sample.xlsx')

<List4>実行後のワークシート構成は次のようになりました。(図8下) 先頭と末尾に1枚づつシートが追加されました。

openpyxl_create_worksheet関数の実行例
図8. create_sheet()メソッドで新規シートを追加

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

不要になったシートを削除するには、remove()メソッド を次の書式のように使います。

Workbookオブジェクト (removeメソッド)

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


引数: worksheet: 削除したいWorksheetオブジェクトを指定

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

ワークシートの複製は、copy_worksheet()メソッド を使います

Workbookオブジェクト (copy_worksheetメソッド)

Workbookオブジェクト.copy_worksheet(from_worksheet)


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

戻り値:複製されたWorksheeetオブジェクト

注意が必要なのは、copy_worksheet()メソッドでは同一ブック内でのシートの複製は可能ですが異なるブック間におけるシートの複製はを対応できない点です。(図9)

さらに、複製の対象は、値、スタイル、ハイパーリンクとコメントです。画像やグラフ(Chartオブジェクト)の複製はできない制約があります。

ですので、別のブックからコンテンツを複製するには、セル(Cell)オブジェクト単位でデータのやり取り(取得と設定)を繰り返す必要があります。

(※少し面倒ですね。今後のアップデートに期待しましょう。)

openpyxl_copy_worksheet関数の適用範囲
図9. 複製は同一ブック内に限り

それでは、サンプルコード<List5>で確認してみましょう。図10(上)からSheet1を複製し、Sheet2を削除しています。

copy_worksheet()メソッド は、複製したシートを右端に追加します。“元のシート名_Copy”というシート名が自動で付与され、挿入位置などは指定できません。

import openpyxl as px

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

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

wb.save('sample.xlsx')

<List5>実行した後のシート構成は図11下のようになりました。

openpyxl_copy_worksheet関数の実行例
図10. copy_worksheet()/remove()メソッドによるシートの複製・削除

English is here >>

スポンサーリンク

3. 行(Row)/列(Column)/セル(Cell)を取得する

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

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

Python_openpyxlオブジェクトの階層構造_rev0.2
図11. 主要オブジェクトのレイヤー構造

各オブジェクトの位置関係を、Excelワークシート上に重ねました。(図12)

行・列・セルの基準点は「“A1”セル」となります“A1セル”を1行目/1列目として、そこからのオフセット量をセル(行・列)アドレスとして各オブジェクトにアクセスします。(通常のインデックスのように「0」はじまりではありませんので注意してください。)

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

また、「Cellオブジェクトがメモリ空間に確保される条件」は次の2つがあります。

  1. 特定のセル(単一・範囲)にデータをセット (又は単にアクセス)した場合
  2. 1.の特定セルと1行目・A列目に挟まれたセル(セル範囲)があった場合

の2つです。

2.について補足します。

例えば、図13のように“C4:F8”のセル範囲に値をセット(アクセス)した場合を考えます。一見すると、値をセットされている”C4:F8“のCellオブジェクトだけが存在しているかのように見えます。(条件1)

ところが実際のメモリ空間上には、図13上の点線で囲まれた、何もない”空白“セルについてもCellオブジェクトも内部的に自動生成されていますれらの中身は”NULL“であり、実処理には使えませんが、オブジェクト自体は存在することになります

2.について注意する必要があるのは、後述する「cellsプロパティ / valuesプロパティ」などで全Cellオブジェクトを取得した場合に、実体のない(NULL)セルまでもが取得対象になってしまう場合です。

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

次項より、個別のオブジェクトを取得する方法を解説をしていきます。

3.1 行データを取得する(Rowオブジェクト)

行単位で行うデータ処理はRowオブジェクトで操作する必要があります。

Rowオブジェクトの実体は、セル(Cellオブジェクト)を要素とするタプルです。

Rowオブジェクトを取得するには次の3つの方法があります。

いずれも Worksheetオブジェクト 配下のメソッド・プロパティとなります。

それぞれ戻り値の形式に違いがあり、目的のRowオブジェクトを直接指定する場合()や、Rowオブジェクトを要素とするジェネレータ形式で、まとめて取得する rowsプロパティ ()や iter_rowメソッド()があります。

Rowオブジェクト

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

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

戻り値: Rowオブジェクト


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

戻り値: シート上の全てのRowオブジェクトを要素とするジェネレータ


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

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

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

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

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

戻り値: シート上の全てのRowオブジェクトを要素とするジェネレータ

また、rowsプロパティ はrows[index]のようにして、個別のRowオブジェクトにアクセスすることができます。ジェネレータのインデックスなので、0」を基準にする点には注意しましょう。(通常、行番号は「1」からはじまる整数で指定します。)

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

【Worksheetオブジェクト】機能】その他詳細】
min_rowプロパティ先頭の行番号を取得1を基準(1行目)とする整数
max_rowプロパティ最終行の番号を取得1を基準(1行目)とする整数
insert_rows(idx, amount)Rowオブジェクトを挿入する引数:idx:Rowオブジェクトを挿入する行番号を指定
引数:amount:挿入する行数の指定を指定
deleate_rows(idx, amount)Rowオブジェクトを削除する引数:idx:Rowオブジェクトを削除する行番号を指定
引数:amount:削除する行数の指定を指定
表1. Rowオブジェクト配下のメソッド・属性

ここで、Rowオブジェクトの取得と操作に関するサンプルコードを紹介します。<List6>

(※読み込む“Sample.xlsx”ファイルには、あらかじめ“A1:C2”にデータ用意されているものとします。また、[A][B]などは、コード内のコメントを参照しています。)

コードの概要について

上記3つ方法でRowオブジェクトを取得します。

[A]では、Worksheetオブジェクトの行番号指定により取得します。[B][C]では、rowsプロパティiter_rows()メソッド によりジェネレータを取得、For文により展開しています。

最後[D]では、insert_rows()メソッド で2行分のRowオブジェクトを挿入(追加)しています。

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行追加されたことを確認

List6の実行結果は以下(図14)とコード内のコメントに示すとおりです。

Rowオブジェクトの取得コードの実行結果
図14. List6の実行結果

3.2 列データを取得する(Columnオブジェクト)

列単位で行うデータ処理はColumnオブジェクトで操作する必要があります。

Columnオブジェクトの実体は、セル(Cellオブジェクト)を要素とするタプルです。

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)

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

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

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

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

戻り値: シート上の全てのColumnオブジェクトを要素とするジェネレータ

また、columnsプロパティ はcolumns[index]のようにして、個別のColumnオブジェクトにアクセスすることができます。ジェネレータのインデックスなので、0」を基準にする点には注意しましょう。(通常、列番号は「1」からはじまる整数で指定します。)

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

Worksheetオブジェクト】機能】その他詳細】
min_columnプロパティ先頭列番号を取得1を基準(1列目)とする整数
max_columnプロパティ最終列の番号を取得1を基準(1列目)とする整数
insert_cols(idx, amount)Columnオブジェクトを挿入する引数:idx:挿入する列番号を指定
引数:amount:挿入する列数の指定を指定
deleate_cols(idx, amount)Columnオブジェクトを削除する引数:idx:削除する列番号を指定
引数:amount:削除する列数の指定を指定
表2. Columnオブジェクト配下のメソッド・属性

ここで、Columnオブジェクトの取得と操作に関するサンプルコードを紹介します。<List7>

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オブジェクト)

Excelで行うデータ処理の基本単位はセルです。これまでに解説した行・列もセルの集合体の単位に過ぎません。(図15)

セルはCellオブジェクトで管理され、さまざまな操作を行うことができます。本記事ではひとまずCellオブジェクトの取得(アクセス)するところまでを解説します。具体的な操作にいては、別の記事で取り上げます。

Cellオブジェクトのアンパック
図15. Cellオブジェクトの構成

< Cellオブジェクトで行える操作例 >

  • セルへ値や数式を設定(取得)する >>
  • セルの書式を設定する >>
  • 条件付き書式 >>
  • 図・表・グラフ >>

openpyxlにはCellオブジェクトへアクセスする手順がたくさん用意されています。(以下の書式は一例です)

➀➁は、Worksheetオブジェクトに対して、[cell_adr]([row_index][col_index])でセルアドレスやセル番号を指定してアクセスします。また、のように cell()メソッド もあります。

さらに、➄➅のようにRow/Columnオブジェクトに対して、[index]でインデックス指定もできます。

このように、“A1”,” B3”といったアドレス指定方式、セル番号(インデックス)指定方式など様々ですので、データ処理のしやすさなどを考慮して選択します。

Cellオブジェクト

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

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

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

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

戻り値: Cellオブジェクト


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

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

戻り値: Cellオブジェクト


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

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

引数: 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オブジェクトの取得に関するコード例を示します。<List8>

(※読み込む“Sample.xlsx”ファイルには、あらかじめ“A1:C2”にデータ用意されているものとします。また、[A][B]などは、コード内のコメントを参照しています。)

コードの概要について

[A]:Worksheetオブジェクトのインデックス指定による

[B]:Cell()メソッドの引数指定による

[C]:valuesプロパティから個別Cellオブジェクトの値を展開(行単位)

[D]:Row/Columnオブジェクトから個別Cellオブジェクトへの展開

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

from openpyxl import load_workbook
from openpyxl import Workbook

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

#---------------------------------------------------------------------
# 【A】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


#---------------------------------------------------------------------
#【B】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


#---------------------------------------------------------------------
#【C】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

#---------------------------------------------------------------------
#【D】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オブジェクトについては、他にも様々な用途・操作方法があります。続編記事として以下もあわせて参照してください。

以上、行(Row)/列(Column)/セル(Cell)の概要とオブジェクト取得の方法について解説しました。

4. まとめ

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

今回は、Excelを操作する「openpyxlライブラリ」を取り上げ、ブックの新規作成や保存といった基本操作と、ブックを構成する各種オブジェクトの扱い方について解説しました。

最後にポイントを整理しておきましょう。

➀. Excelを操作できるPythonライブラリはいくつかある。その中でも、特に扱いやすく、豊富な機能を提供してくれるライブラリが「openpyxl」である

➁. ブックの新規作成、読み込み、保存などの基本操作であれば、数ステップのコードで対応できる。

➂. ブックを構成する、行・列・セルの各オブジェクトのレイヤー構造・包含関係を理解することが重要である。とりわけ、Cellオブジェクトは、データ処理の基本単位となり様々な操作を提供する。今回は、Cellオブジェクトの取得(アクセス)する方法についてまとめた。


Excelが提供する様々な機能を、openpyxlを使って操作することができますが、どのような操作・処理を行う場合においても必ず「セル」を経由することになります。

つまりExcel作業セルに対する操作となります。

そこで、次回の記事では、セル(Cellオブジェクト)について、さらに深堀り解説していきます

ぜひ、次の記事も参考にして頂けたら幸いです。リンク先はこちらになります。↓

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

English is here >>

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