openpyxlを使ってExcelのセルにコメントを追加する方法は知っているけれど、「自分が追加したコメントは、一体どこに保存・管理されているんだろう?」と疑問に思ったことはありませんか?
その答えの鍵を握るのが、今回解説するCommentSheetというクラスです。
この記事では、openpyxlの少し内部的な仕組みであるCommentSheetに焦点を当て、シート内のコメントがどのように管理されているのかを、初心者の方にも分かりやすく解説します。
この記事を読めば、あなたは…
CommentSheetがopenpyxlの中で果たす役割を正確に理解できる- なぜ普段
CommentSheetを直接操作しないのか、その理由がわかる openpyxlの内部構造への理解が深まり、より応用的な操作への足がかりとなる
普段何気なく使っている.comment属性の裏側を覗いて、openpyxlへの理解をさらに深めていきましょう!
CommentSheetの正体は「コメント専門の管理台帳」
CommentSheetとは、かんたんに言うと「1つのワークシート専用のコメント管理台帳」です。
openpyxlは、ワークシート上のすべてのコメントをこのCommentSheetという一つのオブジェクトで一元管理しています。
この台帳には、 「どのセル番地(例: ‘C5’)に」 「どんなCommentオブジェクト(内容や作成者情報)が」 というペアの情報が、コメントの数だけすべて記録されています。
どこに存在するのか?
CommentSheetオブジェクトは、ワークシートオブジェクト(wsなど)の内部に、通常は_commentsという名前の属性として保持されています。
_(アンダースコア)から始まる名前は、Pythonでは「これは内部で使うための部品なので、直接触らないでくださいね」という開発者からのメッセージです。これが、私たちが普段CommentSheetを意識しない大きな理由の一つです。
なぜCommentSheetを直接操作しないのか?
openpyxlは、私たちがコメントを簡単に扱えるように、非常によくできた仕組みを提供しています。
# 私たちが書く、シンプルで直感的なコード
ws['A1'].comment = Comment("これはテストです", "Gem")この一行を実行するだけで、openpyxlが裏側で、
- ワークシート用の
CommentSheet(コメント台帳)が存在するか確認 - なければ新しく作成する
CommentSheetに「’A1’セルに、このCommentオブジェクトを追加」と記録する
という面倒な処理をすべて自動で行ってくれます。
つまり、openpyxlが提供する便利な窓口(.comment属性)を使えば、私たちは台帳の存在を意識することなく、安全かつ簡単にコメントを操作できるのです。わざわざ内部用の台帳を直接書き換える必要はない、というわけですね。
CommentSheetの存在を意識するのはどんな時?
では、このCommentSheetの知識はいつ役立つのでしょうか? それは、**「シート全体のコメントをまとめて扱いたい」**ときです。
CommentSheetがコメントの全情報を握っている、ということを知っていれば、シート内のコメントを一覧表示したり、一括削除したりする処理のイメージが湧きやすくなります。
【推奨】安全に全コメントを取得する方法
CommentSheetの仕組みを理解した上で、最も安全で推奨される「全コメントの取得方法」は、結局のところ**「全セルをループして.comment属性を一つずつ確認する」**という方法になります。
import openpyxl
from openpyxl.comments import Comment
# --- 準備:コメント付きのExcelファイルを作成 ---
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "SampleSheet"
ws["B2"].comment = Comment("要確認", "UserA")
ws["D8"].comment = Comment("2025/09/18時点のデータ", "UserB")
# --- シート内の全コメントを安全に取得 ---
print(f"--- '{ws.title}'シートのコメント一覧 ---")
comment_found = False
for row in ws.iter_rows():
for cell in row:
if cell.comment:
comment_found = True
print(f"セル'{cell.coordinate}'のコメント: {cell.comment.text} (作成者: {cell.comment.author})")
if not comment_found:
print("このシートにコメントは見つかりませんでした。")この方法は、openpyxlの内部構造の変更に影響されず、将来にわたって安定して動作することが期待できます。
【参考】内部属性_commentsを覗いてみる
学習目的でCommentSheetが保持するデータを直接見てみたい場合は、_comments属性にアクセスします。
⚠️注意: この方法はopenpyxlの内部実装に依存するため、サンプルコードとして参考にするに留め、実際のアプリケーションでの使用は避けることをお勧めします。
# --- _comments属性で直接データを参照 (非推奨) ---
print("\n--- _comments属性の中身 ---")
if ws._comments:
# ws._comments は (セル番地, Commentオブジェクト) のリスト
print(ws._comments)
else:
print("コメントはありません。")実行すると、[('B2', <Comment object>), ('D8', <Comment object>)]のようなリスト形式で、台帳に記録されたデータそのものを確認できます。
まとめ
今回は、openpyxlの内部でコメントを管理するCommentSheetクラスについて掘り下げて解説しました。
- **
CommentSheetは、シートごとに用意された「コメント管理台帳」**であり、すべてのコメント情報が記録されている。 - 私たちがセルにコメントを設定すると、
openpyxlが裏側で自動的にCommentSheetを更新してくれる。 - このおかげで、私たちは
CommentSheetの存在を意識せず、.comment属性を使って直感的にコメントを操作できる。 CommentSheetの知識は、シート全体のコメントを扱う処理を考える上で役立つが、実践では全セルをループする方法が最も安全で推奨される。
普段使っている機能の裏側の仕組みを知ることで、ライブラリへの理解が深まり、より高度な問題解決への応用力が身につきます。ぜひこの知識を、今後のExcel自動化にお役立てください。


コメント