Pythonでは、外部ライブラリのopenpyxlを利用すると、Excelファイル(*.xlsx)の読み書きやシート操作がきます。今回はプログラミング中に使い方をすぐ調べられるように簡単なコードだけでシンプルにまとめてみました。ぜひ日頃のプログラミングにご活用ください!
本記事の目次
openpyxlのインストール方法
コマンドプロンプトを起動して以下のコマンドを入力するとインストールできます。
> py -m pip install openpyxl
# アップグレードする場合
> py -m pip install openpyxl -U
コマンドプロンプトは「Windowsキー()+ R 」を入力して表示される画面で「cmd」 と入力し OK をクリックすると開きます。
openpyxl のPyPIページ
https://pypi.org/project/openpyxl/
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")
load_workbook()関数の公式リファレンス
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']
Worksheet データ型の公式リファレンス
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)
Cell データ型の公式リファレンス
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行ずつ読み込みます。
シート.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でエクセルの会員名簿から有効期限内の会員番号だけテキストファイルに抽出する
以下の書籍では、顧客マスタと売上データのExcelファイルから、請求書を作成する実践的なプログラムの作り方を説明しています。