◤Python無料教材配布◢ JobCodeメールマガジン実施中!

【Python×Excel】openpyxlのインストール方法や使い方を徹底解説!

‎python-openpyxl

ランサーズ等のクラウドソーシングサイトで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の機能一覧
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上のセルをダブルクリックで直接編集可能
シートインポート(全シート)サブファイルの選択中シートを丸ごとメインノートブックにコピー
(データ含む)
シートインポート(行範囲指定)サブファイルの選択中シートから開始/終了行を指定して複数行をメインシートに追加
保存・別名保存編集結果を上書き保存または別名で保存
excel-merge-appで利用しているopenpyxlのメソッド一覧

上記の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モジュールのアップグレード
ソースのビルド失敗ビルド済みパッケージがあるバージョン使用
openpyxlのインストールエラーパターン

特に原因の中でも、2と3においてエラーを起こす人がほとんどだと思います。

ファイルの書き込みの権限がない

コマンドプロンプトを起動する際に、右クリックから「管理者として実行」を選択し起動しましょう。

また、起動したコマンドプロンプトにて以下のコマンドを実行します。

py -m pip install openpyxl --user

先頭にpy -mを付けることでPATHが通ってなくてもpipを実行できます。

WindowsにPythonをデフォルトでインストールした状態ではpipをそのまま実行することができません。(PATHが通っていないため)

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を利用している人によっては、以下の利用環境で実行している人もいると推察します。

openpyxlの利用環境
  • ターミナルあるいはコマンドプロンプトによる起動
  • IDLEによる起動

上記は、各環境で実行しているPythonのバージョンが異なるケースと別環境にopenpyxlのインストール未実施のケースがあります。

どちらにおいても、Pythonのバージョン再確認と実行環境におけるopenpyxlのインストール状況を今一度確かめましょう。

pipモジュールを利用している人であれば、実行環境の対象ディレクトリにて以下のコマンドを実施し確認できます。

pip list

openpyxlによるExcelファイルの基本操作

ここから、実際のExcelファイルを利用しopenpyxlの基本的な使い方を解説します。

openpyxlの基本的な使い方として、以下の5つの操作が重要です。

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(プロパティ)なしワークシート名のリストを取得
workbook()のメソッド一覧表

以下は、各メソッドによるサンプルコードを記載しています。

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なし使用されている最大行/列番号を返す
worksheet()のメソッド一覧表

以下は、各メソッドによるサンプルコードを記載しています。

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″)
fontFontオブジェクトフォントスタイルの取得・設定
fillPatternFill背景塗りつぶし設定
borderBorderオブジェクト境界線のスタイル
alignmentAlignmentオブジェクト文字位置・配置
protectionProtectionオブジェクト保護設定(ロックなど)
commentCommentオブジェクトセルに対するコメント
hyperlinkHyperlinkオブジェクトセルのハイパーリンク情報
is_dateなし日付として解釈されるかを返す(bool)
cell()のプロパティ一覧表

以下は、各プロパティによるサンプルコードを記載しています。

セルの基本情報と値
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()では、以下の代表的なクラスが存在します。

styles()の代表的なクラス
  • Font
  • Alignment
  • PatternFill
  • Border, Side
  • NamedStyle
  • Protection

以下は、styles()の各クラスにおけるプロパティ一覧表とサンプルコードになります。

Font

プロパティ名説明
nameフォント名str“Arial”
sizeフォントサイズfloat12
bold太字かどうかboolTrue
italicイタリックboolTrue
underline下線str または None“single”
strike取り消し線boolFalse
color色(RGB or theme)str“FF0000”
Fontのプロパティ一覧表
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折り返し表示boolTrue
shrink_to_fitセル内に縮小boolTrue
text_rotation文字の回転int90
Alignmentのプロパティ一覧表
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”
PatternFillのプロパティ一覧表
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”
Border, Sideのプロパティ一覧表
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セルのロックboolTrue
color数式を非表示boolFalse
Protectionのプロパティ一覧表
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割合の可視化
散布図ScatterChartX-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
Image()のプロパティ一覧表

また、画像挿入には 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
Comment()のプロパティ一覧表
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 deniedExcelファイルが別プログラムによって既に開かれている場合に発生Excelファイルが閉じていることを確認
TypeError: ‘Worksheet’ object is not subscriptableWorksheetオブジェクトに対して正しくない操作した場合に発生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で頻発するエラー集

openpyxlで利用するExcelファイルの事前準備

openpyxlは、上述した通りExcelファイルを操作するライブラリです。

そのため、データ分析用として以下の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は以下の特徴を持っています。

pandasの特徴
  • 高速でデータ操作するSeries, DataFrameオブジェクト
  • データ間で相互に読み書きするためのツール群
  • データ統合された際の欠損値処理
  • データセットの柔軟な変形およびピボット
  • ラベルに基づいたスライスや巨大なデータセットのサブセット取得
  • データセットに対する集計および変換
  • 高性能なデータセットのマージと結合
  • 時系列データの生成
  • パフォーマンスのための高度な最適化

このように、pandasは様々なデータセットに対する操作/効率化などを実現する特徴があるため、データ分析やデータクレンジングといった作業に向いています。

openpyxlではデータ分析やデータクレンジングに使えないと感じる人は「【Python】pandasとは?インストールやSeriesとDataFrameの使い方を解説」を一読ください。

関連記事は、データ処理・データ分析で多用されるPythonライブラリであるpandasについてまとめた記事になります。
pandasの基本的な使い方やデータ分析業務で利用するケースも記載しています。

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

プログラミングスキルを社内やプライベートで活用している人が増えています。

▼プログラミングスキルの活用事例
  • 一部業務プロセスの効率化/自動化
  • 分析システム構築による担当業務改善
  • 社内公開によるチーム/プロジェクトの業務時間短縮

Pythonは特にデータ収集や分析に特化したライブラリが豊富なため、業務プロセスの一元管理やDX化に貢献しています。

また、プログラミングに触れてエンジニアへのキャリアチェンジを実現したい人の人材規模も年々高まっています。

一度、あなたのキャリアプランを振り返ってみてください。

▼現在の状況を考える質問
  • 収入アップが見込めている
  • キャリアアップが見込めている
  • 働き方を明確に決めれている

上記の項目をYESと答えられる人は、特に言うことはありません。

現在、エンジニアへのキャリアチェンジでお悩みの方は、「【Python特化】厳選したおすすめプログラミングスクール」を一読ください。

本格的にエンジニアへのキャリアチェンジを考えてる人へ、Python特化の厳選したプログラミングスクールを解説してます。
また、スクールのメリットや金額など学習プラン設計についても言及してます。

この記事を書いた人

sugiのアバター sugi SUGI

【経歴】玉川大学工学部卒業→新卒SIer企業入社→2年半後に独立→プログラミングスクール運営/受託案件→フリーランスエンジニア&SEOコンサル→Python特化のコンテンツサイトJob Code運営中

目次