Pythonでは、外部ライブラリのopenpyxlを利用すると、Excelファイル(*.xlsx)の読み書きやシート操作がきます。今回はプログラミング中に使い方をすぐ調べられるように簡単なコードだけでシンプルにまとめてみました。ぜひ日頃のプログラミングにご活用ください!

本記事の目次
本記事は、Windows10 + Python3.7 + openpyxl3.0.3で動作を確認しています。
Excelファイルを扱う上での「pandas」との使い分け方はこちらの記事を参照してください。

openpyxlのインストール方法

コマンドプロンプトを起動して以下のコマンドを入力するとインストールできます。

> py -m pip install openpyxl

# アップグレードする場合
> py -m pip install openpyxl -U

コマンドプロンプトは「Windowsキー()+ R 」を入力して表示される画面で「cmd」 と入力し OK をクリックすると開きます。

https://pypi.org/project/openpyxl/

https://openpyxl.readthedocs.io/

Excelファイル(ブック)

最初にopenpyxlをインポートしてください。

>>> import openpyxl

1. Excelファイルの読み込み

>>> wb = openpyxl.load_workbook("Sample.xlsx")

2. Excelファイルの新規作成

>>> wb = openpyxl.Workbook()

3. Excelファイルの保存

# 上書き保存(読み込んだのと同じ名前を指定)
>>> wb.save("Sample.xlsx")

# 別名保存(読み込んだのと別名を指定)
>>> wb.save("Sample2.xlsx")

https://openpyxl.readthedocs.io/en/stable/api/openpyxl.reader.excel.html#openpyxl.reader.excel.load_workbook

https://openpyxl.readthedocs.io/en/stable/api/openpyxl.workbook.workbook.html

ワークシート

1. シートの取得

# 名前が「Sheet1」のシート
>>> ws = wb["Sheet1"]

# 先頭のシート(注意:インデックス番号は0から始まる)
>>> ws = wb.worksheets[0]

# インデックス番号の確認
>>> wb.index(ws)
0

2. シート名の確認・変更

# シート名のリスト
>>> wb.sheetnames
['Sheet1', 'Sheet2', 'Sheet3']

# シート名の確認
>>> ws.title
'Sheet1'

# シート名の変更
>>> ws.title = "SheetOne"
>>> wb.sheetnames
['SheetOne', 'Sheet2', 'Sheet3']

>>> ws.title ="Sheet1"
>>> wb.sheetnames
['Sheet1', 'Sheet2', 'Sheet3']

3. シートの追加

# 「Sheet4」を末尾に追加
>>> ws4 = wb.create_sheet(title="Sheet4")
>>> wb.sheetnames
['Sheet1', 'Sheet2', 'Sheet3', 'Sheet4']

# 「New Sheet」を左から3つ目の位置に追加
>>> ws_new = wb.create_sheet(title="New Sheet", index=2)
>>> wb.sheetnames
['Sheet1', 'Sheet2', 'New Sheet', 'Sheet3', 'Sheet4']

4. シートのコピー

# 「Sheet2」のコピーをシートの最後に追加
>>> ws2_copy = wb.copy_worksheet(wb["Sheet2"])
>>> wb.sheetnames
['Sheet1', 'Sheet2', 'New Sheet', 'Sheet3', 'Sheet4', 'Sheet2 Copy']
# コピーしたシートは末尾に「 Copy」が付く

5. シートの削除

# 「Sheet2」のコピーを削除
>>> wb.remove(ws2_copy)
>>> wb.sheetnames
['Sheet1', 'Sheet2', 'New Sheet', 'Sheet3', 'Sheet4']

# 末尾のシートを削除
>>> wb.remove(wb.worksheets[-1])
>>> wb.sheetnames
['Sheet1', 'Sheet2', 'New Sheet', 'Sheet3']

https://openpyxl.readthedocs.io/en/stable/api/openpyxl.worksheet.worksheet.html

セル

1. セルの取得

1つのセル

アドレス、行列番号の2通りで指定できます。

# アドレス「A1」のセル
>>> c1 = ws["A1"]
>>> c1
<Cell 'Sheet1'.A1>

# 「A1」を行列の番号で取得(注意:1から始まる)
>>> c1 = ws.cell(row=1, column=1)

# キーワード(row=, column=)は省略も可能
>>> c1 = ws.cell(1, 1)
複数のセル:範囲指定
# 「A1:C3」の範囲
>>> rng1 = ws["A1:C3"]

# セルの文字列間をコロンで繋いでも可
>>> rng1 = ws["A1":"C3"]

# 1行分のセルのタプルを要素とするタプルになっている
>>> rng1
((<Cell 'Sheet1'.A1>, <Cell 'Sheet1'.B1>, <Cell 'Sheet1'.C1>), 
(<Cell 'Sheet1'.A2>, <Cell 'Sheet1'.B2>, <Cell 'Sheet1'.C2>),
 (<Cell 'Sheet1'.A3>, <Cell 'Sheet1'.B3>, <Cell 'Sheet1'.C3>))

# 範囲の1行分のセルはインデックスで取得できる
>>> rng1[0]
(<Cell 'Sheet1'.A1>, <Cell 'Sheet1'.B1>, <Cell 'Sheet1'.C1>)
複数のセル:行指定
# シートの1行目(注意:1から始まる)
>>> row1 = ws[1]

# 1行分のセルがタプルになっている(この例はD列までデータがある場合)
>>> row1
(<Cell 'Sheet1'.A1>, <Cell 'Sheet1'.B1>, <Cell 'Sheet1'.C1>, <Cell 'Sheet1'.D1>)

# 1つのセルはインデックスで取得できる
>>> row1[0]
<Cell 'Sheet1'.A1>

2. セルのアドレスの確認

# アドレス
>>> c1.coordinate
'A1'

# 行番号
>>> c1.row
1

# 列番号
>>> c1.column
1

# 列アルファベット
>>> c1.column_letter
'A'

3. セルの値の読み書き

# セルの値の読み取り
>>> val1 = c1.value
>>> val1
10000

# セルの値の書き込み
>>> c1.value = 12000
>>> c1.value
12000

# セルの数式の書き込み
>>> c_sum = ws["C6"]
>>> c_sum.value = "=SUM(C1:C5)"

数式の計算結果が必要な場合

数式が入力されているセルからは、デフォルトでは「数式」が取得されます。数式の「計算結果」が必要な場合は、以下のようにブックを読み込む時にdata_only=Trueを指定します。ただし、一度もExcelで開いていないファイルからは計算結果を取得できません。数式を計算するのはあくまでもExcelなので、Excelで開いて上書き保存してから読み込む必要があります。

>>> wb = openpyxl.load_workbook("Sample.xlsx", data_only=True)

4. セルの書式設定

# 数値(少数点以下の桁数指定)
>>> ws["B2"].number_format = "0.00"

# 日付データの書式設定
>>> ws["A2"].number_format = "yyyy年mm月dd日"
# フォントの設定(まずFontをインポートする)
>>> from openpyxl.styles import Font

# 太字のON/OFF(bold=)、斜字のON/OFF(italic=)
>>> ws["C2"].font = Font(bold=True, italic=True)

https://openpyxl.readthedocs.io/en/stable/api/openpyxl.cell.cell.html

繰り返し処理

1. 1シートずつ繰り返す

ワークブックの変数(wb)をfor文でループ処理するとシートを列挙できます。以下ではsheet.titleシート名を出力しています。

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

Sheet1
Sheet2
Sheet3

2. 1行ずつ繰り返す

1行目から1行ずつ

以下のようにA1:D32の範囲にデータが入力されているシートを1行ずつ読み込みます。

excel iter rows

シート.rowsをfor文でループ処理するとデータが入力されている範囲を1行ずつ読み込めます。

>>> for row in ws.rows:
	addrs = []
	for cell in row:
		addrs.append(cell.coordinate)
	print(",".join(addrs))

A1,B1,C1,D1
A2,B2,C2,D2
A3,B3,C3,D3
.....
A32,B32,C32,D32

ここでは、セルの値(cell.value)ではなく、cell.coordinateセルのアドレス(A1など)を出力しています。

範囲を指定して1行ずつ

上記のシートを「ヘッダーを飛ばして2行目から」、さらに「1列目も除いて2列目から」読み込むには、iter_rows()min_rowまたはmin_colを指定します。

# 2行目から
>>> for row in ws.iter_rows(min_row=2):
	addrs = []
	for cell in row:
		addrs.append(cell.coordinate)
	print(",".join(addrs))

A2,B2,C2,D2
A3,B3,C3,D3
.....
A32,B32,C32,D32

# 2行目、2列名から
>>> for row in ws.iter_rows(min_row=2, min_col=2):
	addrs = []
	for cell in row:
		addrs.append(cell.coordinate)
	print(",".join(addrs))

B2,C2,D2
B3,C3,D3
.....
B32,C32,D32

応用例

本サイトではopenpyxlを用いたExcelファイル操作の様々な事例を紹介しています。ぜひこちらも参考にしてください。

ブログ記事(タグ:エクセル処理)

Pythonでエクセル勤怠管理表の日付と曜日を自動入力

Pythonでエクセルの会員名簿から有効期限内の会員番号だけテキストファイルに抽出する

以下の書籍では、顧客マスタと売上データのExcelファイルから、請求書を作成する実践的なプログラムの作り方を説明しています。

あわせて読みたい

no image
Pythonでは、外部ライブラリのpython-docxを利用すると、Word文書(docxファイル)を操作できます。python-docxを使うことで、Wordを開かないでテキストを読み取ったり、編…
no image
パソコン操作を時短するには、まずは「マウスに触らないこと」です。つまり、キーボードで操作すれば、マウスに持ち替えてクリックしてという時間を省くことができます。 例えば、 コピー、ペースト…