ランサーズ等のクラウドソーシングサイトで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のインストール
ここでは、openpyxlのインストール方法について解説します。
また、openpyxlを利用する前提でプログラミング言語PythonはPC環境としてインストール済みとします。
以下でopenpyxlのインストールを実行してください。
pip install openpyxl
上記コードは、Macであればターミナル、Windowsであればコマンドプロンプトにて実行してください。
インストール先は、任意のディレクトリで実行するとインストールが開始され、ライブラリを落とし込めます。
openpyxlがインストールできない場合
openpyxlモジュールがインストールできない原因として、以下の4つが挙げられます。
- インターネット接続の制限
- ファイル書き込みの権限がない
- 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で利用するExcelファイルの事前準備
openpyxlは、上述した通りExcelファイルを操作するライブラリです。
そのため、データ分析用として以下のExcelファイルを利用していきます。
- Excelファイル名:openpyxl_training.xlsx
- ワークシート名:youtube_DB
- 各データ項目名:公開日、タイトル、動画URL、再生回数、サムネURL、再生時間、いいね数、コメント数、動画説明
個人的に適当なファイルが見当たらなかったため、youtube動画のデータ分析で利用したファイルをもとに、データ分析の実践的な方法とopenpyxlの使い方を解説します。
上記のExcelファイルは特定のYouTubeチャンネルに対してyoutube data APIを利用し、各動画データを取得しています。
興味があれば、ブログコメントで記載していただくと取得方法に関する記事も作成しますので、ご連絡ください。
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を利用して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によるグラフ作成を実施します。
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')
実行結果
実行結果から、とりあえず再生回数と公開日の関係を可視化できましたが、改善の余地があるようです。
ただ、公開日によって多くの再生回数が取れている動画が分かりやすく可視化されるため、再生回数が取れた企画や人気のあるコンテンツが判断できる形になりました。
本格的にエンジニアへのキャリアチェンジを考えてる人へ
プログラミングスキルを社内やプライベートで活用している人が増えています。
- 一部業務プロセスの効率化/自動化
- 分析システム構築による担当業務改善
- 社内公開によるチーム/プロジェクトの業務時間短縮
Pythonは特にデータ収集や分析に特化したライブラリが豊富なため、業務プロセスの一元管理やDX化に貢献しています。
また、プログラミングに触れてエンジニアへのキャリアチェンジを実現したい人の人材規模も年々高まっています。
一度、あなたのキャリアプランを振り返ってみてください。
- 収入アップが見込めている
- キャリアアップが見込めている
- 働き方を明確に決めれている
上記の項目をYESと答えられる人は、特に言うことはありません。
現在、エンジニアへのキャリアチェンジでお悩みの方は、「【Python特化】厳選したおすすめプログラミングスクール」を一読ください。
コメント