[Python][openpyxl] Excel ファイルの基本操作

Python openpyxl
Python
スポンサーリンク

Python で Excel 操作をするモジュールにはさまざまなものがあります。

ここでは openpyxl を導入して Excel ファイルを操作する基本について説明をします。

環境

OS: MaxOS X

Python: 3.9.1

openpyxl: 3.0.5

openpyxl のインストール

openpyxl をインストールするには pip3 コマンドを使用します。

以下は筆者の環境での実行例です。

% pip3 install openpyxl
Collecting openpyxl
  Downloading openpyxl-3.0.5-py2.py3-none-any.whl (242 kB)
     |████████████████████████████████| 242 kB 5.2 MB/s 
Collecting et-xmlfile
  Downloading et_xmlfile-1.0.1.tar.gz (8.4 kB)
Collecting jdcal
  Downloading jdcal-1.4.1-py2.py3-none-any.whl (9.5 kB)
Using legacy 'setup.py install' for et-xmlfile, since package 'wheel' is not installed.
Installing collected packages: jdcal, et-xmlfile, openpyxl
    Running setup.py install for et-xmlfile ... done
Successfully installed et-xmlfile-1.0.1 jdcal-1.4.1 openpyxl-3.0.5

openpyxl 利用の基本

openpyxl モジュールの基本使用例

openpyxl モジュールを利用するには、インポートをして Workbook のインスタンスを生成するか  Excel ファイルを読み込む必要があります。

ここでは、Workbook のインスタンスを生成する基本コードを示します。

Workbook のインスタンスを生成すると、ワークブックが作成され、同時に「Sheet」というシートが1つ追加されます。

import openpyxl

# Workbook のインスタンス生成
wb = openpyxl.Workbook()

ワークブック操作の基本

名前を付けてブックを保存する

作成したブックを保存するには、save(path) を使用します。

以下は、ファイル名を Sample.xlsx として保存をする例です。

import openpyxl 

# Workbook のインスタンス生成 
wb = openpyxl.Workbook()
# 名前を付けて保存
wb.save("/Users/hiro/Documents/python/Sample.xlsx")

上記のコードを実行すると、Excelファイルが作成されます。

作成された Excel ファイルを開いてみると、前述した通り「Sheet」という名前のシートが1つあることを確認できます。

作成した Excel ファイルの例

作成した Excel ファイルの例

ワークブックを開く(load_workbook)

既存の Excel ファイルを開くには、load_workbook() を使用します。指定可能な引数を以下の表に示します。load_workbook(filename, read_only=False, keep_vba=KEEP_VBA, data_only=False, keep_links=True)

引数 説明
filename 必須。オープンする Excel ファイルのパスを指定します。
read_only 読み取り専用でオープンする場合は True を指定します。既定値は False (書き込み可能)です。
keep_vba VBA 要素を保持するかどうかを制御します。既定値は True (VBA を保持する)です。
data_only 数式を含むセルに数式を含めるか、Excelが最後にシートを読み取ったときに保存された値を含めるかを制御します。既定値は True (セルに数式を含める)です。
keep_links ブック内の外部リンクを保持するかどうかを制御します。既定値は True (ファイブリンクを保持する)です。

ワークブックを開くための基本コードを以下に示します。

4行目で load_workbook を使用してファイルを開いた後は、変数 wb を使用してブックの操作を行ます。

import openpyxl

# Sample.xlsx を開く
wb = openpyxl.load_workbook("/Users/hiro/Documents/python/Sample.xlsx")

シート操作の基本

シートの追加(create_sheet(title=None, index=None))

新しくシートを追加するには、create_sheet(title=None, index=None) を使用します。
引数の title は、作成するシートに付けるシート名を指定します。省略した場合は、自動で「Sheet1」「Sheet2」のように名前が付けられます。
引数 index には、追加するシートの挿入位置を指定します。挿入位置は 0 から(0 が先頭)指定することができます。
以下は、2つのシートを追加する例です。

import openpyxl

wb = openpyxl.Workbook()

# 先頭に「Sample1」というシートを追加
wb.create_sheet(title='Sample1', index=0)
# 末尾にシートを追加する。シート名は自動で決定される
wb.create_sheet()

wb.save("/Users/hiro/Documents/python/Sample.xlsx")

6行目は、シート名に「Sample1」挿入位置を先頭にしてシートを追加しています。

8行目は、シート名と挿入位置を省略して、シートの追加をしています。シート名は自動で Sheet1 となり、末尾に追加されます。

以下に実行例を示します。

指定したシート「Sample1」と自動で追加したシート「Sheet1」を確認できます。シート名「Sheet」はブック作成時に自動的に追加されるシートです。

シートを追加する例

シートを追加する例

インデックスを指定してシートを削除する

インデックスを指定してシートを削除するには remove メソッドを使用します。

以下の例に示すように、removeメソッドの引数に workbook の worksheets オブジェクトを指定します。

※ remove メソッドを実行すると、メモリ内でのシート削除が行われます。よって save() メソッドを実行しない限り、ファイルには反映されないことに注意してください。

import openpyxl

xlsfile = "/Users/hiro/Documents/python/Sample.xlsx"
wb = openpyxl.load_workbook(xlsfile)

# 先頭のシートを削除
wb.remove(wb.worksheets[0])
# 末尾のシートを削除
wb.remove(wb.worksheets[-1])

# 上書き保存してファイルに反映
wb.save(xlsfile)

シート名を指定してシートを削除する

シート名を指定してシートを削除する場合も、前述同様 remove メソッドを指定します。

ただし、引数には wb[‘シート名’] のように、workbook オブジェクトにシート名を指定します。

import openpyxl

xlsfile = "/Users/hiro/Documents/python/Sample.xlsx"
wb = openpyxl.load_workbook(xlsfile)

# シート「Sample1」を削除
wb.remove(wb['Sample1'])

# 上書き保存してファイルに反映
wb.save(xlsfile)

ブック内の全てのシート名を取得する

ブックに含まれているシートは、sheetnames オブジェクトに格納されています。

sheetnames オブジェクトには、すべてのシートの情報を持っています

全てのシート名を取得したい場合は、以下のように for 文を使用して、sheetnames が持つ title() メソッドを実行して取得することができます。

import openpyxl
wb = openpyxl.load_workbook("/Users/hiro/Documents/python/Sample.xlsx")

for sheet in wb.sheetnames:
    print(sheet.title())

インデックスを指定してシート名を取得する

worksheets[インデックス].title を使用することで、インデックスを指定してシート名を取得することができます。インデックス番号に「0」を指定すると先頭のシート名。インデックス番号に「-1」を指定することで末尾のシート名を取得することができます。

import openpyxl

wb = openpyxl.load_workbook("/Users/hiro/Documents/python/Sample.xlsx")

# 先頭のシート名を取得
print(wb.worksheets[0].title)
# 末尾のシート名を取得
print(wb.worksheets[-1].title)

セル操作の基本

セル操作の基本を学ぶ前に、サンプルファイルを入手しておきます。

以下は、総務省統計局が提供している「人口の推移と将来人口(エクセル:22KB)」データです。

統計局ホームページ
総務省統計局、統計研究研修所の共同運営によるサイトです。国勢の基本に関する統計の企画・作成・提供、国及び地方公共団体の統計職員に専門的な研修を行っています。
人口の推移と将来人口

人口の推移と将来人口

1つのセルデータを取得する

前述したファイルで平成22年の北海道の人口と青森県の人口を取得する例を示します。

Excel のセルは A1形式と R1C1形式での指定方法がありますが、openpyxl も同様に指定することができます。

平成22年の北海道の人口は、2列目10行目にあります。「2列目」と「10行目」という情報でセルの値を取得するには cells(行番号, 列番号).value を使用します(10行目)。

平成22年の青森県の人口は、B11 にあります。この「B11」という情報でセルの値を取得するには ワークシートオブジェクト[‘A1形式‘].value を使用します(14行目)。

import openpyxl

xlsfile = "/Users/hiro/Documents/python/n200200200.xlsx"
wb = openpyxl.load_workbook(xlsfile)

# ワークシートの情報を取得
sheet = wb.worksheets[0]

# 北海道の人口取得
num1 = sheet.cell(10,2).value
print('北海道の人口={}人'.format(num1))

# 青森県の人口取得
num2 = sheet['B11'].value
print('青森県の人口={}人'.format(num2))

1行分のデータを取得する

1行分のデータを取得するには、worksheets オブジェクトを使用します。

以下の例では、1列目のデータを全て取得して表示しています。

7行目でワークシートの情報を取得後、 9行目で ws[1] のようにして行データを取得しています。

import openpyxl

xlsfile = "/Users/hiro/Documents/python/n200200200.xlsx"
wb = openpyxl.load_workbook(xlsfile)

# ワークシートの情報を取得
ws = wb.worksheets[0]

# 9行目のデータを全て取得する
for row in ws[9]:
    print(row.value)

1列分のデータを取得する

1列分のデータを取得するには、worksheets オブジェクトを使用します。

以下の例では、A列のデータを全て取得して表示しています。

7行目でワークシートの情報を取得後、 9行目で ws[‘A’] のようにして列データを取得しています。

import openpyxl

xlsfile = "/Users/hiro/Documents/python/n200200200.xlsx"
wb = openpyxl.load_workbook(xlsfile)

# ワークシートの情報を取得
ws = wb.worksheets[0]

# A列のデータを全て取得する
for cell in ws['A']:
    print(cell.value)

セルに値を書き込む

セルに値を書き込むには、worksheets オブジェクトを使用します。

以下の例では、7〜10行目でセルに値を書き込んでいます。

1行1列目(A1)に「Hello」、1行2列目(B1)に「World」、2行1列目(A2)に「7」、2行2列目(B2)も

import openpyxl

# Workbook のインスタンス生成 
wb = openpyxl.Workbook()
ws = wb.active

ws.cell(1,1).value = 'Hello'
ws['B1'].value  = 'World'
ws.cell(2,1).value  = 7
ws['B2'].value  = 3.14

wb.save('Sample.xlsx')
Please follow and like us:

コメント

タイトルとURLをコピーしました