Excel読み込み (OpenPyXL) | Python-izm

Excel読み込み (OpenPyXL)

ここではExcel操作ライブラリであるOpenPyXLを用いたExcelファイルの読み込みに関連する機能について触れています。

ブックのオープン

まずはExcelブックの開いてみましょう。Excelであればどのようなファイルでも構いませんが、例で使用しているファイルは下記リンクよりダウンロード出来ます。

test_book.xlsx

import openpyxl

book = openpyxl.load_workbook('test_book.xlsx')

openpyxlモジュールをインポート後、load_workbookを使用してブックを開きます。 引数にはファイル名を指定しましょう。

シート数・シート名の取得

ブック内のシート数と全シート名を出力してみましょう。

import openpyxl

book = openpyxl.load_workbook('test_book.xlsx')
print('--------------------------------')
print(len(book.sheetnames))

print('--------------------------------')
for name in book.get_sheet_names():
    print(name)
--------------------------------
3
--------------------------------
テストシート1
テストシート2
テストシート3

5行目のbook.sheetnamesに対し、lenを用いてシート数を取得出来ます。8行目get_sheet_namesはブック内の全シート名の取得が可能です。

指定のシートを取得

ブック内の特定のシートを取得する例です。次の例ではtitleでそれぞれのシート名を取得しています。

import openpyxl

book = openpyxl.load_workbook('test_book.xlsx')

print(book.active.title)
print(book.worksheets[1].title)
print(book['テストシート3'].title)
print(book.get_sheet_by_name('テストシート3').title)
テストシート1
テストシート2
テストシート3
テストシート3

activeにはブック内において現在選択されているシート(アクティブなシート)が格納されています。例では最初のシートです。worksheetsはブック内の全シートが格納されており、例のようにインデックスで特定のシートを取得することができます。シート名で取得する場合は7、8行目のような方法となります。

シート内の列数・行数取得

特定のシート内に存在する列数と行数を取得します。

import openpyxl

book = openpyxl.load_workbook('test_book.xlsx')

active_sheet = book.active
print(active_sheet.max_column)
print(active_sheet.max_row)
3
10

max_columnで(シート内での最大)列数、max_rowで(シート内での最大)行数を取得出来ます。

セル値の取得

シート内のセル値を取得するには、cellの引数に列と行を渡します。開始値は0ではなく1なので注意してください(列1、行1の指定で最も左上のセル「A1」を取得)。またExcelでセルを指定する‘<列><行>’のような形式でも取得することができます(例では「B2」)。

import openpyxl

book = openpyxl.load_workbook('test_book.xlsx')

active_sheet = book.active
print(active_sheet.cell(column=1, row=1).value)
print(active_sheet['B2'].value)
テストセルA1
テストセルB2

列ベースですべてのセル値を取得する場合は次のようにシートのcolumnsを用います。

import openpyxl

book = openpyxl.load_workbook('test_book.xlsx')

active_sheet = book.active
for column in active_sheet.columns:
    print('----------------------------')
    for cell in column:
        print(cell.value)
----------------------------
テストセルA1
テストセルA2
テストセルA3
テストセルA4
テストセルA5
テストセルA6
テストセルA7
テストセルA8
テストセルA9
テストセルA10
----------------------------
テストセルB1

~中略~

テストセルC9
テストセルC10

行ベースですべてのセル値を取得する場合は次のようにシートのrowsを用います。

import openpyxl

book = openpyxl.load_workbook('test_book.xlsx')

active_sheet = book.active
for row in active_sheet.rows:
    print('----------------------------')
    for cell in row:
        print(cell.value)
----------------------------
テストセルA1
テストセルB1
テストセルC1
----------------------------
テストセルA2
テストセルB2
テストセルC2
----------------------------
テストセルA3
テストセルB3
テストセルC3
----------------------------

~中略~

テストセルB10
テストセルC10