openpyxl
を使用すると、PythonでExcelを操作することができます。
今回は、openpyxl
の基本的な使い方について解説します。
- openpyxlのインストール
- openpyxlの構成
- ブックの操作|作成・読み込み・保存
- シートの操作|作成・読み込み・保存
- セルの操作(単一セル)
- セル操作(範囲指定)
- おススメの勉強法
- おわりに
openpyxlのインストール
openpyxl
は組み込みライブラリではないので、pip
またはconda
でインストールします。
pip install openpyxl
conda install openpyxl
とりあえずopenpyxl
を試したい場合は、Google Colaboratoryを使用すればインストール不要です。
openpyxlの構成
openpyxlでは、ブックやシート、セルをオブジェクトとして扱います。
- ブック(Excelファイル):
Workbook
オブジェクト - シート:
Sheet
オブジェクト - セル:
Cell
オブジェクト
各オブジェクトのメソッドやプロパティを使用して、Excelファイルを操作していきます。
ブックの操作|作成・読み込み・保存
ブック(Excelファイル)はWorkbook
オブジェクトとして扱います。
Workbook
オブジェクトを新規に作成したり- 既存のExcelファイルを
Workbook
オブジェクトに読み込んだり
して、Excelファイルを操作します。
- 新規ブックの作成:
Workbook("newbook.xlsx")
- 既存ブックの読み込み:
load_workbook("existingbook.xlsx")
- ブックの保存:
wb.save()
の方法について解説していきます。
新規ブックの作成:Workbook("newbook.xlsx")
Workbook
オブジェクトを作成すると、新規ブックが作成されます。
このとき、引数でブック名を設定できます。
import openpyxl
wb = openpyxl.Workbook("newbook.xlsx")
既存ブックの読み込み:load_workbook("existingbook.xlsx")
既存のブックを読み込むには、load_workbook()
関数にブックのパスを渡します。
path = "existingbook.xlsx"
wb = openpyxl.load_workbook(path)
ブックの保存:wb.save("savedbook.xlsx")
ブックを保存するには、Workbook
オブジェクトのsave
メソッドを使用します。
引数として、保存するブック名を指定します。
wb.save("savedbook.xlsx")
カレントディレクトリ以外に保存する場合は、パスを含んだエクセル名を渡します。
path = "..\_savedbook.xlsx" #親ディレクトリに保存する例
wb.save(path)
存在しないフォルダに保存しようとするとエラーになる点に注意です。
保存先のフォルダはあらかじめ作っておきましょう。
シートの操作|作成・読み込み・保存
シートはWorksheet
オブジェクトとして扱います。
各シートは、
- シート名、
- シート固有のインデックス
を持っています。
どちらを使用してもシートを指定、取得することができます。
基本的なシート操作について解説していきます。
シート名の取得・変更:wb.sheetnames, ws.title
シート名を取得するためには、
Workbook.sheetnames
プロパティで、シート名のリストを表示for文
で、sheet.title
プロパティを1つずつ表示
する2つの方法があります。
Sheet, Sheet1, Sheet2の3つのシートがあるブックを例にシート名を出力します
print(wb.sheetnames)
# ['Sheet', 'Sheet1', 'Sheet2']
for ws in wb:
print(ws.title, end=", ")
# Sheet, Sheet1, Sheet2,
Workbook
オブジェクトをfor文
で回すと、Sheet
が制御変数に渡されます。
そのSheet
のtitle
プロパティを1つずつ表示しています。
enumerate
を使用すると、Sheet
のindex
も同時に出力できます。
for i, sh in enumerate(wb):
print(f"index = {i}, name = {sh.title}")
# index = 0, name = Sheet0
# index = 1, name = Sheet1
# index = 2, name = Sheet2
シート名を変更する場合には、Sheet
のtitle
プロパティを書き換えます。
wb["Sheet"].title = "Sheet0"
print(wb.sheetnames)
# ['Sheet0', 'Sheet1', 'Sheet2']
1行目でシートを[ ]
で指定しています。
シートの指定方法について、次の項で確認していきましょう。
シートの指定:Workbook['シート名'], wb. worksheets[index]
シートの指定方法には、主に次の2つがあります。
- シート名で指定:
Workbook['シート名']
- シートのインデックスで指定:
Workbook.worksheets[index]
Sheet0, Sheet1, Sheet2の3つのシートがあるブックを例に解説していきます。
シートを指定して、変数に格納、シート名を表示してみます。
シート名で指定する場合は、Workbook['シート名']
とします。
ws = wb["Sheet1"]
print(f"シート名:{ws.title}")
# シート名:Sheet1
次に、シートのインデックスで指定します。
インデックスで指定する場合は、Workbook.worksheets[index]
とします。
ws = wb.worksheets[0]
print(f"シート名:{ws.title}")
# シート名:Sheet1
新規シートの作成:creat_sheet()
新規シートを作成するためにはcreat_sheet()
メソッドを使用します。
引数として、作成するシート名を与えることができます。
wb = openpyxl.Workbook()
wb.create_sheet()
wb.create_sheet("New_sheet")
print(wb.sheetnames)
# ['Sheet', 'Sheet1', 'New_sheet']
シート名を指定しないと、Sheet1, Sheet2,…という連番のデフォルト名が設定されます。
シートの削除:wb.remove(sheet), del sheet
シートを削除するには、主に次の2つがあります。
remove()
メソッドで削除:wb.remove(sheet)
del文
で削除:del sheet
Sheet0, Sheet1, Sheet2の3つのシートがあるブックを例に解説していきます。
print(wb.sheetnames)
# ['Sheet', 'Sheet1', 'Sheet2']
# remove()メソッドで削除
wb.remove(wb["Sheet1"])
print(wb.sheetnames)
# ['Sheet', 'Sheet2']
# del文で削除
del wb["Sheet2"]
print(wb.sheetnames)
# ['Sheet']
シートのコピー:wb. copy_worksheet(sheet)
シートをコピーするには
wb. copy_worksheet(sheet)
を使用します。
wb = openpyxl.Workbook()
copied_sheet = wb.copy_worksheet(wb["Sheet"])
print(wb.sheetnames)
# ['Sheet', 'Sheet Copy']
# コピーしたシートの名前を変更
copied_sheet.title = "Copied one"
print(wb.sheetnames)
# ['Sheet', 'Copied one']
copy_worksheet()
メソッドは、コピーしたシートオブジェクトを返します。
変数で受け取っておくと、シート名をスムーズに変更できます。
セルの操作(単一セル)
セルはCell
オブジェクトとして扱います。
特定のCell
にアクセスするには、次の2つの方法があります。
- セル番地でアクセス:
sheet["A1"]
- 行番号、列番号でアクセス:
sheet.cell(1,1)
セルの値はCell
オブジェクト内のvalue
属性に格納されています。
Cell.value
の値を読み込んだり、書き換えたりすることでセルの値を操作していきます。
セル番地でアクセス:sheet["A1"]
セル番地でアクセスするにはsheet
オブジェクトに、セル番地をキーとして与えます。
値の書き換えは直接代入するか、value
属性を指定して代入します。
wb = openpyxl.Workbook()
ws = wb.worksheets[0]
ws["A1"] = "Hello"
ws["B2"].value = "World"
wb.save("Access_to_cell.xlsx")
次のようなシートが出来上がっています。
値を表示する際はvalue
属性を指定します。
print(ws["A1"].value)
print(ws["B2"].value)
# Hello
# World
行番号、列番号でアクセス:sheet.cell(1,1)
行番号、列番号でアクセスするには、sheet
オブジェクトのcell()
メソッドを使用します。
値の書き換えは、value
属性を指定して代入します。
wb = openpyxl.Workbook()
ws = wb.worksheets[0]
ws.cell(1,1).value = "Hello"
ws.cell(2,2).value = "World"
wb.save("Access_to_cell.xlsx")
次のようなシートが出来上がっています。
値を表示する際もvalue
属性を指定します。
print(ws.cell(1,1).value)
print(ws.cell(2,2).value)
# Hello
# World
cell()
メソッドを使用する際は、value
属性を指定するのを忘れないようにしましょう。
セル操作(範囲指定)
セル範囲を指定して、セルを順次操作するには、主に次の3つの方法があります
- セル番地で範囲指定:
sheet["A1:C2"]
- 範囲に一行ずつアクセス:
iter_rows()
- 範囲に一列ずつアクセス:
iter_cols()
次のようなデータを持つExcelファイルを例に範囲指定の方法を見ていきます。
セル番地で範囲指定:sheet["A1:C2"]
セル番地で範囲指定すると、Cell
オブジェクトをタプルで返します。
from pprint import pprint
wb = openpyxl.load_workbook("cell_range.xlsx")
cell_range = ws["A1:C2"]
pprint(cell_range)
# ((<Cell 'Sheet'.A1>, <Cell 'Sheet'.B1>, <Cell 'Sheet'.C1>),
# (<Cell 'Sheet'.A2>, <Cell 'Sheet'.B2>, <Cell 'Sheet'.C2>))
for文
でタプル内の各Cell
オブジェクトにアクセスして、各セルを操作します。
for row in cell_range:
for cell in row:
print(cell.value, end = " ")
print()
# A1 B1 C1
# A2 B2 C2
範囲のセルに一行ずつアクセス:iter_rows()
iter_rows()
でアクセス範囲の行番号、列番号を指定すると、範囲を一行ずつ取り出します。
for文
と組み合わせることで、各セルにアクセスすることができます。
for row in ws.iter_rows(min_row=1,max_row=3,min_col=1, max_col=4):
for cell in row:
print(cell.value, end = " ")
print()
# A1 B1 C1 D1
# A2 B2 C2 D2
# A3 B3 C3 D3
範囲のセルに一列ずつアクセス:iter_cols()
iter_cols()
でアクセス範囲の行番号、列番号を指定すると、範囲を一列ずつ取り出します。
for文
と組み合わせることで、各セルにアクセスすることができます。
for row in ws.iter_cols(min_col=1,max_col=4,min_row=1, max_row=3):
for cell in row:
print(cell.value, end = " ")
print()
# A1 A2 A3
# B1 B2 B3
# C1 C2 C3
# D1 D2 D3
おススメの勉強法
openpyxl
を自由自在に操るには慣れが必要な部分もあると思います。
そのため、例題をもとに手を動かしながら覚えるのがおススメです。
私の場合は次の本で勉強して、短時間である程度自由に使用できるようになっています。
【追記】この参考書のレビューも書いてみました!
おわりに
今回は、openpyxl
でExcelファイルを操作する方法を紹介しました。
openpyxl
では、ブックやシート、セルをオブジェクトとして扱います。
- ブック(Excelファイル):
Workbook
オブジェクト - シート:
Sheet
オブジェクト - セル:
Cell
オブジェクト
各オブジェクトのメソッドやプロパティを使用して、Excelファイルを操作していきます。
pythonでExcelを操作する選択肢は他にもあります。
例えば、データ分析を行う場合には、openpyxl
よりもpandas
で直接読み込む方が便利な場合が多いです。
Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。
気楽にツイートしているので、気軽にフォローしてください!