Pythonとopenpyxlで図形の色や枠線を変更!ShapeProperties(spPr)の完全ガイド

openpyxl

Pythonのopenpyxlを使ってExcelレポートを自動生成している時、「あと、このグラフや図形の色も自動で変えられたら完璧なのに…」と感じたことはありませんか?

数値やテキストの操作に比べて、openpyxlでの図形操作、特に書式設定に関する情報は少なく、多くの人が手作業での修正を余儀なくされています。

この記事を読めば、今まで謎に包まれていた**ShapeProperties(シェイププロパティ)**、コード上ではspPrとして現れるこのオブジェクトを完全に理解できます。

具体的には、PythonコードからExcel図形の「塗りつぶし色」や「枠線」を自由自在に設定する方法が身につき、レポート作成の自動化をさらに一歩先へ進めることができます。

この記事は、openpyxlでExcelファイルの読み書きといった基本的な操作ができる方を対象にしています。さあ、図形操作をマスターして、面倒な手作業から解放されましょう!

そもそもopenpyxlのShapeProperties (spPr) とは?

結論から言うと、ShapePropertiesは、Excel内の図形が持つ「見た目」に関するすべての設定情報を保持するオブジェクトです。

openpyxlで図形を操作する際、このShapeProperties(コード上ではspPrという属性名でアクセスします)を理解することが、書式設定の鍵となります。

図形(Shape)とShapePropertiesの関係

ShapePropertiesは、図形オブジェクトの「プロパティ(属性)」の一つです。

イメージとしては、図形そのものが「人間」だとすれば、ShapePropertiesは「その人が着ている服やアクセサリー」のようなものです。服の色を変えたり、デザインを変えたりすることで、人間の見た目が変わるのと同じように、ShapePropertiesの値を変更することで、図形の見た目(色、線の太さ、効果など)が変わるのです。

技術的な背景を少しだけお話すると、Excelファイル(.xlsx)の内部はXMLという形式のデータで構成されています。図形の書式情報は、drawing.xmlというファイルの中の<a:spPr>というタグに記述されており、openpyxlShapePropertiesはこれに対応しています。

なぜShapePropertiesを理解する必要があるのか

openpyxlを使って図形の色や線をコードで操作するには、このShapePropertiesオブジェクトへのアクセスが不可欠だからです。

「この図形を赤色にしたい」「枠線を太い破線にしたい」といった具体的な指示は、すべてShapePropertiesオブジェクトの内部にある各属性(塗りつぶし設定、線設定など)に値をセットすることで実現されます。

つまり、図形の書式設定を自動化したいなら、ShapePropertiesは避けては通れない、非常に重要なオブジェクトなのです。

事前準備:図形を含むExcelファイルの用意とライブラリのインストール

まずは、実際にコードを動かすための準備を整えましょう。

やることは、openpyxlをインストールし、操作対象となる簡単な図形を含むExcelファイルを作成する、たったの2つです。

openpyxlのインストール

openpyxlがまだ環境にインストールされていない場合は、以下のコマンドでインストールしてください。すでにインストール済みの方は、この手順は不要です。

pip install openpyxl

このコマンドをターミナルやコマンドプロンプトで実行すれば、インストールは完了です。

サンプルExcelファイルの準備

次に、Pythonから操作するためのExcelファイルを手動で準備します。

  1. 新しいExcelブックを開きます。
  2. 「挿入」タブ → 「図形」から、好きな図形(ここでは「正方形/長方形」)をシートに1つだけ配置します。
  3. このファイルを**sample.xlsx**という名前で、作成するPythonスクリプトと同じディレクトリに保存してください。

(※この記事では画像の挿入は行いませんが、実際にはこのような図を配置します)

これで準備は万端です。次のセクションから、いよいよPythonコードを書いていきましょう。

【実践】Pythonコードで図形の書式を変更する基本手順

ここからは、先ほど準備したsample.xlsxの図形を、Pythonコードを使って実際に操作していきます。

基本的な流れは、①Excelファイルを開いて図形オブジェクトを取得し、②その図形のspPr属性を書き換えて、③ファイルを保存する、というシンプルなステップです。

既存の図形オブジェクトを取得する方法

まず、ワークシート上にある図形をPythonのオブジェクトとして取得する必要があります。

これは、シートオブジェクトが持つ_drawingという属性を介して行います。_drawingは公式ドキュメントには明記されていない、いわば内部的な属性ですが、現状では図形にアクセスする最も直接的な方法です。

import openpyxl
from openpyxl.drawing.fill import SolidColorFillProperties
from openpyxl.drawing.colors import RGBColor

# 1. ワークブックとワークシートを読み込む
wb = openpyxl.load_workbook("sample.xlsx")
ws = wb.active

# 2. シート内の図形を取得する
# _drawing.drawing_list にシート上の図形がリストとして格納されている
shapes = ws._drawing.drawing_list
print(f"シート上の図形の数: {len(shapes)}")

# 3. 最初の図形オブジェクトを取得
if shapes:
    shape = shapes[0]
    print(f"取得した図形の名前: {shape.name}")
    print(f"図形のプロパティ(spPr): {shape.spPr}")
else:
    print("シート上に図形が見つかりませんでした。")

# この時点ではまだ保存しない

上記のコードを実行すると、シート上の図形オブジェクトが取得できます。shape.spPrが、これから操作していくShapePropertiesオブジェクトそのものです。

図形の「塗りつぶし色」を変更する (solidFill)

それでは、図形の塗りつぶし色を赤色に変更してみましょう。

単色での塗りつぶしは、spPrsolidFill属性にSolidColorFillPropertiesオブジェクトを設定することで行います。色の指定にはRGBColorを使います。

import openpyxl
from openpyxl.drawing.fill import SolidColorFillProperties, NoFillProperties
from openpyxl.drawing.colors import RGBColor, SchemeColor

# ワークブックとワークシートを読み込む
wb = openpyxl.load_workbook("sample.xlsx")
ws = wb.active
shapes = ws._drawing.drawing_list

if not shapes:
    print("図形がありません。")
    exit()

shape = shapes[0]

# --- 塗りつぶしを赤色 (R:255, G:0, B:0) に変更 ---
# 1. 色を定義 (RGBColorを使用)
red_color = RGBColor(255, 0, 0)

# 2. SolidColorFillPropertiesオブジェクトを作成
solid_fill = SolidColorFillProperties(prstClr=red_color)

# 3. 図形のspPr.solidFill属性に設定
shape.spPr.solidFill = solid_fill

# --- Excelのテーマカラーで塗りつぶす場合 (例: アクセント1) ---
# theme_color = SchemeColor(val="accent1")
# solid_fill_theme = SolidColorFillProperties(prstClr=theme_color)
# shape.spPr.solidFill = solid_fill_theme

# --- 塗りつぶしを「なし」にする場合 ---
# shape.spPr.noFill = True
# もしくは
# shape.spPr.noFill = NoFillProperties()


# 4. 変更を保存
wb.save("sample_modified_fill.xlsx")
print("図形の塗りつぶし色を変更して 'sample_modified_fill.xlsx' に保存しました。")

このコードを実行後、sample_modified_fill.xlsxを開いてみてください。図形が鮮やかな赤色に変わっているはずです。コメントアウト部分を有効にすれば、Excelのテーマカラーを使ったり、塗りつぶしをなくしたりすることも可能です。

図形の「枠線」の色と太さを変更する (ln)

次に、図形の枠線を操作してみましょう。

枠線の設定は、spPrが持つlnという属性(LinePropertiesオブジェクト)を介して行います。lnの中に、さらに線の色や太さ、種類を指定する属性が含まれています。

ここでは、枠線を「青色の太線」に変更するコードを見ていきます。

import openpyxl
from openpyxl.drawing.line import LineProperties
from openpyxl.drawing.fill import SolidColorFillProperties
from openpyxl.drawing.colors import RGBColor

# ワークブックとワークシートを読み込む
wb = openpyxl.load_workbook("sample.xlsx")
ws = wb.active
shapes = ws._drawing.drawing_list

if not shapes:
    print("図形がありません。")
    exit()

shape = shapes[0]

# --- 枠線の設定 ---
# 1. 線の色を定義 (青色)
blue_color = RGBColor(0, 0, 255)
line_fill = SolidColorFillProperties(prstClr=blue_color)

# 2. LinePropertiesオブジェクトを取得 (なければ作成)
if shape.spPr.ln is None:
    shape.spPr.ln = LineProperties()

# 3. 枠線の色を設定
shape.spPr.ln.solidFill = line_fill

# 4. 枠線の太さを設定 (単位はEMU: English Metric Units)
# 1pt = 12700 EMU
# ここでは 3pt (3 * 12700 = 38100) に設定
shape.spPr.ln.w = 38100 

# 5. 枠線の種類を破線に設定する場合
# shape.spPr.ln.prstDash = "sysDash" # 破線
# shape.spPr.ln.prstDash = "solid" # 実線 (デフォルト)

# 6. 変更を保存
wb.save("sample_modified_line.xlsx")
print("図形の枠線を変更して 'sample_modified_line.xlsx' に保存しました。")

線の太さを指定するw属性の単位はEMU (English Metric Units) という少し特殊なものです。1pt12700 EMUに相当すると覚えておきましょう。

【逆引き】ShapePropertiesの主要な設定項目リファレンス

ここまでで、基本的な塗りつぶしと枠線の設定方法を学びました。ShapePropertiesには、他にも様々な設定項目があります。

ここでは、目的別に主要な属性をリファレンスとしてまとめます。

塗りつぶしに関する設定

図形の面の色やパターンを設定します。

  • solidFill (SolidColorFillProperties): 単色での塗りつぶし。RGBColorSchemeColorで色を指定します。
  • gradFill (GradientFillProperties): グラデーションでの塗りつぶし。開始色と終了色などを設定でき、より複雑な表現が可能です。
  • noFill (NoFillProperties or True): 塗りつぶしなし。これを設定するとsolidFillgradFillは無視されます。

線に関する設定

図形の枠線のスタイルを設定します。spPr.ln (LineProperties) の中の属性を操作します。

  • ln.solidFill: 線のを単色で設定します。(塗りつぶしと同じ考え方です)
  • ln.w: 線の太さをEMU単位で設定します (例: 127001pt)。
  • ln.prstDash: 線の種類を文字列で指定します (例: "solid": 実線, "dot": 点線, "sysDash": 破線)。
  • ln.headEnd, ln.tailEnd: 線の始点と終点の形(矢印など)を設定します。

図形の形状と位置に関する設定

図形そのものの形や、シート上でのサイズ・位置を定義します。

  • prstGeom (PresetGeometry2D): 定義済みの図形の種類を指定します (例: prst="rect" で長方形)。図形を新規作成する際に重要です。
  • xfrm (Transform2D): 図形のサイズ、位置、回転角度などを管理します。
    • xfrm.off: シートの左上からのオフセット位置 (x, y)。
    • xfrm.ext: 図形の幅 (cx) と高さ (cy)。
    • xfrm.rot: 回転角度。

効果に関する設定

影、光彩、ぼかしといった視覚効果を設定します。

  • effectLst (EffectList): 効果をリスト形式で保持します。
    • effectLst.shadow: 図形にを付けます。
    • effectLst.reflection: 図形が反射しているような効果を加えます。
    • effectLst.glow: 図形の周りを光らせる効果(光彩)を加えます。

これらのプロパティを組み合わせることで、Pythonコードから非常に多彩な図形の書式設定が可能になります。

まとめ

今回は、openpyxlにおける図形の書式設定の要であるShapeProperties (spPr) について、その概要から具体的な使い方までを徹底的に解説しました。

最後に、この記事の重要なポイントを振り返りましょう。

  • ShapeProperties (spPr) は、図形の見た目(書式)を管理する中心的なオブジェクトです。
  • 図形の塗りつぶしは spPr.solidFill、枠線は spPr.ln の各属性を操作するのが基本です。
  • 既存の図形は、ワークシートの _drawing.drawing_list 属性からリストとして取得できます。
  • 線の太さの単位はEMUで、1pt = 12700 EMUです。

ShapePropertiesを使いこなせれば、Excelレポートの自動生成は新たなステージに進みます。もう、図形のスタイルを一つひとつ手作業で修正する必要はありません。

この記事で紹介した基本を足がかりに、次はグラデーション(gradFill)や図形の回転(xfrm.rot)など、より高度な書式設定にもぜひ挑戦してみてください!

コメント

タイトルとURLをコピーしました