openpyxlを使った Excelファイルの読み書き – 【Pythonプログラミング2 ~応用編~】

PROGRAMMING

Pythonのopenpyxlライブラリを使ったExcelファイルを読み書きする方法を、演習用プログラムのソースコードを使い、それを実行しながら解説します。

1.openpyxlライブラリのインストール

openpyxl を使うには、事前にインストール作業が必要です。
手順を追って説明します。

① コマンドプロンプトを管理者として実行

Windows画面の左下にある検索ボックスに、キーボードから cmd と入力します。
右上に コマンドプロンプト が表示されていることを確認して、『管理者として実行』をクリックします。

コマンドプロンプトを管理者として実行

コマンドプロンプトを管理者として実行


ユーザー アカウント制御 ダイアログボックスが表示されて、「このアプリがデバイスに変更を加えることを許可しますか?」と聞いてくるので、『はい』をクリックします。
管理者:コマンドプロンプト が起動します。

Microsoft Windows [Version 10.0.22631.4317]
(c) Microsoft Corporation. All rights reserved.

C:\Windows\System32>

 

② インストールされているライブラリの確認

管理者:コマンドプロンプト でキーボードから pip list と入力して、 Enter  キーを押下します。
インストールされているライブラリの一覧が表示されます。
openpyxl がインストールされていないことを確認します。

Microsoft Windows [Version 10.0.22631.4317]
(c) Microsoft Corporation. All rights reserved.

C:\Windows\System32>pip list
Package         Version
--------------- -----------
numpy           2.1.2
pandas          2.2.3
pip             24.2
python-dateutil 2.9.0.post0
pytz            2024.2
pywin32         307
six             1.16.0
tzdata          2024.2
xlwings         0.33.1

C:\Windows\System32>

 

③ openpyxl のインストール

管理者:コマンドプロンプト でキーボードから pip install openpyxl と入力して、 Enter  キーを押下します。
最後の行に『 Successfully installed 』と表示されれば、インストール完了です。

C:\Windows\System32>pip install openpyxl
Collecting openpyxl
  Downloading openpyxl-3.1.5-py2.py3-none-any.whl.metadata (2.5 kB)
Collecting et-xmlfile (from openpyxl)
  Downloading et_xmlfile-1.1.0-py3-none-any.whl.metadata (1.8 kB)
Downloading openpyxl-3.1.5-py2.py3-none-any.whl (250 kB)
Downloading et_xmlfile-1.1.0-py3-none-any.whl (4.7 kB)
Installing collected packages: et-xmlfile, openpyxl
Successfully installed et-xmlfile-1.1.0 openpyxl-3.1.5

C:\Windows\System32>

 

【補足】学校や会社内のパソコンをお使いの方へ
pip install openpyxl が失敗する場合があります。
この場合は、インストールする際にプロキシサーバーの情報を渡す必要があります

プロキシサーバーの情報は、システム管理者に確認してください。
・プロキシサーバー名
・ポート番号

プロキシサーバーの情報を取得できましたら、openpyxl のインストールは次のようにします。
pip install --proxy="プロキシサーバー名:ポート番号" openpyxl

④ openpyxl のインストールの確認

管理者:コマンドプロンプト でキーボードから pip list と入力して、 Enter  キーを押下します。
インストールされているライブラリの一覧が表示されます。
一覧に openpyxl があることを確認します。

C:\Windows\System32>pip list
Package         Version
--------------- -----------
et-xmlfile      1.1.0
numpy           2.1.2
openpyxl        3.1.5
pandas          2.2.3
pip             24.2
python-dateutil 2.9.0.post0
pytz            2024.2
pywin32         307
six             1.16.0
tzdata          2024.2
xlwings         0.33.1

C:\Windows\System32>

 

2.演習用プログラムのダウンロード

演習用プログラム( practice16.py )とExcelファイル( excel_file1.xlsx )をダウンロードします。
演習用プログラムは テキストファイルになっているので、エクスプローラーを使って拡張子を .txt から .py に変更します。
practice16.py、excel_file1.xlsx を Python をインストールしたフォルダ(今回は C:\Python)に置きます。



3.ソースコードの表示とExcelファイルの内容の確認

メモ帳を使って、演習用プログラム( practice16.py )を開きます。

practice16.py

practice16.py


Excelファイル( excel_file1.xlsx )の内容を確認します。
excel_file1.xlsx

excel_file1.xlsx


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

最初に openpyxlライブラリ を使って、Excelファイルを読み込む方法を見ていきます。

① Excelファイルを読み込む

まずは、コマンドプロンプト で practice16.py を実行します。
プログラムを実行する方法は、こちらの記事『ファイルに保存されたプログラムの実行』を参照します。
以下のように表示されます。

C:\Users\kotablog>python C:\Python\practice16.py

*** Excelファイルの読み込み ****

excel_file1.xlsxを開きます

A1セルのデータを取得します
商品コード

1行2列目のデータを取得します
商品名
商品名

A1セルからC2セルのデータを取得します(セル番地でアクセス)
[['商品コード', '商品名', '金額'], ['A0001', 'みかん', 100]]

A1セルからC2セルのデータを取得します(行番号、列番号でアクセス)
[['商品コード', '商品名', '金額'], ['A0001', 'みかん', 100]]

 
プログラムソースを確認します。


01 # -*- coding: utf-8 -*-
02 """
03 演習プログラム16
04 
05   openpyxlを使った Excelファイルの読み書き
06 
07 """
08 import sys             # sysモジュールのインポート
09 import openpyxl as px  # Excelファイルアクセス用
10 from openpyxl.styles import PatternFill           # セルの背景色設定用
11 from openpyxl.styles.borders import Border, Side  # セルの罫線設定用
12 

ライブラリのインポート
09行目で openpyxlライブラリをインポートしています。このときライブラリ名を px に設定しています。
10行目の PatternFill は、セルの背景色を設定するときに使います。
11行目の Border と Side は、セルの罫線を設定するときに使います。


13 print("\n*** Excelファイルの読み込み ****")
14 
15 # Excelファイルを開く
16 print("\nexcel_file1.xlsxを開きます")
17 file_name1 = r"C:\Python\excel_file1.xlsx"  # ファイルのフルパス名
18 
19 wb = px.load_workbook(file_name1, read_only=True) # ブックの読み込み
20 ws = wb['Sheet1']                           # Sheet1を選択
21 

Excelファイルを開く
17行目で 変数 file_name1 に excel_file1.xlsx のフルパスファイル名をセットしています。
19行目で ブックを読み取り専用で開いて読み込みます。
20行目で "Sheet1" を選択しています。


22 # 単一セルの読み込み(セル番地でアクセス)
23 print("\nA1セルのデータを取得します")
24 print(ws['A1'].value)
25 

単一セルの読み込み(セル番地でアクセス)
24行目で ws[セル番地].value で、そのセルの値を取得しています。


26 # 単一セルの読み込み(行番号、列番号でアクセス)
27 print("\n1行2列目のデータを取得します")
28 print(ws.cell(row=1, column=2).value)
29 print(ws.cell(1, 2).value)
30 

単一セルの読み込み(行番号、列番号でアクセス)
28行目、29行目は 行番号と列番号(今回は 1行2列目)でセルを指定して、そのセルの値を取得しています。
以下の2つの書き方はどちらも同じ結果を得ることができます。
ws.cell(row=行番号, column=列番号).value
ws.cell(行番号, 列番号).value


31 # セル範囲の読み込み(セル番地でアクセス)
32 print("\nA1セルからC2セルのデータを取得します(セル番地でアクセス)")
33 list2d = [[cell.value for cell in row] for row in ws['A1:C2']]
34 print(list2d)
35 

セル範囲の読み込み(セル番地でアクセス)
33行目は セル番地でセル範囲を指定( ws['A1:C2'] )し、リスト内包表記を使って、2次元リストを取得しています。

Pythonリスト内包表記の使い方


36 # セル範囲の読み込み(行番号、列番号でアクセス)
37 print("\nA1セルからC2セルのデータを取得します(行番号、列番号でアクセス)")
38 list2d = [[cell.value for cell in row] for row in ws.iter_rows(min_row = 1, max_row = 2, min_col = 1, max_col = 3)]
39 print(list2d)
40 

セル範囲の読み込み(行番号、列番号でアクセス)
38行目は 下記の通りセルの行番号と列番号でセル範囲を指定し、リスト内包表記を使って、2次元リストを取得しています。
・min_row:指定したい範囲の左上のセルの行番号
・max_row:指定したい範囲の右下のセルの行番号
・min_col:指定したい範囲の左上のセルの列番号
・max_col:指定したい範囲の右下のセルの列番号


41 wb.close()                                  # ブックを閉じる
42 
43 #終了1
44 sys.exit()

Excelファイルを閉じる
41行目の close()メソッドで、ブックを閉じています。

5.Excelファイルの書き込み

次に openpyxlライブラリ を使って、Excelファイルに書き込む方法を見ていきます。

① Excelファイルに書き込む

ソースコード #終了1 の1行下の sys.exit() の先頭に「 # 」を入れてコメントにします。
 Ctrl  キーを押しながら、 S  キーを押して、ソースコードを上書き保存します。
コマンドプロンプトで F3  キーを押して、 Enter  キーを押下します。
以下のように表示されます。

*** Excelファイルの書き込み ****

excel_file1.xlsxを開きます

A3セルにデータを書き込みます(A0002)

3行2列目のセルにデータを書き込みます(メロン)

3行3列目のセルにデータを書き込みます(200)

A4セルからリストのデータを書き込みます(A0003, いちご, 300)

A5セルから2次元リストのデータを書き込みます(A0004,バナナ, 400、A0005,レモン,500)

C7セルに金額を合計する数式を入れる(=SUM(C2:C6))

 
エクスプローラから、excel_file2.xlsx を開いて内容を確認してください。

プログラムソースを確認します。


46 print("\n*** Excelファイルの書き込み ****")
47 
48 print("\nexcel_file1.xlsxを開きます")
49 wb = px.load_workbook(file_name1)           # ブックの読み込み
50 ws = wb['Sheet1']                           # Sheet1を選択
51 

Excelファイルを開く
49行目で 書き込み可能でブックを開いて、読み込みます。
50行目で "Sheet1" を選択しています。


52 # 単一セルに書き込み(セル番地でアクセス)
53 print("\nA3セルにデータを書き込みます(A0002)")
54 ws['A3'] = "A0002"
55 

単一セルに書き込み(セル番地でアクセス)
54行目で ws[セル番地] でセルを指定(今回は A3セル)して、そのセルに値("A0002")を入れています。


56 # 単一セルの書き込み(行番号、列番号でアクセス)
57 print("\n3行2列目のセルにデータを書き込みます(メロン)")
58 ws.cell(row=3, column=2).value = "メロン"
59 ws.cell(row=3, column=2, value="メロン")
60 
61 print("\n3行3列目のセルにデータを書き込みます(200)")
62 ws.cell(3, 3).value = 200
63 ws.cell(3, 3, 200)
64 

単一セルの書き込み(行番号、列番号でアクセス)
58行目、59行目は 行番号と列番号(今回は 3行2列目)でセルを指定して、そのセルに値("メロン")を入れています。
以下の2つの書き方はどちらも同じ結果を得ることができます。
ws.cell(row=行番号, column=列番号).value = セルに入れる値
ws.cell(row=行番号, column=列番号, value=セルに入れる値)

62行目、63行目は cell()の引数の row=、column=、value= を省略しています。
ws.cell(行番号, 列番号).value = セルに入れる値
ws.cell(行番号, 列番号, セルに入れる値)


65 # 行方向に書き込み
66 print("\nA4セルからリストのデータを書き込みます(A0003, いちご, 300)")
67 datalist = ['A0003', 'いちご', 300]
68 ws.append(datalist)
69 

行方向に書き込み
67行目で 1行分のリストを用意しています。
68行目で append()メソッドを使って、行の追加を行っています。3行目までセルに値が入っているので、4行目に追加されます。


70 # 表形式で書き込み
71 print("\nA5セルから2次元リストのデータを書き込みます(A0004,バナナ, 400、A0005,レモン,500)")
72 list2d = [["A0004", "バナナ", 400],["A0005", "レモン", 500]]
73 for row in list2d:
74   ws.append(row)
75 

表形式で書き込み
72行目で 2行分の2次元リストを用意しています。
73行目と74行目で append()メソッドを使って、2行分の追加を行っています。4行目までセルに値が入っているので、5行目と6行目に追加されます。


76 # セルに数式を入れる
77 print("\nC7セルに金額を合計する数式を入れる(=SUM(C2:C6))")
78 ws['C7'] = "=SUM(C2:C6)"
79 

セルに数式を入れる
78行目で ws[セル番地] でセルを指定(今回は C7セル)して、そのセルに数式("=SUM(C2:C6)")を入れています。
セルを行番号と列番号で指定しても同じ結果を得ることができます。


80 file_name2 = r"C:\Python\excel_file2.xlsx"  # ファイルのフルパス名
81 wb.save(file_name2)                         # ブックの保存
82 wb.close()                                  # ブックを閉じる
83 
84 #終了2
85 sys.exit()

ブックを保存後に閉じる
80行目で 変数 file_name2 に excel_file2.xlsx のフルパスファイル名をセットしています。
81行目で ファイル名を 変数 file_name2 で、ブックを保存しています。
82行目の close()メソッドで、ブックを閉じています。

6.セルの装飾

ここでは、セルの背景色の設定と、セルの表示形式(カンマ編集)の設定を行います。

ソースコード #終了2 の1行下の sys.exit() の先頭に「 # 」を入れてコメントにします。
 Ctrl  キーを押しながら、 S  キーを押して、ソースコードを上書き保存します。
コマンドプロンプトで F3  キーを押して、 Enter  キーを押下します。
以下のように表示されます。

*** セルの装飾 ****

excel_file2.xlsxを開きます

A1:C1のセル背景色を水色にします

金額の列をカンマ編集にします

 
エクスプローラから、excel_file2.xlsx を開いて内容を確認してください。

プログラムソースを確認します。


 87 print("\n*** セルの装飾 ****")
 88 
 89 print("\nexcel_file2.xlsxを開きます")
 90 wb = px.load_workbook(file_name2)           # ブックの読み込み
 91 ws = wb['Sheet1']                           # Sheet1を選択
 92 
 93 # セル背景色の設定
 94 print("\nA1:C1のセル背景色を水色にします")
 95 rgb = [204, 255, 255]                       # 水色(RGB値)
 96 color_code = ('#{}{}{}'.format(hex(rgb[0]), hex(rgb[1]), hex(rgb[2]))).replace('0x', '')[1:]  # RGB値から16進数カラーコードに変換
 97 fill = PatternFill(patternType='solid', fgColor=color_code)  # 水色の塗りつぶしを設定
 98 for row in ws['A1':'C1']:                   # 背景色を塗る
 99   for cell in row:
100     cell.fill = fill
101 

セル背景色の設定(水色 RGB値 赤=204、緑=255、青=255)
95行目で 水色のRGB値を 変数 rgb にセットしています。

RGB値は、Excelの『書式』 - 『セルの書式設定』 - 『塗りつぶしタブ』 - 『その他の色(M)...』 - 『ユーザー設定タブ』で調べることができます。

96行目で RGB値から16進数カラーコードに変換しています。
97行目で 水色の塗りつぶし( patternType='solid' )を設定しています。
PatternFill() の引数 fgColor は、16進数カラーコードを指定する必要があります。
16進数カラーコードが分かっている場合は、
fill = PatternFill(patternType='solid', fgColor='CCFFFF')
と記述できます。

98行目から100行目で A1セルからC1セルの背景色を設定しています。

背景色を設定するセルは、行番号と列番号を使って設定することもできます。
A1セル (行番号=1, 列番号=1)
C1セル (行番号=1, 列番号=3)


98 for row in ws.iter_rows(min_row = 1, max_row = 1, min_col = 1, max_col = 3):

・min_row:指定したい範囲の左上のセルの行番号
・max_row:指定したい範囲の右下のセルの行番号
・min_col:指定したい範囲の左上のセルの列番号
・max_col:指定したい範囲の右下のセルの列番号


102 # セルの表示形式の設定
103 print("\n金額の列をカンマ編集にします")
104 for row in ws:
105   for cell in row:
106     col = cell.column                       # 列を取得
107     if ws.cell(row = 1, column = col).value == "金額":
108       cell.number_format = '#,##0'          # 書式を設定
109 
110 wb.save(file_name2)                         # ブックの保存
111 wb.close()                                  # ブックを閉じる
112 
113 #終了3
114 sys.exit()

セルの表示形式の設定(カンマ編集)
107行目で 見出し(ヘッダ)の行(1行目)が "金額" の場合、
108行目で 書式をカンマ編集('#,##0')に設定しています。

7.セルに罫線を引く


ソースコード #終了3 の1行下の sys.exit() の先頭に「 # 」を入れてコメントにします。
 Ctrl  キーを押しながら、 S  キーを押して、ソースコードを上書き保存します。
コマンドプロンプトで F3  キーを押して、 Enter  キーを押下します。
以下のように表示されます。

*** セルに罫線を引く ****

excel_file2.xlsxを開きます
罫線を引く方法を入力してください(1 or 2)>>>

 
キーボードから、1 を入力して、  Enter  キーを押下します。

エクスプローラから、excel_file2.xlsx を開いて内容を確認してください。
値が入っていない A7セル と B7セル にも罫線が引かれています。

もう一度、コマンドプロンプト で practice16.py を実行します。
コマンドプロンプトで F3  キーを押して、 Enter  キーを押下します。
以下のように表示されます。

*** セルに罫線を引く ****

excel_file2.xlsxを開きます
罫線を引く方法を入力してください(1 or 2)>>>

 
キーボードから、2 を入力して、  Enter  キーを押下します。

エクスプローラから、excel_file2.xlsx を開いて内容を確認してください。
値が入っているセルだけに罫線が引かれています。

プログラムソースを確認します。


116 print("\n*** セルに罫線を引く ****")
117 
118 print("\nexcel_file2.xlsxを開きます")
119 wb = px.load_workbook(file_name2)           # ブックの読み込み
120 ws = wb['Sheet1']                           # Sheet1を選択
121 
122 side = Side(style='thin', color='000000')   # 細い罫線、線の色は黒
123 border = Border(top=side, bottom=side, left=side, right=side)  # 全ての辺に上記sideを設定
124 

罫線自体の設定
122行目で 細い罫線、線の色は黒 を設定しています。
123行目で セルの全ての辺に 細い罫線、線の色は黒 を設定しています。


125 select = input('罫線を引く方法を入力してください(1 or 2)>>> ')  # 値を入力
126 
127 if select == "1":
128   print("\n罫線を引きます")
129   for row in ws:
130     for cell in row:
131       ws[cell.coordinate].border = border   # 罫線を引く

罫線を引く
129行目から131行目で 表の全てのセルに罫線を引いています。


132 else:
133   print("\n値が入っているセルに罫線を引きます")
134   for row in ws:
135     for cell in row:
136       if ws[cell.coordinate].value:         # セルに値が入っていない場合は None
137         ws[cell.coordinate].border = border # 罫線を引く
138 
139 wb.save(file_name2)                         # ブックの保存
140 wb.close()                                  # ブックを閉じる
141 
142 sys.exit()

値が入っているセルに罫線を引く
136行目の if文 でセルに値が入っているかを確認して、値が入っている場合は、
137行目で 罫線を引いています。

【参考】PatternFill() の引数の紹介

fgColor
 セルの背景色を16進数カラーコードで指定します

bgColor
 2色のパターンを使用する場合、16進数カラーコードで指定します

fill_type
 塗りつぶし : "solid"

 2色のパターンを使用する場合、下記パターンの種類を設定します
 75%灰色 : "darkGray"
 50%灰色 : "mediumGray"
 25%灰色 : "lightGray"
 12.5%灰色 : "gray125"
 6.25%灰色 : "gray0625"
 横縞 : "darkHorizontal"
 縦縞 : "darkVertical"
 右下がり斜線 : "darkDown"
 左下がり斜線 縞 : "darkUp"
 左下がり斜線 格子 : "darkGrid"
 極太線 左下がり斜線 格子: "darkTrellis"
 実線 横縞 : "lightHorizontal"
 実線 縦縞 : "lightVertical"
 実線 右下がり斜線 : "lightDown"
 実線 左下がり斜線 縞 : "lightUp"
 実線 横 格子 : "lightGrid"
 実線 左下がり斜線 格子 : "lightTrellis"

【参考】Side() の引数 style の紹介

style
 極細 : "hair"
 通常の太さ : "thin"
 通常と太線の中間: "medium"
 太線 : "thick"
 二重線 : "double"

 上記のほかに
  "dashDot"
  "dashDotDot"
  "dotted"
  "mediumDashDotDot"
  "dashed"
  "mediumDashed"
  "slantDashDot"
  "mediumDashDot"
 があります。
 

<xlwingsを使った Excelファイルの読み書き openpyxlを使った Excelファイルの読み書き iniファイルの読み書き>
タイトルとURLをコピーしました