Pythonプログラミング通信講座では、外部ライブラリのopenpyxlを用いてExcelファイルを操作しました。講座では順序立てて1つずつ操作方法を学習しましたが、今回はプログラミング中に使い方をすぐ調べられるように簡単なコードだけでシンプルにまとめてみました。ぜひ日頃のプログラミングにご活用ください!

本記事の目次
本記事は、Windows10 + Python3.7 + openpyxl3.0.3で動作を確認しています。

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.save("Sample.xlsx")

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

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

ワークシート

1. シートの取得

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

# 先頭のシート
>>> ws = wb.worksheets[0]

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

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

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

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

# シート名の変更
>>> 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']

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つのセル
# アドレス「A1」のセル
>>> c1 = ws["A1"]
>>> c1
<Cell 'Sheet1'.A1>

# 1行目、1列目のセル(=アドレス「A1」)
>>> c1 = ws.cell(row=1, column=1)

# キーワード(row=, column=)は省略も可能
>>> c1 = ws.cell(1, 1)
範囲のセル
# 「A1:C3」の範囲
>>> rng1 = ws["A1:C3"]
>>> 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>))

# セルの文字列間をコロンで繋いでも可
>>> rng1 = ws["A1":"C3"]
1行分のセル
# シートの1行目(注意:1から始まる)
>>> row1 = ws[1]

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

# 範囲の1行目
>>> rng1[0]
(<Cell 'Sheet1'.A1>, <Cell 'Sheet1'.B1>, <Cell 'Sheet1'.C1>)

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)"

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シートずつ繰り返す

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

Sheet1
Sheet2
Sheet3

2. 1行ずつ繰り返す

以下ではA1:D32の範囲にデータが入力されているシートを例にしています。

1行目から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
範囲を指定して1行ずつ
# 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でエクセルの会員名簿から有効期限内の会員番号だけテキストファイルに抽出する