OpenPyXL㉕ (グラフを作成)

グラフを作成

openpyxl.chart で定義されているクラスを使うと、ワークシートのデータから グラフ を作成することができます

グラフ を作成する手順は次のようになります。

  1. グラフオブジェクトの生成
    グラフの種類に対応したオブジェクトを作成します。
  2. グラフタイトル等の設定
    グラフオブジェクトのプロパティを使って、グラフの棒や線のスタイル、グラフのタイトル、縦軸と横軸のタイトルを設定します。
  3. データ用のReferenceオブジェクトの生成
    グラフのデータが入力されているセル範囲を指定します。
  4. カテゴリデータ用のReferenceオブジェクトの生成
    カテゴリデータは入力されているセル範囲を指定します。
  5. グラフオブジェクトへのデータ用Referenceオブジェクトの追加
    グラフオブジェクトにデータ用Referenceオブジェクトを追加します。
  6. グラフオブジェクトへのカテゴリのReferenceオブジェクトの追加
    add_dataメソッドで、グラフオブジェクトにカテゴリのReferenceオブジェクトを追加します。
  7. 位置を指定してグラフを配置
    add_chartメソッドにグラフオブジェクト、グラフを配置する基準にするセル番地を指定して、ワークシートにグラフを配置します。

下記のサンプルソースでは、BarChartコンストラクタ を使って棒グラフを作成しています。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import openpyxl
from openpyxl.chart import BarChart, Series, Reference

book = openpyxl.Workbook() # ブックを生成
sheet = book.active # アクティブなシートを取得

rows = [
('月', '商品1', '商品2'), # タイトル行
(1, 320, 435), # 12行のレコードデータ
(2, 130, 530),
(3, 440, 60),
(4, 550, 770),
(5, 260, 410),
(6, 370, 640),
(7, 580, 630),
(8, 625, 430),
(9, 720, 230),
(10, 580, 340),
(11, 670, 450),
(12, 605, 755),
]
for row in rows: # 行数のぶんだけ繰り返す
sheet.append(row) # ワークシートに追加する

#### 列ごとに棒グラフを作成 ####
chart1 = BarChart() # 棒グラフのオブジェクトを生成
chart1.type = 'col' # 列ごとにタテ棒を表示する
chart1.style = 10 # グラフのスタイルを設定
chart1.title = '年間売上' # メインタイトル
chart1.y_axis.title = '売上高' # タテ軸のタイトル
chart1.x_axis.title = '月' # ヨコ軸のタイトル

# データが入力されているセル範囲
data = Reference(sheet, # 対象のワークシート
min_col=2, # 開始列
min_row=1, # 開始行
max_col=3, # 終端列
max_row=13 # 終端行
)

# カテゴリデータのセル範囲
cats = Reference(sheet, # 対象のワークシート
min_col=1, # 開始列
min_row=2, # 開始行
max_row=13) # 終端行

# BarChartオブジェクトにデータを追加
chart1.add_data(data, titles_from_data=True)

# BarChartオブジェクトにカテゴリを追加
chart1.set_categories(cats)

# ワークシート上にグラフを追加
sheet.add_chart(chart1, # 対象のワークシート
'A15' # グラフエリアの左上隅をA16セルに合わせる
)

book.save('Test.xlsx') # ブックを保存

[Test.xlsx]

保存したExcelファイルを確認すると、棒グラフが作成されていることを確認できます。

OpenPyXL㉔ (レコード単位で入力)

レコード単位で入力

レコード単位で複数のデータを入力するためには、Worksheetオブジェクトの appendメソッド を使います。

まずは1行分のレコードをタプルで定義し、これを1つのリストにまとめます。

そのあとリストに設定した1レコード分のデータ(タプル)をforループで取得し、appendメソッドの引数に設定します。(22~23行目)

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import openpyxl

rows = [
('月', '商品1', '商品2'), # タイトル行
(1, 320, 435), # 12行のレコードデータ
(2, 130, 530),
(3, 440, 60),
(4, 550, 770),
(5, 260, 410),
(6, 370, 640),
(7, 580, 630),
(8, 625, 430),
(9, 720, 230),
(10, 580, 340),
(11, 670, 450),
(12, 605, 755),
]

book = openpyxl.Workbook() # ブックを生成
sheet = book.active # アクティブなシートを取得

for row in rows: # 行数の数だけ繰り返す
sheet.append(row) # ワークシートに追加する

book.save('Test.xlsx') # ブックを保存

[Test.xlsx]

保存したExcelファイルを確認すると、リストに定義したデータがすべて入力されていることを確認できます。

OpenPyXL㉓ (行や列の固定表示)

行や列の固定表示

Excelには、ワークシートのセルをスクロールさせても特定の 行や列を固定で表示 する機能があります。

データが多い場合に見出しの行やれるを固定しておくと、スクロールしても常に見出しが表示されるので作業がしやすくなります。

Worksheetオブジェクトの freeze_panesプロパティ に任意のセル番地を代入するとセルが固定されるようになります。

次のサンプルコードでは、1行目を固定表示 にしています。

[Google Colaboratory]

1
2
3
4
5
6
7
import openpyxl

book = openpyxl.Workbook()
sheet = book.active

sheet.freeze_panes = 'A2'
book.save('Test.xlsx')

[Test.xlsx]

保存されたExcelファイルを開くと、1行目が 固定表示 になっていることを確認できます。

OpenPyXL㉒ (セル結合の解除)

セル結合の解除

Worksheetオブジェクトの unmerge_cellsメソッド を使うと、結合したセルを 解除 することができます。

引数には結合されたセルの 元のセル範囲 を指定します。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
import openpyxl

book = openpyxl.Workbook()
sheet = book.active

sheet.merge_cells('A1:A2') # セルを結合
sheet['A1'] = '結合1' # セルに入力
book.save('Test1.xlsx')

sheet.unmerge_cells('A1:A2') # 結合を解除
book.save('Test2.xlsx')

[Test1.xlsx] ➡ [Test2.xlsx]

2つのExcelファイルを開くと、結合されたセルが 解除 されていることを確認できます。

OpenPyXL㉑ (セル結合)

セル結合

Worksheetオブジェクトの merge_cellsメソッド を使うと、複数のセルを1つのセルに結合できます。

引数にセル範囲を指定すると、すべてのセルが 左上のセル に結合されます。

下記のサンプルコードでは、A1とA2を1つのセル に結合しています。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
import openpyxl

book = openpyxl.Workbook()
sheet = book.active

sheet.merge_cells('A1:A2') # セルを結合
sheet['A1'] = '結合1' # セルに入力
#sheet['A2'] = '結合2' # エラー(AttributeError: 'MergedCell' object attribute 'value' is read-only)

book.save('Test.xlsx')

結合したセルに値を設定する場合は、左上のセル(A1)を指定します。

左上のセル以外(A2)に値を設定しようとすると AttributeError が発生します。

[Test.xlsx]

保存したExcelファイルを開くと、A1とA2の セルが結合 されていることを確認できます。

OpenPyXL⑳ (セルの幅と高さを設定)

セルの幅と高さを設定

Worksheetオブジェクトには、セルの幅や高さ を保持するオブジェクトがあります。

  • column_dimensionsオブジェクト
    セルの幅を保持します。
    widthプロパティ でセル幅を設定します。
    0から409まで の整数、または小数を設定可。単位はポイント(pt)。
  • row_dimensionsオブジェクト
    セルの高さを保持します。
    heightプロパティ でセルの高さを設定します。
    0から255まで の整数、または小数を設定可。単位はポイント(pt)。

セルの幅と高さを設定するサンプルコードは下記のとおりです。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
12
13
import openpyxl
book = openpyxl.Workbook() # Workbookオブジェクトを生成
sheet = book.active # アクティブシートを取得

sheet['A1'] = '幅を設定' # A1セルに文字列を入力
sheet.column_dimensions['A'].width = 50 # A列の幅を30に設定
print('A列の幅 =>', sheet.column_dimensions['A'].width)

sheet['B2'] = '高さを設定' # B2セルに文字列を入力
sheet.row_dimensions[2].height = 80 # 2行目の高さを100に設定
print('2行目の高さ', sheet.row_dimensions[2].height)

book.save('Test.xlsx') # ファイル保存

[実行結果]

[Test.xlsx]

保存されたExcelファイルを開くと、セルの幅と高さ が変更されていることを確認することができます。

OpenPyXL⑲ (数式を入力)

数式を入力

Excelの数式を設定する場合は、数式を文字列 でセルに書き込みます。

sheet[‘A3’] = ‘=SUM(A1:A2)’

上記のように設定すると、ワークシートの A3セルA1からA2までの値を合計 して表示することができます。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
import openpyxl

book = openpyxl.Workbook() # Excelブックを生成
sheet = book.active # アクティブなワークシートを取得
sheet['A1'] = 50 # A1セルに値を入力
sheet['A2'] = 30 # A2セルに値を入力
sheet['A3'] = '=SUM(A1:A2)' # A3セルにSUM()関数を入力
print('A3セル', sheet['A3'].value) # A3セルの数式を確認

book.save('test.xlsx') # ブックを保存

[実行結果]

A3セルに ‘=SUM(A1:A2)’ という数式が設定されていることを確認できます。

[Test.xlsx]

保存されたExcelファイルを確認すると、A3セルに A1からA2までの合計値 が表示されています。

OpenPyXL18 (値を設定)

値を設定

エクセルに値を設定するためには

  Worksheetオブジェクト[‘セル番地’] = 書き込む値

のように指定します。

辞書型の変数に値を設定する方法と同じ感じです。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
import openpyxl
book = openpyxl.Workbook() # Workbookオブジェクトを生成
sheet = book['Sheet'] # Worksheetオブジェクトを取得

sheet['A1'] = '文字列データ' # A1セルに値設定
sheet['B1'] = 1000 # B1セルに値設定

print('A1のデータ =>', sheet['A1'].value)
print('B1のデータ =>', sheet['B1'].value)

[実行結果]

エクセルに値が設定できることを確認できました。

OpenPyXL⑰ (ワークシート削除)

ワークシート削除

Workbookオブジェクトremove_sheetメソッド を使うと、任意のワークシートを削除できます。

引数には ワークシート名 を指定します。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import openpyxl

book = openpyxl.Workbook() # Workbookオブジェクトを生成
book.create_sheet()
book.create_sheet()
book.create_sheet()
print('削除前 =>', book.sheetnames)

# Sheetを削除
book.remove(book['Sheet'])
print('Sheet 削除後 =>', book.sheetnames)

book.remove(book['Sheet2'])
print('Sheet2 削除後 =>', book.sheetnames)

[実行結果]

指定したワークシートを削除することを確認できました。

OpenPyXL⑯ (位置と名前を指定してワークシート追加)

位置と名前を指定してワークシート追加

Workbookオブジェクトcreate_sheetメソッド の名前付き引数を使うと、指定した位置任意の名前で新規のワークシートを追加することができます。

  • index
    挿入する位置。0から始まるインデックス値を指定。
  • title
    追加するシート名。

[Google Colaboratory]

1
2
3
4
5
6
7
8
import openpyxl

book = openpyxl.Workbook() # Workbookオブジェクトを生成
print('[追加前]', book.sheetnames)

# 名前を「2番目」にして先頭から2番目の位置に追加する
book.create_sheet(index=1, title='2番目')
print('[追加後]', book.sheetnames)

[実行結果]

2番目の位置 にシート名 2番目 として、シートを追加することができました。