OpenPyXL⑮ (ワークシート追加)

ワークシート追加

Workbookオブジェクトcreate_sheetメソッド を使うと、新規のワークシートを追加することができます。

[Google Colaboratory]

1
2
3
4
5
6
7
import openpyxl

book = openpyxl.Workbook() # Workbookオブジェクトを生成
print('[シート追加前]', book.sheetnames)

book.create_sheet() # シート追加
print('[シート追加後]', book.sheetnames)

[実行結果]

create_sheetメソッド はデフォルトで Sheet1 という名前のWorksheetオブジェクトを追加します。

それ以降、追加するたびに Sheet2、Sheet3 ・・・ というシート名が設定されます。

OpenPyXL⑭ (ワークブック保存)

ワークブック保存

Workbookオブジェクトsaveメソッド を使うと、Excelファイルとして保存することができます。

第1引数にファイル名を指定すると、カレントディレクトリにExcelファイルが保存されます。

ファイル・パスを指定すると、カレントディレクトリ以外にExcelファイルを保存することができます。

[Google Colaboratory]

1
2
3
4
import openpyxl

book = openpyxl.Workbook() # Workbookオブジェクトを生成
book.save('Test.xlsx') # 名前を付けて保存する

[実行結果]

ブラウザ左側のフォルダアイコンを選択すると、Test.xlsl という新規のエクセルファイルが作成されていることが確認できます。

OpenPyXL⑬ (新規ワークブック作成)

新規ワークブック作成

新規のWorkbookオブジェクトを作成するには、openpyxl.Workbookコンストラクタ を使用します。(4行目)

新規のWorkbookオブジェクトを作成すると、Sheet という名前のワークシートが作成されます。

また、アクティブなワークシート名を参照するには active.title を使います。

[Google Colaboratory]

1
2
3
4
5
6
# 新規のWorkbookオブジェクトを生成する
import openpyxl

book = openpyxl.Workbook() # Workbookオブジェクトを生成
print('全ワークシート名', book.sheetnames)
print('アクティブなワークシート名', book.active.title)

[実行結果]

ワークシート名を変更するには、Worksheetオブジェクトのtitleプロパティ に新しいシート名を設定します。

[Google Colaboratory]

1
2
3
4
# ワークシートに独自の名前を付ける
sheet = book['Sheet'] # Sheetを取得
sheet.title = 'シート名' # sheetにはWorksheetオブジェクトが格納されている
print('変更したシート名', book.sheetnames) # 名前が変更されたか確認する

[実行結果]

OpenPyXL⑫ (指定したセル範囲のデータ取得)

指定したセル範囲のデータ取得

Worksheetオブジェクト に対して、下記のように指定すると、指定したセル範囲のデータ を取得することができます。

   Worksheet[‘開始セル番地’: ‘終了セル番地’]

レコード単位でCellオブジェクトを タプルにしたタプル が返されるので、2重にした forループ を使って全てのデータをレコード単位で取り出すことができます。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
import openpyxl

book = openpyxl.load_workbook('テスト.xlsx') # Excelブックを取得
sheet = book['Sheet1'] # Sheet1を取得

for row_obj in sheet['A2':'D6']: # ①1行のレコードを取り出す
for cell_obj in row_obj: # ②レコードからセルを取り出す
print(cell_obj.coordinate, # セル番地
cell_obj.value # セルの値
)
print('--- 1レコード(1行)終わり ---') # 1行のレコードの区切りを示す

読み込むエクセルファイルは下記になります。

[テスト.xlsx]

[実行結果]

指定したセル範囲(A2〜D6)のデータを取得することができました。

OpenPyXL⑪ (行単位で取り出す)

行単位で取り出す

rowsプロパティ が返すオブジェクトのタプルには、全ての行単位Cellオブジェクト が格納されています。

forループを2重 にすることで、全てのデータを 行単位 で取得することができます。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
import openpyxl, pprint

book = openpyxl.load_workbook('テスト.xlsx') # Excelブックを取得
sheet = book['Sheet1'] # Sheet1を取得

for cells_obj in tuple(sheet.rows): # 1行のレコードを取り出す
for cell_obj in cells_obj: # レコードからCellオブジェクトを取り出す
print(cell_obj.value)
print('--- 1行のレコード終わり ---') # 1行のレコードの区切りを示す

読み込むエクセルファイルは下記になります。

[テスト.xlsx]

[実行結果]

全てのデータを 行単位 で取得することができました。

OpenPyXL⑩ (列単位で取り出す)

列単位で取り出す

columnsプロパティ が返すオブジェクトのタプルには、全ての列単位Cellオブジェクト が格納されています。

forループを2重 にすることで、全てのデータを 列単位 で取得することができます。

[Google Colaboratory]

1
2
3
4
5
6
7
8
import openpyxl, pprint
book = openpyxl.load_workbook('テスト.xlsx') # Excelブックを取得
sheet = book['Sheet1'] # Sheet1を取得

for cells_obj in tuple(sheet.columns): # 列データのタプルから1列ずつ取り出す
for cell_obj in cells_obj:
print(cell_obj.value)
print('------') # 列の区切り

読み込むエクセルファイルは下記になります。

[テスト.xlsx]

[実行結果]

全てのデータを 列単位 で取得することができました。

OpenPyXL⑨ (ワークシートの範囲指定)

ワークシートの範囲指定

Excelでは、ワークシート上をドラッグして 複数のセルの範囲 を指定して、コピーや移動などの操作を行うことができます。

OpenPyXLの Worksheetオブジェクト には Cellオブジェクト が格納されているので、ブラケット演算子を使うことで 特定範囲のCellオブジェクト を取り出すことができます。

[Google Colaboratory]

1
2
3
4
5
6
import openpyxl, pprint

book = openpyxl.load_workbook('テスト.xlsx') # Excelブックを取得
sheet = book['Sheet1'] # Sheet1を取得

pprint.pprint((sheet['A2':'E7'])) # A2~E7のCellオブジェクトを取得

[実行結果]

列Aから列E2目から7行目まで の各レコードが、タプルの中にタプル が格納されたデータ形式で取得することができました。

OpenPyXL⑧ (セル番地の変換)

セル番地の変換

openpyxl.utilsクラス の関数を使うと、列番号から列の文字 を取得したり、列の文字から列番号 を取得をしたりすることが行えます。

  • openpyxl.utils.get_column_letter(列番号)
    列番号 に対応する 列文字 を返す。
  • openpyxl.utils.column_index_from_string(列文字列)
    列文字 に対応する 列番号 を返す。

サンプルコード

セル番地の変換を行うサンプルコードは以下の通りです。

まずは、数値を列文字 に、列文字を数値 に変換してみます。

[Google Colaboratory]

1
2
3
4
5
import openpyxl
from openpyxl.utils import get_column_letter, column_index_from_string

print('列の文字', get_column_letter(1)) # 列番号から列の文字を取得
print('列番号', column_index_from_string('A')) # 列の文字から列番号を取得

[実行結果]

次に、Excelを読み込んで 最終列を数字 で取得し、その数字を 列文字 に変換します。

[Google Colaboratory]

1
2
3
4
5
# 集計表の最終列を列文字で取得する
book = openpyxl.load_workbook('テスト.xlsx') # Excelブックを取得
sheet = book['Sheet1'] # Sheet1を取得
print('最終列の列文字->',
get_column_letter(sheet.max_column)) # 最終列の列文字を取得

読み込むエクセルファイルは下記になります。

[テスト.xlsx]

[実行結果]

最終列の列文字 を取得することができました。

OpenPyXL⑦ (集計表のサイズ取得)

集計表のサイズ取得

Worksheetオブジェクトの max_rowプロパティmax_columnプロパティ を参照すると、集計表のサイズを取得することができます。

集計表のサイズを取得することで、forループでデータを取得するときの 最終位置 とすることができるので便利です。

[Google Colaboratory]

1
2
3
4
5
6
import openpyxl
book = openpyxl.load_workbook('テスト.xlsx') # Excelブックを取得
sheet = book['Sheet1'] # Sheet1を取得

print('最大行数 ->', sheet.max_row) # 表の行数を取得
print('最大列数 ->', sheet.max_column) # 表の列数を取得

読み込むエクセルファイルは下記になります。

[テスト.xlsx]

[実行結果]

max_rowプロパティ で集計表の 最大行数max_columnプロパティ最大列数 を取得することができました。

OpenPyXL⑥ (セル番地を数値で指定)

セル番を数値で地指定

Excelのセル番地は A1B1 のように、列をAから始まる アルファベット、行を 数値 で表します。

ただ、プログラムにおいては 列を文字 で指定するのは面倒です。

そこで Worksheetオブジェクトcellメソッド を使うとセル番地を 数値のみ で指定でき forループ などで特定のセル範囲を連続して処理できるようになります。

まずは A3セル を、1列 3行目 という数値の指定だけで取得してみます。

[Google Colaboratory]

1
2
3
4
5
6
7
8
import openpyxl

book = openpyxl.load_workbook('テスト.xlsx') # Excelブックを取得
sheet = book['Sheet1'] # Sheet1を取得

print(sheet.cell(row=3, # 行を指定
column=1 # 列を指定
).value)

読み込むエクセルファイルは下記になります。

[テスト.xlsx]

[実行結果]

範囲指定

cellメソッド を forループ の中で使うと、指定した範囲 のセルの値を取得することができます。

[Google Colaboratory]

1
2
3
4
5
6
# 指定した範囲のセルの値を取得する
for i in range(2, 8): # 2行目から7行目までを繰り返す
print(i, # 行番号
sheet.cell(row=i, # 2~7が順番に代入される
column=1 # 列は2で固定
).value)

[実行結果]

範囲指定(スキップ)

rangeの 第3引数 を指定すると、指定した数だけ スキップ することができます。

[Google Colaboratory]

1
2
3
4
5
6
# 開始セルから行おきに取り出す(偶数列のセルを対象)
for i in range(2, 8, 2): # 2行目から7行目までを1行おきに繰り返す
print(i, # 行番号
sheet.cell(row=i, # 2~7まで1つおきに代入される
column=1 # 列は2で固定
).value)

[実行結果]

range関数の第3引数に2を指定することで 1行おき に値を取り出すことができました。