Python入門
エクセルを操作する(openpyxl)

Pythonの初心者向け入門解説、人気のプログラミング言語Python
公開日:2020-10-03 最終更新日:2020-10-05

第24回.エクセルを操作する(openpyxl)


Pyhton エクセル Excel openpyxl xlsx

PythonでExcelファイルを扱ってみましょう。
それには、外部ライブラリのopenpyxlを使うと便利ですし、簡単に扱う事が出来ます。


openpyxlはとても機能が豊富で、エクセルに対するかなり多くの事が出来ます。
ここではopenpyxlの基本的な使い方を、
ブック、シート、セル、そしてセルの書式(ただし一部だけ)の順にコードサンプルで解説していきます。


目次

openpyxlのインストール

pipを使ってopenpyxlをインストールします。

Visual Studio

「PyPIとインストールされたパッケージの検索」
ここに「openpyxl」これを入れてください。
文字を入れた後にEnterするとそのままインストールされます。

コマンド プロンプト

コマンド プロンプトで以下のコマンドを入れます。

pip install openpyxl

詳しくは以下を参照してください。

公式リファレンス

資料が膨大かつ階層が深いので、要所のリンクだけを掲載しておきます。

openpyxl - A Python library to read/write Excel 2010 xlsx/xlsm files

上掲は、この下のサンプルで使っている部分だけの極一部のリンクです。
非常に膨大な資料なので、とても全てを読むことはできませんし、その必要も無いと思います。
必要になった時点で調べられるようにしておけば良いと思います。

以下では、ブック、シート、セルの必要最小限のサンプルと解説です。
一部しか結果のprintの画像は載せていませんので、気になるところは実際に実行して確認してみてください。


ブックの操作

既存ブックを読み込む

マクロなしブック
import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
もちろん絶対パス指定でも良いです。
次はパスの確認をしてから読み込むサンプルです。
from pathlib import Path
import openpyxl
p = Path("./Book1.xlsx")
if p.exists():
    wb = openpyxl.load_workbook(p)

マクロ有効ブック
import openpyxl
wb = openpyxl.load_workbook("Book1.xlsm", keep_vba=True)
keep_vba=True
これを指定せずにマクロ有効ブックを読み込んだ場合、
セル値等は取得出来ますが、保存した時に正しく保存されなくなります。

新規ブックを作成する

import openpyxl
wb = openpyxl.Workbook()
シートは1つだけ作成されます。

ブックを保存する

import openpyxl
wb = openpyxl.Workbook()
wb.save("Book11.xlsx")
もちろん絶対パス指定でも良いです。
上書き保存は無いようです。

以降のサンプルでは保存する部分は掲載していないので、適宜保存を追加して確認してください。


シートの操作

シート一覧を取得

シート名の一覧
import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
print(wb.sheetnames)
取得されるのはstrです。

シート オブジェクトの一覧
import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
shts = wb.worksheets
print(shts)
取得されるのはシートのオブジェクトです。

シート名で取得

import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["Sheet1"]
print(ws)

シートのインデックスで取得

import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb.worksheets[0]
print(ws)

シート名の変更

import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["Sheet1"]
ws.title = "Sheet99"
print(ws)

シートの挿入

import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb.create_sheet("add_sheet", 2)
print(ws)
インデックスは省略できます。
指定インデックスの前に挿入されます。

シートの削除

import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["add_sheet"]
print(wb.sheetnames)
wb.remove(ws)
print(wb.sheetnames)


セルの操作

単一セルの取得

import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["Sheet1"]
rng1 = ws["A1"]
print(rng1)
rng2 = ws.cell(2, 2)
print(rng2)
cell(row, column, value=None)

複数セルの取得

from pprint import pprint
import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["Sheet1"]
rng = ws["A1:C3"]
pprint(rng, width=20)

セル値の取得

import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["Sheet1"]
rng = ws["A1"]
print(rng.value)

セル値を設定

import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["Sheet1"]
rng1 = ws["A1"]
rng1.value = 123
print(rng1.value)
rng2 = ws.cell(2, 2, "abc")
print(rng2.value)
cell(row, column, value=None)

データ最終行列の取得

import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["Sheet2"]
print(f"{ws.min_row=} {ws.min_column=} {ws.max_row=} {ws.max_column=}")
VBAのUsedRangeの範囲と同じになります。
したがって、書式設定されているだけでも範囲に含まれます。

範囲内の順処理

from pprint import pprint
import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["Sheet1"]
print("iter_cols")
[pprint(rng, width=20) for rng in 
 ws.iter_cols(min_col=ws.min_column, max_col=ws.max_column, min_row=ws.min_row, max_row=ws.max_row)]
print("iter_rows")
[pprint(rng, width=20) for rng in 
 ws.iter_rows(min_col=ws.min_column, max_col=ws.max_column, min_row=ws.min_row, max_row=ws.max_row)]
iter_rows(min_row=None, max_row=None, min_col=None, max_col=None, values_only=False)
iter_cols(min_col=None, max_col=None, min_row=None, max_row=None, values_only=False)
min_col (int) : smallest column index (1-based index)
min_row (int) : smallest row index (1-based index)
max_col (int) : largest column index (1-based index)
max_row (int) : largest row index (1-based index)
values_only (bool) : whether only cell values should be returned

処理される順番に注意してください。

Pyhton エクセル Excel openpyxl xlsx

valueだけを取得する場合は、
,values_only=True
これを指定してください。

行の挿入・削除

import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["Sheet1"]
#1行目に挿入
ws.insert_rows(1)
#1行目に3行挿入
ws.insert_rows(1, 3)
#1行目を削除
ws.delete_rows(1)
#1行目から3行削除
ws.delete_rows(1, 3)
insert_rows(idx, amount=1)
delete_rows(idx, amount=1)

列の挿入・削除

import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["Sheet1"]
#1列目に挿入
ws.insert_cols(1)
#1列目に3列挿入
ws.insert_cols(1, 3)
#1列目を削除
ws.delete_cols(1)
#1列目から3列削除
ws.delete_cols(1, 3)
insert_cols(idx, amount=1)
delete_cols(idx, amount=1)


表示形式・フォント・罫線・列幅・行高

表示形式

import openpyxl
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["Sheet1"]
ws["A1"].number_format = '#,##0'
ws.cell(2, 2).number_format = "0.00%"

フォント

import openpyxl
from openpyxl.styles import Font
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["Sheet1"]
font = Font(name="MS Pゴシック", bold=True, size=14)
ws["A1"].font = font
ws.cell(2, 2).font = font

罫線の設定

import openpyxl
from openpyxl.styles.borders import Border, Side
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["Sheet1"]
#細線、色は自動 side = Side(style="thin") border = Border(top=side, bottom=side, left=side, right=side) ws["A1"].border = border
#普通線、色は赤 side = Side(style="medium", color="FF0000") border = Border(top=side, bottom=side, left=side, right=side) ws.cell(2, 2).border = border

複数セルに一括で罫線を引くことはできないようです。
罫線の種類
VBAとは違い、線種と太さが一緒の指定になっています。

style 線種 太さ
hair 極細
thin 細線
medium 普通
thick 太線
double 2 本線
dotted 点線 普通
dashed 破線 普通
dashDot 一点鎖線 普通
dashDotDot ニ点鎖線 普通
slantDashDot 斜破線 普通
mediumDashed 破線 普通
mediumDashDot 一点鎖線 普通
mediumDashDotDot ニ点鎖線 普通


列幅・行高

import openpyxl
from openpyxl.styles.borders import Border, Side
from openpyxl import utils
wb = openpyxl.load_workbook("Book1.xlsx")
ws = wb["Sheet1"]
ws.row_dimensions[2].height = 30 #ポイント
ws.column_dimensions["B"].width = 20 #文字数
ws.column_dimensions[utils.get_column_letter(3)].width = 30 #文字数
utils.get_column_letter : 数値から列文字
utils.column_index_from_string : 列文字から数値

CSVを読み込んでエクセルで出力

「test」フォルダ内に複数の同一フォーマットのCSVがあります。
1行目は列名になっています。

Pyhton エクセル Excel openpyxl xlsx
UTF-8(BOMなし)です。

これらのCSVを1つにします。
列名は1行目だけに出力します。
この結果をExcelファイル"file99.xlsx"として出力します。

CSVをまとめる部分は、以下で作成したものを関数化して使っています。
from pathlib import Path
import csv
import openpyxl
from openpyxl.styles.borders import Border, Side
from openpyxl.styles import Font
#ファイルのリストを受け取り読み込み2次元配列で返す def read_csv(arg_files): row = [] for file in arg_files: with open(file, "r", encoding="utf-8") as f: reader = csv.reader(f) for r in reader: row.append(r) return row
#2次元配列をワークシートの指定位置に書き出す def list_to_cell(arg_list, arg_ws, start_row=1, start_col=1): for r, row in enumerate(arg_list): for c, col in enumerate(row): arg_ws.cell(start_row + r, start_col + c, col) #以下でも同じ #arg_ws.cell(start_row + r,start_col + c).value = arg_list[r][c] set_cell_format(arg_ws.cell(start_row + r,start_col + c))
#フォントと罫線の設定 def set_cell_format(arg_cell): font = Font(name="MS Pゴシック", bold=True, size=14) arg_cell.font = font side = Side(style="thin") border = Border(top=side, bottom=side, left=side, right=side) arg_cell.border = border
#csvを読み込みリストにまとめる p = Path("./test") files = list(p.glob("*.csv")) csv = read_csv(files)
#エクセルとして出力 wb = openpyxl.Workbook() ws = wb.worksheets[0] ws.title = "CSV" list_to_cell(csv, ws) wb.save(p / "file99.xlsx")
Pyhton エクセル Excel openpyxl xlsx

openpyxl以外の部分については、以下を参考にしてください。
第20回.フォルダとファイルの一覧を取得
・出力結果のサンプルデータについて ・os.path,os.listdirの使用例 ・glob.globの使用例 ・pathlibのプロパティ・メソッド一覧 ・pathlib.Pathの使用例
第21回.CSV読み込みとopen()関数とwith文
・open()関数 ・with文 ・csvの読み込み ・tsvの読み込み
第22回.CSV読み書き(csvモジュール)
・csvモジュールの仕様 ・dialectについて ・**fmtparamsについて ・CSV読み込みの基本 ・CSV書き込みの基本 ・フォルダ内の複数CSVを1つのCSVにまとめる




同じテーマ「Python入門」の記事

第16回.Pythonの引数は参照渡しだが・・・
第17回.リスト内包表記
第18回.例外処理(try文)とexception一覧
第19回.import文(パッケージ・モジュールのインポート)
第20回.フォルダとファイルの一覧を取得(os,glob,pathlib)
第21回.CSV読み込みとopen()関数とwith文
第22回.CSV読み書き(csvモジュール)
第23回.pipコマンド(外部ライブラリのインストール)
第24回.エクセルを操作する(openpyxl)
第24回.エクセルを操作する(pywin32:win32com)
第26回.WEBスクレイピング(selenium)


新着記事NEW ・・・新着記事一覧を見る

TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.ブック・シートの選択(Select,Activate)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。


このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ