PythonのopenpyxlライブラリでExcelのレポートを自動作成する際、図形やグラフに挿入したテキストの見た目を整えるのに苦労した経験はありませんか?
「図形は追加できたけど、中の文字が小さすぎて読めない…」 「テキストの色を特定のブランドカラーに合わせたいのに、やり方がわからない…」
openpyxlはセル操作に関する情報が豊富な一方、図形内のテキスト書式設定、特にフォントサイズや色の変更方法は少し特殊で、情報を見つけるのが難しいのが現状です。
ご安心ください。この記事を最後まで読めば、図形内テキストの書式を管理するTextPropertiesオブジェクトを理解し、Pythonコードからフォントの「サイズ」と「色」を自由自在に設定する方法が身につきます。
この記事は、openpyxlでExcelファイルの読み書きや、基本的な図形の追加ができる方を対象としています。さあ、テキスト書式の自動化をマスターし、レポートの完成度をさらに高めましょう!
TextPropertiesとは?テキスト書式設定の司令塔
結論から言うと、TextPropertiesは、図形やグラフ内のテキストに関する全ての書式情報(フォント、色、サイズ、配置など)を管理する、いわば司令塔のようなオブジェクトです。
shape.text_bodyのようにアクセスできるこのオブジェクトの内部構造を理解することが、テキスト書式を自在に操るための第一歩となります。
テキスト書式の階層構造:ParagraphとRunを理解する
openpyxlでテキストの書式を正しく設定するためには、まずその階層構造を知る必要があります。テキストは、以下の2つの要素で構成されています。
- Paragraph(段落): テキスト全体のかたまりです。Wordの段落と同じように、テキストの配置(左揃え、中央揃えなど)やインデントといった、段落単位のスタイルを管理します。
- Run(ラン): 段落の中で、同じ書式を持つ連続した文字列の最小単位です。例えば、「これは太字です。」という文では、「これは」「太字」「です。」の3つのRunに分かれています。
このRunこそが、文字の色、サイズ、太字、斜体といった、個別の文字スタイルを保持しているのです。
CharacterProperties (rPr) こそが書式設定の鍵
そして、Runが持つ実際の書式情報は、CharacterPropertiesというオブジェクトに格納されています。
コード上では、rPr(Run Propertiesの略)という属性名でアクセスします。つまり、フォントサイズや色を変更したい場合、最終的なゴールは、この**rPrオブジェクトの値を書き換える**ことになります。
まとめると、書式設定への道のりは以下のようになります。 Shape → TextProperties → Paragraph → Run → CharacterProperties (rPr)
事前準備:テキスト入り図形を含むExcelファイルの用意
それでは、実際にコードを動かすための準備をしましょう。やることはopenpyxlのインストールと、操作対象となるサンプルExcelファイルの作成です。
openpyxlのインストール
openpyxlがまだPCにインストールされていない場合は、ターミナルやコマンドプロンプトで以下のコマンドを実行してください。
pip install openpyxlサンプルExcelファイルの準備
次に、Pythonから操作するためのExcelファイルを手動で準備します。
- 新しいExcelブックを開きます。
- 「挿入」タブ → 「図形」から、「テキストボックス」を選択し、シートに配置します。
- 配置したテキストボックスの中に、「Hello, openpyxl!」といった任意の文字を入力しておきます。
- このファイルを**
sample_text.xlsx**という名前で、作成するPythonスクリプトと同じ場所に保存してください。
このファイルを使って、テキストの書式をコードで変更していきます。
【実践】テキストのフォントサイズを変更する方法 (sz)
まずは最も基本的な操作、フォントサイズの変更です。
結論として、フォントサイズは、対象となるRunのCharacterProperties (rPr) が持つsz属性に、設定したいポイント数 (pt) の100倍の値を整数で設定することで変更できます。
図形オブジェクトとテキスト要素の取得
最初に、目的のテキスト(Runオブジェクト)までたどり着くコードを見てみましょう。シート上の図形は_drawing属性から取得できます。
import openpyxl
# ワークブックとワークシートを読み込む
wb = openpyxl.load_workbook("sample_text.xlsx")
ws = wb.active
# シート内の図形を取得
shapes = ws._drawing.drawing_list
if not shapes:
print("図形が見つかりません。")
exit()
# 最初の図形を取得
shape = shapes[0]
# テキストのRunオブジェクトを取得
# shape.text_body.p[0] -> 最初の段落(Paragraph)
# .r[0] -> 最初のRun
run = shape.text_body.p[0].r[0]
print(f"現在のフォントサイズ: {run.rPr.sz / 100}pt") # 確認のため表示フォントサイズを設定するサンプルコード
それでは、このRunオブジェクトのrPr.sz属性を書き換えて、フォントサイズを18ptに変更してみましょう。
sz属性に設定する値は、ポイント数の100倍であることに注意してください。これはopenpyxl内部の単位が1/100ポイントで管理されているためです。したがって、18ptにしたい場合は1800を設定します。
import openpyxl
# ワークブックとワークシートを読み込む
wb = openpyxl.load_workbook("sample_text.xlsx")
ws = wb.active
shapes = ws._drawing.drawing_list
if not shapes:
print("図形が見つかりません。")
exit()
shape = shapes[0]
run = shape.text_body.p[0].r[0]
# --- フォントサイズを18ptに変更 ---
# 設定したいポイント数 x 100 を設定
font_size_to_set = 1800 # 18pt
run.rPr.sz = font_size_to_set
# 変更を保存
wb.save("sample_text_size_modified.xlsx")
print(f"フォントサイズを{font_size_to_set / 100}ptに変更し、'sample_text_size_modified.xlsx' に保存しました。")
このコードを実行すると、テキストの文字が大きくなった新しいExcelファイルが生成されます。【実践】テキストのフォントの色を変更する方法 (solidFill)
次に、テキストのフォントの色を変更する方法です。
これは、RunのCharacterProperties (rPr) が持つsolidFill属性に、RGBColorで指定した色情報を持つSolidColorFillPropertiesオブジェクトを設定することで実現します。
RGBColorで色を定義する
色の指定にはopenpyxl.drawing.colors.RGBColorクラスを使用します。これを事前にインポートしておく必要があります。
フォントカラーを設定するサンプルコード
それでは、テキストの色を青色(R:0, G:0, B:255)に変更するコードを見てみましょう。色の設定方法は、以前に図形の塗りつぶし色を設定した方法と非常によく似ています。
import openpyxl
from openpyxl.drawing.fill import SolidColorFillProperties
from openpyxl.drawing.colors import RGBColor
# ワークブックとワークシートを読み込む
wb = openpyxl.load_workbook("sample_text.xlsx")
ws = wb.active
shapes = ws._drawing.drawing_list
if not shapes:
print("図形が見つかりません。")
exit()
shape = shapes[0]
run = shape.text_body.p[0].r[0]
# --- フォントの色を青色に変更 ---
# 1. 色をRGBで定義
blue_color = RGBColor(0, 0, 255)
# 2. SolidColorFillPropertiesオブジェクトを作成
solid_fill = SolidColorFillProperties(prstClr=blue_color)
# 3. rPrのsolidFill属性に設定
run.rPr.solidFill = solid_fill
# 変更を保存
wb.save("sample_text_color_modified.xlsx")
print("フォントの色を青色に変更し、'sample_text_color_modified.xlsx' に保存しました。")このコードを実行し、生成されたファイルを開くと、テキストが鮮やかな青色に変わっていることが確認できます。
【応用】太字・斜体・下線などその他の基本設定
CharacterProperties (rPr) を使えば、サイズや色以外の基本的な書式設定も簡単に行えます。
結論として、b (太字)、i (斜体)、u (下線) といった真偽値(True/False)を持つ属性で簡単にON/OFFできます。
コードで見る書式設定例
以下に、テキストを「太字」にし、「一重下線」を引くコードスニペットを示します。
# ... runオブジェクトを取得するまでのコードは省略 ...
# 太字に設定
run.rPr.b = True # Bold
# 斜体に設定
# run.rPr.i = True # Italic
# 下線を設定 (u属性には文字列 "sng" (single) を指定)
run.rPr.u = "sng" # Underline
# ... ファイルを保存するコード ...これらの属性を組み合わせることで、基本的なテキスト装飾はほぼ網羅できます。
まとめ
今回は、openpyxlで図形内のテキスト書式を設定する方法、特にフォントサイズと色に焦点を当てて詳しく解説しました。
最後に、この記事の重要なポイントを振り返りましょう。
openpyxlのテキスト書式はTextPropertiesを通じて操作し、その階層構造(Paragraph, Run)を理解することが重要です。- 実際の書式設定は、段落(
p)内のラン(r)が持つCharacterProperties(rPr)に対して行います。 - フォントサイズは
rPr.szにポイント数の100倍の値を設定します。(例: 12pt →1200) - フォントの色は
rPr.solidFillにRGBColorを使って設定します。
これまで手作業で行っていたレポートの最終調整も、これらの知識を使えば完全に自動化できます。ぜひ、ご自身のレポート自動化スクリプトに組み込んで、作業効率を劇的に向上させてください。


コメント