Python
 Computer >> コンピューター >  >> プログラミング >> Python

PythonのopenpyxlでExcelグラフを作成する方法|棒グラフ作成をステップ解説


この記事では、Pythonのopenpyxlモジュールを使ってExcelにグラフを作成する方法を解説します。テニス選手のグランドスラム優勝回数をサンプルデータとして、ゼロからExcelスプレッドシートを作成し、openpyxlで棒グラフを描画するまでの一連の手順を紹介します。

はじめに

Microsoft Officeでは、Office 2007以降、より多くの行と列を扱えるようにするため、Excelシートに新しい拡張子「.xlsx」が導入されました。この変更により、ExcelファイルはZIP圧縮されたXMLベースのフォーマットへと移行しています。Microsoftのスプレッドシートは今やビジネスの現場に欠かせない存在であり、データ管理だけでなく、データの可視化にも幅広く活用されています。

事前準備

Pythonにはopenpyxlの代替となるxlrdモジュールもあります。xlrdもExcel形式をしっかりサポートしていますが、読み取り専用であり、書き込み操作には対応していません。一方、openpyxlモジュールなら、Excelシートの読み取りと書き込みの両方が可能です。

実装手順

1) openpyxlモジュールのインストール

まず、以下のコマンドでopenpyxlをインストールします。

pip install openpyxl

2) データの定義

新しいExcelスプレッドシートに書き込むデータを定義します。

# モジュールをインポート
import openpyxl

# ファイル名とデータを定義
file_name = "charts.xlsx"
file_data = (['player', 'titles'], ['Federer', 20], ['Nadal', 20], ['Djokovic', 17], ['Murray', 3])

3) 新しいExcelファイルの作成

Workbook()で新しいブックを作成すると、「Sheet」という名前のデフォルトシートが自動的に生成されます。

xlsxfile = openpyxl.Workbook()
print(f"*** The sheets inside the excel_file are = {xlsxfile.sheetnames}")
new_workbook = xlsxfile['Sheet']
*** The sheets inside the excel_file are = ['Sheet']

4) シートへのデータ書き込み

テニス選手名とグランドスラム優勝回数のデータをシートに追加します。

for row, (player, titles) in enumerate(file_data, 1):
    new_workbook['A{}'.format(row)].value = player
    new_workbook['B{}'.format(row)].value = titles

5) ファイルの保存

最後に、データを指定したファイル名で保存します。

xlsxfile.save(file_name)

6) ファイルの読み込みとシート一覧の確認

保存したファイルをメモリに読み込み、含まれるシートを確認します。手順2で作成したのは1つのシートだけなので、['Sheet']のみが表示されます。

import openpyxl
excel_file_data = openpyxl.load_workbook(file_name)
excel_file_data.sheetnames
['Sheet']

7) セル値の取得

最初のシートを取得し、たとえばA2セルとB2セルの値を読み出してみます。

sheet_values = excel_file_data['Sheet']
print(f"*** One of the value from the sheet is - {sheet_values['A2'].value} - {sheet_values['B2'].value}")
*** One of the value from the sheet is - Federer - 20

8) 全データの出力確認

スプレッドシート内のすべての行と列を出力し、グラフ用のデータが正しく挿入されているかを確認します。

for row in sheet_values:
    for cell in row:
        print(cell.value)
player
titles
Federer
20
Nadal
20
Djokovic
17
Murray
3

9) 棒グラフオブジェクトの作成

openpyxl.chartからBarChartとReferenceをインポートし、BarChartオブジェクトを生成します。

from openpyxl.chart import BarChart, Reference
chart = BarChart()

10) グラフの基本情報の設定

グラフタイトルや軸ラベルなどの基本情報を設定します。

# グラフタイトルなどの基本情報を設定
chart.title = "Players & Grand Slams"
chart.y_axis.title = 'Titles'
chart.x_axis.title = 'Tennis Players'

11) データ参照の作成とチャートへの追加

次に、データへの参照(Reference)を作成し、チャートに追加します。

# データへの参照を作成し、チャートに追加
data = Reference(sheet_values, min_row=2, max_row=5, min_col=1, max_col=2)
chart.add_data(data, from_rows=True, titles_from_data=True)

12) シートへのグラフ追加と保存

最後に、グラフをシートに配置してファイルを保存します。

# 最後に、グラフをシートに追加してファイルを保存
new_workbook.add_chart(chart, "A6")
xlsxfile.save(file_name)

ステップ11では、Referenceオブジェクトによって参照範囲を作成しています。これは「行2・列1」から「行5・列2」までの範囲、つまりヘッダーを除いたデータが格納されている領域を指します。

データは.add_data()メソッドでチャートに追加されます。from_rowsを指定すると各行が個別のデータ系列として扱われ、titles_from_dataを指定すると先頭の列が系列名として使用されます。

サンプルコード全体

ここまでに説明した内容をすべてまとめた完全なプログラムがこちらです。

"""
Program : Create charts in excel using Python with openpyxl
params  : NA
output  : Creates a charts.xlsx file with tennis players grandslam
          titles and a barchart representation of the data
"""
# モジュールをインポート
import openpyxl
from openpyxl.chart import BarChart, Reference

# ファイル名とデータを定義
file_name = "charts.xlsx"
file_data = (['player', 'titles'],
             ['Federer', 20],
             ['Nadal', 20],
             ['Djokovic', 17],
             ['Murray', 3])

# Excelスプレッドシートを作成
xlsxfile = openpyxl.Workbook()
print(f"*** The sheets inside the excel_file are = {xlsxfile.sheetnames}")
new_workbook = xlsxfile['Sheet']

# データをシートに書き込む
for row, (player, titles) in enumerate(file_data, 1):
    new_workbook['A{}'.format(row)].value = player
    new_workbook['B{}'.format(row)].value = titles

# スプレッドシートを保存
xlsxfile.save(file_name)

# データを読み込む
excel_file_data = openpyxl.load_workbook(file_name)
print(excel_file_data.sheetnames)

sheet_values = excel_file_data['Sheet']
print(f"*** One of the value from the sheet is - "
      f"{sheet_values['A2'].value} - {sheet_values['B2'].value}")

for row in sheet_values:
    for cell in row:
        print(cell.value)

# 棒グラフの作成
chart = BarChart()

# グラフタイトルなどの基本情報を設定
chart.title = "Players & Grand Slams"
chart.y_axis.title = 'Titles'
chart.x_axis.title = 'Tennis Players'

# データへの参照を作成し、チャートに追加
data = Reference(sheet_values, min_row=2, max_row=5, min_col=1, max_col=2)
chart.add_data(data, from_rows=True, titles_from_data=True)

# 最後に、グラフをシートに追加してファイルを保存
new_workbook.add_chart(chart, "A6")
xlsxfile.save(file_name)
*** The sheets inside the excel_file are = ['Sheet']
*** One of the value from the sheet is - Federer - 20
player
titles
Federer
20
Nadal
20
Djokovic
17
Murray
3

実行結果

上記のプログラムを実行すると、コードと同じディレクトリにcharts.xlsxが作成され、以下のようにデータと棒グラフが出力されます。

PythonのopenpyxlでExcelグラフを作成する方法|棒グラフ作成をステップ解説

※なお、記事内の優勝回数(フェデラー20回、ナダル20回、ジョコビッチ17回、マレー3回)は執筆時点の数値です。最新の記録とは異なる場合がある点にご注意ください。


  1. Excelのフォーム機能を使ってデータベースを簡単に作成する方法【手順解説】

    Excelでデータベースを作成したい場面は多くあります。従来のようにセルに一つずつ入力する代わりに、Excelにはデータ入力を効率化できる「フォーム」機能が用意されています。本記事では、フォームを使ってExcelでデータベースを作成する方法を、ステップバイステップでわかりやすく解説します。あわせて、フォーム操作に関する押さえておきたいポイントもご紹介します。 Excelのデータ入力フォームとは? 通常、Excelではセルに1件ずつデータを入力していきます。この方法では、特に大規模なデータベースを作成する際に入力作業が煩雑になりがちです。そんなときに活躍するのがデータ入力フォームです。フォームを

  2. Excelで顧客データベースを作成する方法【初心者向け簡単ステップ解説】

    本記事では、Microsoft Excelを使って顧客データベースを作成する方法を詳しく解説します。一般的に、従来型のデータベースにはテーブル、フィールド、レコード、主キー、外部キーなどの要素が必要ですが、Excelならこれらを意識せずとも手軽にデータベースを作成し、Excelテーブルへ変換できます。さらに、並べ替え(Sort)やフィルター(Filter)といった便利な機能を使えば、データベース内の情報も簡単に検索・整理できます。それでは、具体的な手順を見ていきましょう。 本記事で使用している練習用ワークブックは、ダウンロードして実際に操作しながら学ぶことも可能です。 顧客データベースとは