ランサーズ等のクラウドソーシングサイトでExcelファイルを利用したデータ操作関連の案件があります。
Excel内の各シートに記載されたデータをもとに、重複削除やシート結合を実施するものです。
本記事では、以下の内容を徹底解説します。
- openpyxlとは
- openpyxlのインストール
- openpyxlで利用するExcelファイルの事前準備
- openpyxlによるExcelファイルの基本操作
- openpyxlによるExcelデータのグラフ作成
- SIer/Web系企業での実務経験があるフリーランスエンジニア
- プログラミングスクールでの講師実績あり
- HR領域によるエンジニア特化の採用代行を業務委託で兼務
openpyxlとは
openpyxlとは、MicroSoft社が提供するExcelファイルをPythonで操作するライブラリです。
openpyxlを利用することで、Excelファイルのワークシート・行(row)・列(column)・セル(cell)等の作成が出来ます。
その他、データの作成・読み込み・書き込み・コピー&ペーストなど、処理を加えることで様々なExcelファイルの業務効率化が実現できます。

例えば、openpyxlとtkinter(デスクトップアプリ開発用ライブラリ)を利用すると上記のようなアプリ開発も実現できます。
excel-merge-appの機能一覧
機能名 | 概要 |
---|---|
メインファイル選択 | 起動時/変更ボタンで対象のExcelファイルを選択しシートごとにタブ表示 |
サブファイル参照 | 別ファイルを開きシートをタブ表示 |
シート追加(新規シート) | 空のRowNo列のみを持つ新規シートを作成 |
シート削除 | 選択中のタブ(シート)をメインノートブックから削除 |
行追加 | 選択中シートの選択行の直後または末尾に空行を挿入 |
行削除 | 選択中の行を削除しRowNoを再採番 |
列追加 | 選択中シートに新規列を追加し、既存行に空文字をパディング |
列削除 | RowNo以外の列から選択して削除し、既存データを再構築 |
セル編集(ダブルクリック対応) | Treeview上のセルをダブルクリックで直接編集可能 |
シートインポート(全シート) | サブファイルの選択中シートを丸ごとメインノートブックにコピー (データ含む) |
シートインポート(行範囲指定) | サブファイルの選択中シートから開始/終了行を指定して複数行をメインシートに追加 |
保存・別名保存 | 編集結果を上書き保存または別名で保存 |
excel-merge-appで利用しているopenpyxlのメソッド一覧
メソッド名 | 概要 |
---|---|
openpyxl.load_workbook(file_path, …) | 既存のExcelファイルを読み込んでWorkbookオブジェクトとして返す |
openpyxl.Workbook() | 新規の空のExcelブックを作成 |
wb.remove(ws) | 指定したワークシートをワークブックから削除 |
wb.create_sheet(title=…) | 新しいワークシートをワークブックに追加 |
ws.append(iterable) | ワークシートに1行分のデータを末尾に追記 |
wb.save(file_path) | ワークブックを指定パスに保存 |
ws.sheetnames | ワークブックに含まれるシート名のリストを返す |
ws.iter_rows(min_row=…, values_only=True) | ワークシートの行をイテレータで返す |
セル編集(ダブルクリック対応) | Treeview上のセルをダブルクリックで直接編集可能 |
シートインポート(全シート) | サブファイルの選択中シートを丸ごとメインノートブックにコピー (データ含む) |
シートインポート(行範囲指定) | サブファイルの選択中シートから開始/終了行を指定して複数行をメインシートに追加 |
保存・別名保存 | 編集結果を上書き保存または別名で保存 |
上記のopenpyxlアプリが欲しい人は、以下のメルマガ登録から無料配布しているのでぜひ受け取ってみてください!
\ メールアドレスのみで10秒登録! /
openpyxlのインストール
ここでは、openpyxlのインストール方法について解説します。
また、openpyxlを利用する前提でプログラミング言語PythonはPC環境としてインストール済みとします。
以下でopenpyxlのインストールを実行してください。
pip install openpyxl
また、別の外部ライブラリも含めてインストールを実施したい場合は、以下の方法で実施してください。
pip install pandas openpyxl
上記コードは、Macであればターミナル、Windowsであればコマンドプロンプトにて実行してください。
インストール先は、任意のディレクトリで実行するとインストールが開始され、ライブラリを落とし込めます。
openpyxlがインストールできない場合
openpyxlモジュールがインストールできない原因として、以下の4つが挙げられます。
- インターネット接続の制限
- ファイル書き込みの権限がない
- pipのバージョンが古い
- ソースからのビルドで失敗
原因 | 対策 |
---|---|
インターネット接続の制限 | 外部サーバーの通信制限の緩和 別環境からダウンロードしたファイルでインストール |
ファイル書き込みの権限 | 管理者権限実行でコマンドプロンプト起動 –userオプション付きでpip install実行 |
pipのバージョン管理 | pipモジュールのアップグレード |
ソースのビルド失敗 | ビルド済みパッケージがあるバージョン使用 |
特に原因の中でも、2と3においてエラーを起こす人がほとんどだと思います。
ファイルの書き込みの権限がない
コマンドプロンプトを起動する際に、右クリックから「管理者として実行」を選択し起動しましょう。
また、起動したコマンドプロンプトにて以下のコマンドを実行します。
py -m pip install openpyxl --user
pipモジュールのインストールあるいはアップグレード
openpyxlがインストールできない人は、おそらくpipライブラリがインストールされていない可能性があります。
pipライブラリは、Pythonのパッケージ管理を行うライブラリであるため、インストール等で利用されます。
以下のコマンドを実行したのちに、openpyxlを再インストールを実行してみてください。
python -m pip install <PackageName>
また、Python2系3系といったバージョンによって、標準パッケージかどうか異なります。
もしも2系を利用している人は、Python3系の最新版をインストールし直すと、標準ライブラリとして利用できます。
あるいは、以下のコマンドから最新のpipモジュールにアップグレードしましょう。
#パターン1
py -m pip install -U pip
#パターン2
py -m pip install --upgrade pip
pip自体のアップグレードでエラーが表示される場合は、以下のようにさらに--force-reinstall
オプションを付けて再度実行してください。
#パターン1
py -m pip install --force-reinstall -U pip
#パターン2
py -m pip install --force-reinstall --upgrade pip
openpyxlにおけるimport(インポート)エラー
openpyxlを利用している人によっては、以下の利用環境で実行している人もいると推察します。
- ターミナルあるいはコマンドプロンプトによる起動
- IDLEによる起動
上記は、各環境で実行しているPythonのバージョンが異なるケースと別環境にopenpyxlのインストール未実施のケースがあります。
どちらにおいても、Pythonのバージョン再確認と実行環境におけるopenpyxlのインストール状況を今一度確かめましょう。
pipモジュールを利用している人であれば、実行環境の対象ディレクトリにて以下のコマンドを実施し確認できます。
pip list
openpyxlによるExcelファイルの基本操作
ここから、実際のExcelファイルを利用しopenpyxlの基本的な使い方を解説します。
openpyxlの基本的な使い方として、以下の5つの操作が重要です。
- Excelファイルの読み込み, 保存
- Excelファイル(ワークブック)の指定
- ワークシートの指定
- Row, Column, セルなどの指定
- セルにおける値の配置, 色, 枠線の指定
Excelファイルの読み込み・保存
ここでは、Excelファイルの読み込みと保存について、詳しく解説します。
import openpyxl
Python(.py)ファイルを任意のフォルダで作成し、上記コードにてopenpyxlライブラリをインポートします。
# 指定のエクセルファイルを読み込む
file_path = "指定のエクセルファイルのパス"
workbook = openpyxl.load_workbook(file_path)
上記コードにて、指定のExcelファイルを読み込み、ファイル操作できる処理を準備します。
この際に、実行するディレクトリの違いによって相対パスと絶対パスで使い分けが必要です。
# 上書き保存
workbook.save(file_path)
こちらは、すでに準備されたExcelファイルを上書き保存する処理です。
# 別名保存
new_file_path = "別名保存するエクセルファイルのパス"
workbook.save(new_file_path)
こちらは、別名ファイルに関する変数を用意し、新規保存を実施する処理です。
# Excelファイルを閉じる
wb.close()
最終的にExcelファイルを閉じる処理になります。
この際に、Excelファイルの指定は単一であれば不要になります。
Excelファイルのワークシートの指定・作成・削除
ここではopenpyxlを利用し、Excelファイルの指定したワークシートを取得します。
シートの取得方法は、3つあります。
名前指定によるワークシートの取得
worksheet = workbook["youtube_DB"]
上記コードにて、Excelファイル内にあるワークシートを指定できます。
インデックス指定によるワークシートの取得
worksheet = workbook.worksheets[0]
インデックスはExcelファイル内の左側のワークシートから順番に振られています。
また、数字は”0”から始まることに注意が必要です。
上記コードにて、Excelファイル内のインデックス指定されたワークシートを取得できます。
アクティブシートによるワークシートの取得
orksheet = workbook.active
Excelファイルは開いた時点で、一つのワークシートが選択された状態になります。
その際に、選択され表示されているシートがアクティブ状態になっています。
上記コードにて、アクティブシートを取得します。
ワークシートの作成
worksheet = workbook.create_sheet(title="new_youtube_DB")
新しいワークシートは、create_sheet()で作成できます。
引数のtitleに与えた文字列がワークシートの名前になります。
ワークシートの削除
worksheet = workbook.remove(worksheet)
指定のワークシートを削除したい場合は、remove()で削除できます。
先ほど作成した「new_youtube_DB」のシートを削除しています。
ExcelファイルのRow(行), Column(列), Cell(セル)の取得・作成・削除
ここでは、Excelファイルのワークシート指定後、シート内のRow(行), Column(列), Cell(セル)の取得を解説します。
ExcelファイルのRow(行)の取得
# 特定の行を読み込む
row_number = 2 # 読み込む行の番号
row_values = []
for cell in worksheet[row_number]:
row_values.append(cell.value)
特定の行からデータを取得するため、row_number変数にて読み込む行番号を指定します。
また、データを格納するためのrow_valuesにて空のリスト変数を用意します。
for文を用いて行から取得したデータを各列ごとで回し、リスト変数row_valuesに格納しています。
# 全ての行を読み込む
all_rows_values = []
for row in worksheet.iter_rows():
row_values = []
for cell in row:
row_values.append(cell.value)
all_rows_values.append(row_values)
あるいは、全ての行データを取得する場合に、上記コードを利用してください。
ExcelファイルのRow(行)の作成
# 特定の行を作成する
worksheet.insert_rows(row_number)
上記コードにて、行番号を指定し新しい行を挿入できます。
ExcelファイルのRow(行)の削除
# 特定の行を削除する
worksheet.delete_rows(row_number)
上記コードでは、行番号を指定し削除します。
ExcelファイルのColumn(列)の取得
# 特定の列を読み込む
column_letter = "B" # 読み込む列のアルファベット
column_values = []
for cell in worksheet[column_letter]:
column_values.append(cell.value)
特定の列からデータを取得するため、column_letter変数にて読み込む列アルファベットを指定します。
また、データを格納するためのcolumn_valuesにて空のリスト変数を用意します。
for文を用いて列から取得したデータを各セルごとで回し、リスト変数column_valuesに格納しています。
ExcelファイルのColumn(列)の作成
# 特定の列を作成する
column_letter = 2
worksheet.insert_cols(column_letter)
列を挿入する場合は注意が必要になります。
列アルファベットを利用することができず、インデックス番号(列の場合は1からスタート)で作成します。
ExcelファイルのColumn(列)の削除
# 特定の列を削除する
worksheet.delete_cols(column_letter)
こちらは、列番号で指定したColumnを削除します。
ExcelファイルのCell(セル)の取得
# 特定のセルを読み込む
cell_address = "B2" # 読み込むセルのアドレス
cell_value = worksheet[cell_address].value
特定のセルからデータを取得するため、cell_address変数にセル番号(行列指定)を指定します。
また、セル内のデータを代入するためのcell_value変数を用意し格納しています。
ExcelファイルのCell(セル)の作成
# 特定のセルを作成する
cell_address = "C2" # 作成するセルのアドレス
worksheet[cell_address] = "新しい値"
上記コードのように、cell_address変数を作成し、特定のセルアドレスを格納します。
その後、セル内に値を格納します。
ExcelファイルのCell(セル)の削除
# 特定のセルを削除する
worksheet[cell_address].value = None
上記コードは、特定のセル内にある値を削除します。
セルにおける値の配置, 色, 枠線の指定
ここでは、Excelファイルのワークシート指定後、シート内のセルにおける値の配置, 色, 枠線の指定を解説します。
セルの配置
# openpyxlライブラリから各モジュールをimport
from openpyxl.styles import Alignment, PatternFill
from openpyxl.styles.borders import Border, Side
# セル内の値の配置を設定
alignment = Alignment(horizontal='{横位置}', vertical='{縦位置}')
# セルの値を折り返して全体表示する
alignment_whole = Alignment(wrap_text=True)
# セルの値を縮小して全体表示する
alignment_whole = Alignment(shrink_to_fit =True)
# セルに配置設定を適用
cell.alignment = alignment_whole
上記コードのセル内の値の配置については、以下の位置決めが可能です。
セル内の横位置の指定 | セル内の縦位置の指定 |
---|---|
left:左揃え | top:上詰め |
center:中央揃え | center:中央揃え |
right:右揃え | bottom:下詰め |
general:標準 | justify:両端揃え |
fill:繰り返し | distributed:均等割り付け |
justify:両端揃え | |
centerContinuous:選択範囲内で中央 | |
distributed:均等割り付け |
セルの色指定
# セルの色指定
light_yellow_fill = PatternFill(fgColor='ffffff', bgColor='ffffff', fill_type='solid')
# セルに配色設定の適用
cell.fill = light_yellow_fill
上記コードでセルの色指定が可能になります。
セルの枠線指定
# セルの色指定
light_yellow_fill = PatternFill(fgColor='ffffff', bgColor='ffffff', fill_type='solid')
# セルに配色設定の適用
cell.fill = light_yellow_fill
# 値が存在するセルに対して枠線を適用する
def write_border_line(workbook):
for worksheet in workbook:
for row in worksheet:
for cell in row:
if cell.value:
cell.border = border
値が存在するセルに枠線を指定する場合は、関数にて多重ループで適用すると簡単です。
openpyxlにおけるクラス一覧
openpyxlライブラリは非常に多機能でクラスやモジュールが多数あります。
そのため、改めて主に利用される主要クラスにおける代表的なメソッドの一覧表をまとめています。
- Workbook
- Worksheet
- Cell
- Font
- Alignment
- PatternFill
- Border, Side
- NamedStyle
- Protection
- Chart
- Image
- Comment
この他にも多数ありますが、Workbook/Worksheet/Cell/スタイル関連クラス/オブジェクト挿入関連クラスを理解しておけば問題ないです。
openpyxl.workbook()
以下は、workbook()のメソッド一覧表になります。
メソッド名 | 引数 | 説明 |
---|---|---|
create_sheet() | title=None, index=None | 新しいワークシートを追加する |
remove() | worksheet | ワークシートを削除する |
save() | filename | ワークブックをファイルに保存する |
close() | なし | ファイルオブジェクトを閉じる(with文を使用する場合) |
get_sheet_names()※非推奨 | なし | シート名のリストを返す(sheetnamesを使用推奨) |
get_sheet_by_name()※非推奨 | name | 名前でワークシートを取得(wb[name]を使用推奨) |
copy_worksheet() | from_worksheet | ワークシートを複製する |
iso_dates(プロパティ) | あり | ISO8601形式で日付を保存するかの設定 |
active(プロパティ) | あり | アクティブなシートの取得・設定 |
worksheets(プロパティ) | なし | ワークシートのリストを取得 |
sheetnames(プロパティ) | なし | ワークシート名のリストを取得 |
以下は、各メソッドによるサンプルコードを記載しています。
create_sheet()
from openpyxl import Workbook
wb = Workbook()
ws1 = wb.create_sheet(title="NewSheet", index=1)
print(wb.sheetnames)
remove()
from openpyxl import Workbook
wb = Workbook()
ws = wb.create_sheet("ToDelete")
wb.remove(ws)
print(wb.sheetnames)
save()
from openpyxl import Workbook
wb = Workbook()
wb.save("example.xlsx")
close()
from openpyxl import Workbook
wb = Workbook()
wb.save("example.xlsx")
wb.close()
copy_worksheet()
from openpyxl import Workbook
wb = Workbook()
ws1 = wb.active
ws1.title = "Original"
ws2 = wb.copy_worksheet(ws1)
ws2.title = "Copy"
wb.save("copy_example.xlsx")
active(プロパティ)
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title = "MainSheet"
sheetnames(プロパティ)
from openpyxl import Workbook
wb = Workbook()
wb.create_sheet("Sheet1")
wb.create_sheet("Sheet2")
print(wb.sheetnames)
worksheets(プロパティ)
from openpyxl import Workbook
wb = Workbook()
for ws in wb.worksheets:
print(ws.title)
openpyxl.worksheet()
以下は、worksheet()のメソッド一覧表になります。
メソッド名 | 引数 | 説明 |
---|---|---|
append() | iterable | データ行を末尾に追加する |
cell() | row, column, value=None | セルを取得または値を設定 |
insert_rows() | idx, amount=1 | 指定行に行を挿入する |
delete_rows() | idx, amount=1 | 指定行を削除する |
insert_cols() | idx, amount=1 | 指定列に列を挿入する |
delete_cols() | idx, amount=1 | 指定列を削除する |
merge_cells() | range_string or (start_row, start_column, end_row, end_column) | セル範囲を結合する |
unmerge_cells() | range_string | 結合されたセルを解除する |
iter_rows() | min_row=1, max_row=None, min_col=1, max_col=None, values_only=False | 行方向にイテレートする |
iter_cols() | min_row=1, max_row=None, min_col=1, max_col=None, values_only=False | 列方向にイテレートする |
calculate_dimension() | なし | 実データの最大セル範囲(例:”A1:D5″)を返す |
range() | range_string | セル範囲オブジェクトを返す(内部的) |
move_range() | range_string, rows=0, cols=0, translate=True | セル範囲を移動させる |
print_area(プロパティ) | 取得・設定可 | 印刷範囲の取得または設定 |
title(プロパティ) | 取得・設定可 | ワークシート名の取得または変更 |
max_row / max_column | なし | 使用されている最大行/列番号を返す |
以下は、各メソッドによるサンプルコードを記載しています。
append()
from openpyxl import Workbook
ws = Workbook().active
ws.append(["名前", "年齢"])
ws.append(["山田", 25])
cell()
ws = Workbook().active
ws.cell(row=1, column=1, value="こんにちは")
print(ws.cell(row=1, column=1).value) # → こんにちは
insert_rows()
ws = Workbook().active
ws.append(["A", "B"])
ws.insert_rows(idx=1) # 1行目に空行を追加
delete_rows()
ws = Workbook().active
ws.append(["1行目"])
ws.append(["2行目"])
ws.delete_rows(idx=1) # 1行目を削除
insert_cols()
ws = Workbook().active
ws["A1"] = "元のA列"
ws.insert_cols(idx=1) # 新しいA列を左に挿入
delete_cols()
ws = Workbook().active
ws["A1"] = "削除対象"
ws.delete_cols(idx=1)
merge_cells()
ws = Workbook().active
ws.merge_cells("A1:C1")
ws["A1"] = "結合セル"
unmerge_cells()
ws = Workbook().active
ws.merge_cells("A1:C1")
ws.unmerge_cells("A1:C1")
iter_rows()
ws = Workbook().active
ws.append([1, 2, 3])
ws.append([4, 5, 6])
for row in ws.iter_rows(min_row=1, max_row=2, values_only=True):
print(row)
iter_cols()
ws = Workbook().active
ws.append([1, 2])
ws.append([3, 4])
for col in ws.iter_cols(min_col=1, max_col=2, values_only=True):
print(col)
calculate_dimension()
ws = Workbook().active
ws["A1"] = "データ"
ws["C3"] = "ここまで使われている"
print(ws.calculate_dimension()) # → A1:C3
move_range()
ws = Workbook().active
ws["A1"] = "元の場所"
ws.move_range("A1", rows=2, cols=1)
print_area(プロパティ)
ws = Workbook().active
ws.print_area = "A1:D10"
print(ws.print_area) # → ('A1:D10',)
title(プロパティ)
ws = Workbook().active
ws.title = "新しいシート名"
print(ws.title)
max_row / max_column
ws = Workbook().active
ws["B3"] = "ここまで使用"
print(ws.max_row) # → 3
print(ws.max_column) # → 2
openpyxl.cell()
以下は、cell()のプロパティ一覧表になります。
プロパティ名 | 引数(あれば) | 説明 |
---|---|---|
value | 任意の型 | セルの値を取得・設定 |
coordinate | なし | セルのアドレス(例: “B3″) |
row / column | なし | 行番号/列番号(1始まり) |
column_letter | なし | 列のアルファベット(例: “B”) |
data_type | 任意の型 | データ型コード(s:文字列, n:数値など) |
number_format | 文字列 | セルの表示形式(例: “#,##0.00″) |
font | Fontオブジェクト | フォントスタイルの取得・設定 |
fill | PatternFill | 背景塗りつぶし設定 |
border | Borderオブジェクト | 境界線のスタイル |
alignment | Alignmentオブジェクト | 文字位置・配置 |
protection | Protectionオブジェクト | 保護設定(ロックなど) |
comment | Commentオブジェクト | セルに対するコメント |
hyperlink | Hyperlinkオブジェクト | セルのハイパーリンク情報 |
is_date | なし | 日付として解釈されるかを返す(bool) |
以下は、各プロパティによるサンプルコードを記載しています。
セルの基本情報と値
from openpyxl import Workbook
ws = Workbook().active
cell = ws["B2"]
cell.value = "Hello"
print(cell.coordinate) # B2
print(cell.row) # 2
print(cell.column) # 2
print(cell.column_letter) # B
print(cell.data_type) # 's'(string)
セルの表示形式(数値や日付)
from openpyxl import Workbook
ws = Workbook().active
cell = ws["C3"]
cell.value = 12345.678
cell.number_format = "#,##0.00"
フォント設定
from openpyxl import Workbook
from openpyxl.styles import Font
ws = Workbook().active
cell = ws["A1"]
cell.value = "太字赤色"
cell.font = Font(bold=True, color="FF0000", size=14)
背景色(塗りつぶし)
from openpyxl import Workbook
from openpyxl.styles import PatternFill
ws = Workbook().active
cell = ws["A2"]
cell.value = "背景色"
cell.fill = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid")
セルの境界線(罫線)
from openpyxl import Workbook
from openpyxl.styles import Border, Side
thin = Side(border_style="thin", color="000000")
border = Border(left=thin, right=thin, top=thin, bottom=thin)
ws = Workbook().active
cell = ws["B2"]
cell.value = "罫線"
cell.border = border
配置(中央寄せなど)
from openpyxl import Workbook
from openpyxl.styles import Alignment
ws = Workbook().active
cell = ws["A1"]
cell.value = "中央寄せ"
cell.alignment = Alignment(horizontal="center", vertical="center")
セル保護
from openpyxl import Workbook
from openpyxl.styles import Protection
ws = Workbook().active
cell = ws["C1"]
cell.value = "保護セル"
cell.protection = Protection(locked=True)
コメントの追加
from openpyxl import Workbook
from openpyxl.comments import Comment
ws = Workbook().active
cell = ws["A5"]
cell.value = "注釈あり"
cell.comment = Comment("これはコメントです", "sugi")
ハイパーリンクの追加
from openpyxl import Workbook
ws = Workbook().active
cell = ws["A1"]
cell.value = "Google"
cell.hyperlink = "https://www.google.com"
日付セルかどうかの判定
from openpyxl import Workbook
from datetime import datetime
ws = Workbook().active
cell = ws["A1"]
cell.value = datetime.now()
print(cell.is_date) # True
openpyxl.styles()
openpyxl.styles()では、以下の代表的なクラスが存在します。
- Font
- Alignment
- PatternFill
- Border, Side
- NamedStyle
- Protection
以下は、styles()の各クラスにおけるプロパティ一覧表とサンプルコードになります。
Font
プロパティ名 | 説明 | 型 | 例 |
---|---|---|---|
name | フォント名 | str | “Arial” |
size | フォントサイズ | float | 12 |
bold | 太字かどうか | bool | True |
italic | イタリック | bool | True |
underline | 下線 | str または None | “single” |
strike | 取り消し線 | bool | False |
color | 色(RGB or theme) | str | “FF0000” |
from openpyxl.styles import Font
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws["A1"].value = "フォント設定"
ws["A1"].font = Font(name="Arial", size=14, bold=True, italic=True, color="FF0000")
Alignment
プロパティ名 | 説明 | 型 | 例 |
---|---|---|---|
horizontal | 横方向の配置 | str | “center”, “left”, “right” |
vertical | 縦方向の配置 | str | “center”, “top”, “bottom” |
wrap_text | 折り返し表示 | bool | True |
shrink_to_fit | セル内に縮小 | bool | True |
text_rotation | 文字の回転 | int | 90 |
from openpyxl.styles import Alignment
ws["B2"].value = "中央配置"
ws["B2"].alignment = Alignment(horizontal="center", vertical="center", wrap_text=True)
PatternFill
プロパティ名 | 説明 | 型 | 例 |
---|---|---|---|
fill_type | 塗りつぶしスタイル | str | “solid” |
start_color | 開始色 | str | “FFFF00” |
end_color | 終了色 | str | “FFFF00” |
from openpyxl.styles import PatternFill
ws["C3"].value = "背景色あり"
ws["C3"].fill = PatternFill(fill_type="solid", start_color="FFFF00", end_color="FFFF00")
Border, Side
プロパティ名 | 説明 | 型 | 例 |
---|---|---|---|
border_style | 線の種類 | str | “thin”, “medium”, “dashed” |
color | 色コード | str | “000000” |
from openpyxl.styles import Border, Side
thin = Side(border_style="thin", color="000000")
border = Border(left=thin, right=thin, top=thin, bottom=thin)
ws["D4"].value = "罫線あり"
ws["D4"].border = border
NamedStyle
複数のスタイル(フォント・配置・罫線など)をひとまとめにして再利用できます。
from openpyxl.styles import NamedStyle, Font, Border, Side
highlight = NamedStyle(name="highlight")
highlight.font = Font(bold=True, color="FFFFFF")
highlight.fill = PatternFill("solid", fgColor="0000FF")
highlight.border = Border(left=Side(style="thin"), right=Side(style="thin"))
ws["E1"].value = "テンプレスタイル"
ws["E1"].style = highlight
Protection
プロパティ名 | 説明 | 型 | 例 |
---|---|---|---|
locked | セルのロック | bool | True |
color | 数式を非表示 | bool | False |
from openpyxl.styles import Protection
ws["F1"].value = "ロック"
ws["F1"].protection = Protection(locked=True)
補足:スタイルをまとめて使う例
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, PatternFill
wb = Workbook()
ws = wb.active
cell = ws["A1"]
cell.value = "複数スタイル"
cell.font = Font(bold=True, size=12)
cell.alignment = Alignment(horizontal="center")
cell.fill = PatternFill("solid", fgColor="00FF00")
Chart
以下は、グラフの種類とクラス対応表になります。
グラフの種類 | クラス名 | 特徴 |
---|---|---|
折れ線グラフ | LineChart | 時系列などの推移 |
棒グラフ | BarChart | 比較や構成比 |
円グラフ | PieChart | 割合の可視化 |
散布図 | ScatterChart | X-Y軸の相関 |
面グラフ | AreaChart | 累積・ボリューム比較 |
レーダーチャート | RadarChart | 特性比較(五角形) |
from openpyxl import Workbook
from openpyxl.chart import BarChart, Reference
wb = Workbook()
ws = wb.active
# データ挿入
rows = [
["月", "売上"],
["1月", 100],
["2月", 120],
["3月", 90],
]
for row in rows:
ws.append(row)
# グラフ作成
chart = BarChart()
chart.title = "売上グラフ"
chart.x_axis.title = "月"
chart.y_axis.title = "売上"
data = Reference(ws, min_col=2, min_row=1, max_row=4)
categories = Reference(ws, min_col=1, min_row=2, max_row=4)
chart.add_data(data, titles_from_data=True)
chart.set_categories(categories)
ws.add_chart(chart, "E5")
Image
以下は、Image()のプロパティ一覧表になります。
プロパティ名 | 説明 | 型 |
---|---|---|
path | 画像ファイルのパス | str |
width / height | 画像サイズ(px) | int |
anchor | 挿入位置(例: “B2″) | str |
また、画像挿入には Pillow(PIL)が必要です。
そのため、必要に応じてPillowのインストールを実施してください。
pip install pillow
from openpyxl import Workbook
from openpyxl.drawing.image import Image
wb = Workbook()
ws = wb.active
img = Image("sample.png") # PNG, JPG, BMP など
img.width = 100
img.height = 100
ws.add_image(img, "C3")
Comment
以下は、Comment()のプロパティ一覧表になります。
プロパティ名 | 説明 | 型 |
---|---|---|
text | コメント本文 | str |
author | コメントの作成者 | str |
width | コメントの横幅(Excel表示上) | float |
height | コメントの高さ | float |
from openpyxl import Workbook
from openpyxl.comments import Comment
wb = Workbook()
ws = wb.active
ws["A1"].value = "コメント付きセル"
comment = Comment("これはサンプルコメントです", "GPT")
comment.width = 200
comment.height = 100
ws["A1"].comment = comment
openpyxlで発生するエラーと対応方法
openpyxlを利用してExcelファイルを操作する際、記述したコードミスによって頻発する主なエラーをまとめています。
Excelファイルを操作するプログラムを作成する時に、エラーを頻発させて「openpyxlが使えない、、」と無駄な時間を要します。
発生したエラーに対する対応方法も合わせ表を用いて確認しておきましょう。
エラーコード | エラー内容 | 対応方法 |
---|---|---|
AttributeError: ‘NoneType’ object has no attribute ‘cell’ | セルの操作が正しく行われていない場合に発生 | セルの取得方法や指定する引数を確認 |
ValueError: Invalid file path or buffer object type | 存在しないファイルを読み込み時やファイル名が違う場合に発生 | ファイルの存在を確認や正しいファイル名を指定 |
PermissionError: [Errno 13] Permission denied | Excelファイルが別プログラムによって既に開かれている場合に発生 | Excelファイルが閉じていることを確認 |
TypeError: ‘Worksheet’ object is not subscriptable | Worksheetオブジェクトに対して正しくない操作した場合に発生 | Worksheetオブジェクトに対して正しい操作を実施してるか確認 |
KeyError: ‘Sheet1’ | 指定されたシート名が存在しない場合に発生 | 存在するシート名を指定 |
IndexError: list index out of range | リストの範囲外のインデックスを参照した場合に発生 | リスト範囲内の行番号や列番号を指定 |
TypeError: cannot unpack non-iterable NoneType object | 非反復可能なオブジェクトに対して分解した場合に発生 | 返されるオブジェクトがNoneである場合の処理を追加 |
AttributeError: ‘Worksheet’ object has no attribute ‘rows’ | Worksheetオブジェクトにrows属性が存在しない場合に発生 | Worksheetオブジェクトに対して正しい属性を指定 |
openpyxlで利用するExcelファイルの事前準備
openpyxlは、上述した通りExcelファイルを操作するライブラリです。
そのため、データ分析用として以下のExcelファイルを利用していきます。
- Excelファイル名:openpyxl_training.xlsx
- ワークシート名:youtube_DB
- 各データ項目名:公開日、タイトル、動画URL、再生回数、サムネURL、再生時間、いいね数、コメント数、動画説明

個人的に適当なファイルが見当たらなかったため、youtube動画のデータ分析で利用したファイルをもとに、データ分析の実践的な方法とopenpyxlの使い方を解説します。
上記のExcelファイルは特定のYouTubeチャンネルに対してyoutube data APIを利用し、各動画データを取得しています。
興味があれば、ブログコメントで記載していただくと取得方法に関する記事も作成しますので、ご連絡ください。
openpyxlによるExcelデータのグラフ作成
ここでは、openpyxlによるグラフ作成を実施します。
import openpyxl
openpyxlモジュールをインポートします。
これにより、Excelファイルの読み書きやグラフの作成が可能になります。
from openpyxl.chart import BarChart, Reference
openpyxl.chartモジュールからBarChartクラスとReferenceクラスをインポートします。
BarChartクラスは棒グラフの作成に使用され、Referenceクラスはデータの範囲を指定するために使用されます。
wb = openpyxl.load_workbook('openpyxl_training.xlsx')
openpyxlを使用して Excel ファイルを読み込みます。
openpyxl.load_workbook関数を使用し、指定されたファイル名の Excel ファイルを読み込みます。
ws = wb['youtube_DB']
読み込んだ Excel ファイルからyoutube_DBが名前のワークシートを取得します。
dates = [cell.value for cell in ws['A'][1:]]
ws[‘A’]でA列のセルの範囲を取得し、[1:]スライスを使用してヘッダー行を除いたセルの値をリストに格納します。
これにより、公開日の列データが取得されます。
views = [cell.value for cell in ws['D'][1:]]
ws[‘D’]でD列のセルの範囲を取得し、[1:]スライスを使用してヘッダー行を除いたセルの値をリストに格納します。
これにより、再生回数の列データが取得されます。
chart_sheet = wb.create_sheet('グラフ')
wb.create_sheet(‘グラフ’)を使用して、名前が’グラフ’で新しいシートを作成します。
chart = BarChart()
chart.title = "再生回数と公開日の関係"
chart.x_axis.title = "公開日"
chart.y_axis.title = "再生回数"
BarChartクラスのインスタンスを作成し、変数chartに代入します。
chart.titleを使用してグラフのタイトルを設定し、chart.x_axis.titleとchart.y_axis.titleを使用してX軸とY軸のタイトルを設定します。
data = Reference(ws, min_col=4, min_row=2, max_col=4, max_row=len(views)+1)
始まる位置の列と行を指定し、max_colと max_rowはデータの終了位置の列と行を指定します。
この場合、再生回数のデータ範囲を指定しています。
categories = Reference(ws, min_col=1, min_row=2, max_row=len(dates)+1)
同様に、Referenceクラスを使用してカテゴリ(公開日)の範囲を指定します。
ここでは、公開日のデータ範囲を指定しています。
chart.add_data(data, titles_from_data=True)
chart.set_categories(categories)
chart.add_data()を使用してデータとカテゴリをグラフに追加します。
titles_from_data=Trueにすることで、データ範囲から自動的にシリーズのタイトルが設定されます。
chart_sheet.add_chart(chart, "A1")
chart_sheet.add_chart()を使用して作成したグラフを新しいシートに挿入します。
“A1″はグラフを挿入するセルの位置を指定しています。
wb.save('openpyxl_training.xlsx')
変更したExcelファイルを保存します。
全体コード
import openpyxl
from openpyxl.chart import BarChart, Reference
# Excelファイルを読み込みます
wb = openpyxl.load_workbook('openpyxl_training.xlsx')
# ワークシートを取得します
ws = wb['youtube_DB']
# 公開日の列データを取得します
dates = [cell.value for cell in ws['A'][1:]]
# 再生回数の列データを取得します
views = [cell.value for cell in ws['D'][1:]]
# 新しいシートを作成します
chart_sheet = wb.create_sheet('グラフ')
# グラフを作成します
chart = BarChart()
chart.title = "再生回数と公開日の関係"
chart.x_axis.title = "公開日"
chart.y_axis.title = "再生回数"
# データ範囲を指定します
data = Reference(ws, min_col=4, min_row=2, max_col=4, max_row=len(views)+1)
categories = Reference(ws, min_col=1, min_row=2, max_row=len(dates)+1)
# データとカテゴリをグラフに追加します
chart.add_data(data, titles_from_data=True)
chart.set_categories(categories)
# グラフをシートに挿入します
chart_sheet.add_chart(chart, "A1")
# Excelファイルを保存します
wb.save('openpyxl_training.xlsx')
実行結果

実行結果から、とりあえず再生回数と公開日の関係を可視化できましたが、改善の余地があるようです。
ただ、公開日によって多くの再生回数が取れている動画が分かりやすく可視化されるため、再生回数が取れた企画や人気のあるコンテンツが判断できる形になりました。
openpyxlが使えない|pandasのデータ加工/処理
openpyxlによってExcelファイルやCSVファイルを扱う人は、データ処理/分析で多用されるpandasといったライブラリも併用するとよいです。

大きく分類すると、様々なデータパターンが存在する中でデータ加工/処理を行う工程と、データ整形/可視化といった工程を踏み、完成したxlsx, csvファイルに出力します。
openpyxlは、元データとなるExcelファイルを別ファイルであるExcelファイルに整形あるいは可視化することに優れている一方で、元データを加工/別処理による操作に向いていません。
その点、pandasは以下の特徴を持っています。
- 高速でデータ操作するSeries, DataFrameオブジェクト
- データ間で相互に読み書きするためのツール群
- データ統合された際の欠損値処理
- データセットの柔軟な変形およびピボット
- ラベルに基づいたスライスや巨大なデータセットのサブセット取得
- データセットに対する集計および変換
- 高性能なデータセットのマージと結合
- 時系列データの生成
- パフォーマンスのための高度な最適化
このように、pandasは様々なデータセットに対する操作/効率化などを実現する特徴があるため、データ分析やデータクレンジングといった作業に向いています。
openpyxlではデータ分析やデータクレンジングに使えないと感じる人は「【Python】pandasとは?インストールやSeriesとDataFrameの使い方を解説」を一読ください。

本格的にエンジニアへのキャリアチェンジを考えてる人へ

プログラミングスキルを社内やプライベートで活用している人が増えています。
- 一部業務プロセスの効率化/自動化
- 分析システム構築による担当業務改善
- 社内公開によるチーム/プロジェクトの業務時間短縮
Pythonは特にデータ収集や分析に特化したライブラリが豊富なため、業務プロセスの一元管理やDX化に貢献しています。
また、プログラミングに触れてエンジニアへのキャリアチェンジを実現したい人の人材規模も年々高まっています。
一度、あなたのキャリアプランを振り返ってみてください。
- 収入アップが見込めている
- キャリアアップが見込めている
- 働き方を明確に決めれている
上記の項目をYESと答えられる人は、特に言うことはありません。
現在、エンジニアへのキャリアチェンジでお悩みの方は、「【Python特化】厳選したおすすめプログラミングスクール」を一読ください。
