YutaKaのPython教室

Python の文法やライブラリ、API、環境構築について画像・動画・ソースコード付きで徹底解説!

openpyxl | pythonでExcelを操作する方法徹底「図解」!

openpyxlを使用すると、PythonでExcelを操作することができます。

今回は、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が制御変数に渡されます。

そのSheettitleプロパティを1つずつ表示しています。

enumerateを使用すると、Sheetindexも同時に出力できます。

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

シート名を変更する場合には、Sheettitleプロパティを書き換えます。

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を自由自在に操るには慣れが必要な部分もあると思います。

そのため、例題をもとに手を動かしながら覚えるのがおススメです。

私の場合は次の本で勉強して、短時間である程度自由に使用できるようになっています。

Excel×Python最速仕事術

Excel×Python最速仕事術

  • 作者:金宏 和實
  • 発売日: 2019/11/29
  • メディア: Kindle版
 

【追記】この参考書のレビューも書いてみました!

おわりに

今回は、openpyxlでExcelファイルを操作する方法を紹介しました。

openpyxlでは、ブックやシート、セルをオブジェクトとして扱います。

  • ブック(Excelファイル):Workbookオブジェクト
  • シート:Sheetオブジェクト
  • セル:Cellオブジェクト

各オブジェクトのメソッドやプロパティを使用して、Excelファイルを操作していきます。

pythonでExcelを操作する選択肢は他にもあります。

例えば、データ分析を行う場合には、openpyxlよりもpandasで直接読み込む方が便利な場合が多いです。

Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。

気楽にツイートしているので、気軽にフォローしてください!