<当サイト「Pythonでもっと自由を」のコンセプト>
本サイトは、現在人気No.1プログラミング言語である「Python」を使って、「日常の面倒な作業を自動化し効率アップを目指す!」ことを目標に、毎回さまざま役立つライブラリ(モジュール)を紹介しています。
なぜ? Pythonなのか・・・
・Pythonには、私たちのの身近なアプリケーションを操作し自動化をサポートしてくれるさまざまなライブラリ(モジュール)が提供されている。
・初心者でも理解しやすいスクリプト言語でありながら、本格的なオブジェクト指向の側面を合わせ持つバランスの良い言語である。
何を? 自動化する・・・
ビジネスシーンにおいて、もっとも身近に使われるアプリケーションといえば、、、真っ先に思い浮かべるものとしては、MS-Officeの「Excel」「Word」「PowerPoint」・・・あたりではないでしょうか?
毎日使う「定番必須ツール」だからこそ、これらに関わる作業の自動化や効率を上げることのインパクトは非常に大きいと言えます。
そこで今回の連載記事ではOfficeの中でももっとも活用頻度が高いと思われる「表計算ソフトExcel」を「Python」で操作する方法とそのライブラリを紹介していきたいと思います。
Excelには、とても多くの機能が備わっていますので、この記事だけで全てを網羅することはできません。次のようなテーマに沿って複数回の連載記事にわたって詳細解説します。
連載1回目となる今回は、ライブラリの導入方法から、「Workbook/Worksheetの新規作成」「行・列・セルの操作」までを取り上げます。
この記事を読むことで次のようなことが「できる・わかる」ようになりますので最後までお付き合いください。
それでは、次節よりライブラリの概要と導入方法、各種オブジェクトについて解説します。
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の使い方の基本
本節では、openpyxlのオブジェクト構造と、ブックを作成する・シートを追加するといった基本操作について解説します。
Excelは、ワークブック・ワークシート・行・列・セルといった構成ユニットを持ちます。openpyxlも同様に、各構成ユニットごとに専用のオブジェクトを用意し管理しています。 openpyxlのオブジェクトのレイヤー構造を下(図3)に示します。
基本的には、上位のレイヤーから順番にオブジェクトを取得していき、関連するメソッドや属性をつかって所望のコンテンツを含むワークブック(.xlsxファイル)を作成していくことになります。
以降では、上位のレイヤーから順番に Workbookオブジェクト、Worksheetオブジェクト および Cellオブジェクト の扱い方について解説していきます。
2.1 ブックを読込む・新規作成する(Workbookオブジェクトの取得)
openpyxlを使ってExcelを操作するにはまずWorkbookオブジェクトを取得する必要があります。WorkbookオブジェクトはExcelファイルそのものであって数多くある配下のクラスやメソッド・属性などを使って目的のコンテンツを作り上げていきます。
Workbookオブジェクトを取得するには、「既存のExcelファイル(ブック)を読込む場合」と「新規ファイル(.xlsx)を作成する場合」の2つがあります。
まず、既存のブックを読込む場合については、load_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オブジェクトが取得できたことを意味します。
イメージは次のようになります。
プログラム終了前にはWorkbookオブジェクトを保存(saveメソッド)するか、閉じる(closeメソッド)ようにしますがこれについては後述します。
一方、新規ブックを作成するには、Workbookクラス を次の書式のようにしてインスタンスを生成します。
Workbookクラスは通常、引数なしでオブジェクトを生成しますが、openpyxlには書き込み専用(Write-only mode)モードが用意されており、引数:write_only に“True”を設定することで有効になります。(デフォルトはFalse)
書込み専用モードも、メモリの消費量を抑えることでパフォーマンスの向上が図れます。しかし、制約が多いため通常は使うことはないでしょう。
Workbookクラスのイメージです。プログラム例は(saveメソッド)と一緒に掲載します。
2.2 ブックを保存する
次に作成したブックを保存します。ブックの保存には saveメソッド を使います。引数:filename には保存するブック名を拡張子(.xlsx)付きで指定します。また、保存先が、カレントディレクトリ出ない場合は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')
2.3 ワークシートの操作(Worksheetオブジェクト)
Workbookオブジェクトの次のレイヤーは Worksheetオブジェクト です。
Worksheetオブジェクトを取得するには「ブック上に存在しているシートのオブジェクトを取得する」場合と「新規Worksheetオブジェクトを追加する」場合の2つがあります。
2.3.1 ワークシート(既存)の取得
既存シートのオブジェクトを取得する場合については、Workbookオブジェクト配下の activeプロパティ と worksheetsプロパティ を使います。またオブジェクトではなくワークシート名(文字列)を取得するには 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()
2.3.2 ワークシートを追加する
次は、新しいWorksheetオブジェクトを追加してみましょう。ワークシートを追加するには create_sheet()メソッド を次の書式のようにして使います。
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枚づつシートが追加されました。
2.3.3 ワークシートを削除する
不要になったシートを削除するには、remove()メソッド を次の書式のように使います。
2.3.4 ワークシートを複製(コピー)する
ワークシートの複製は、copy_worksheet()メソッド を使います
注意が必要なのは、copy_worksheet()メソッドでは同一ブック内でのシートの複製は可能ですが、異なるブック間におけるシートの複製はを対応できない点です。(図9)
さらに、複製の対象は、値、スタイル、ハイパーリンクとコメントです。画像やグラフ(Chartオブジェクト)の複製はできない制約があります。
ですので、別のブックからコンテンツを複製するには、セル(Cell)オブジェクト単位でデータのやり取り(取得と設定)を繰り返す必要があります。
(※少し面倒ですね。今後のアップデートに期待しましょう。)
それでは、サンプルコード<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下のようになりました。
3. 行(Row)/列(Column)/セル(Cell)を取得する
Excelと同じようにopenpyxlでワークシート上のデータを操作する単位は、行、列・セルとなります。それぞれ、Row/Column/Cellオブジェクト として管理されています。
コードを書く際には、その包含関係やレイヤー構造を常に意識しておかなければなりません。重要なので冒頭のオブジェクトのレイヤー構造を再掲します。
各オブジェクトの位置関係を、Excelワークシート上に重ねました。(図12)
行・列・セルの基準点は「“A1”セル」となります。“A1セル”を1行目/1列目として、そこからのオフセット量をセル(行・列)アドレスとして各オブジェクトにアクセスします。(通常のインデックスのように「0」はじまりではありませんので注意してください。)
また、「Cellオブジェクトがメモリ空間に確保される条件」は次の2つがあります。
- 特定のセル(単一・範囲)にデータをセット (又は単にアクセス)した場合
- 1.の特定セルと1行目・A列目に挟まれたセル(セル範囲)があった場合
の2つです。
2.について補足します。
例えば、図13のように“C4:F8”のセル範囲に値をセット(アクセス)した場合を考えます。一見すると、値をセットされている”C4:F8“のCellオブジェクトだけが存在しているかのように見えます。(条件1)
ところが実際のメモリ空間上には、図13上の点線で囲まれた、何もない”空白“セルについてもCellオブジェクトも内部的に自動生成されています。これらの中身は”NULL“であり、実処理には使えませんが、オブジェクト自体は存在することになります。
2.について注意する必要があるのは、後述する「cellsプロパティ / valuesプロパティ」などで全Cellオブジェクトを取得した場合に、実体のない(NULL)セルまでもが取得対象になってしまう場合です。
次項より、個別のオブジェクトを取得する方法を解説をしていきます。
3.1 行データを取得する(Rowオブジェクト)
行単位で行うデータ処理はRowオブジェクトで操作する必要があります。
Rowオブジェクトの実体は、セル(Cellオブジェクト)を要素とするタプルです。
Rowオブジェクトを取得するには次の3つの方法があります。
いずれも Worksheetオブジェクト 配下のメソッド・プロパティとなります。
それぞれ戻り値の形式に違いがあり、目的のRowオブジェクトを直接指定する場合(➀)や、Rowオブジェクトを要素とするジェネレータ形式で、まとめて取得する rowsプロパティ (②)や iter_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:削除する行数の指定を指定 |
ここで、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)とコード内のコメントに示すとおりです。
3.2 列データを取得する(Columnオブジェクト)
列単位で行うデータ処理はColumnオブジェクトで操作する必要があります。
Columnオブジェクトの実体は、セル(Cellオブジェクト)を要素とするタプルです。
Columnオブジェクトを取得するには次の3つの方法がありまが、Rowオブジェクトから基準が行→列にかわっただけで用法は同じです。
また、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:削除する列数の指定を指定 |
ここで、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オブジェクトで行える操作例 >
openpyxlにはCellオブジェクトへアクセスする手順がたくさん用意されています。(以下の書式は一例です)
➀➁は、Worksheetオブジェクトに対して、[cell_adr]([row_index][col_index])でセルアドレスやセル番号を指定してアクセスします。また、➂のように cell()メソッド もあります。
さらに、➄➅のようにRow/Columnオブジェクトに対して、[index]でインデックス指定もできます。
このように、“A1”,” B3”といったアドレス指定方式、セル番号(インデックス)指定方式など様々ですので、データ処理のしやすさなどを考慮して選択します。
ここで、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オブジェクト)について、さらに深堀り解説していきます。
ぜひ、次の記事も参考にして頂けたら幸いです。リンク先はこちらになります。↓
最後までお読みいただきありがとうございました。