PythonとopenpyxlでExcelのメタデータを自在に操る!DocumentProperties入門

openpyxl

PythonでExcelファイルを自動作成したとき、「このファイルはプログラムで生成した」「作成者は〇〇」といった情報をファイル自体に埋め込みたいと思ったことはありませんか?

実は、Excelファイルには、私たちが普段目にするセルの中身だけでなく、**「メタデータ」**と呼ばれる隠れた情報(作成者、タイトル、更新日時など)を保存する機能があります。

この記事では、Pythonの定番ライブラリopenpyxlを使って、このExcelのメタデータを自在に読み書きする方法を、初心者の方にも分かりやすく解説します。openpyxlDocumentPropertiesを使いこなして、あなたのExcel自動化をさらにレベルアップさせましょう!

Excelのメタデータ(ファイルプロパティ)とは?

メタデータというと少し難しく聞こえるかもしれませんが、要は**「データに関するデータ」のことです。Excelファイルにおいては、ファイルそのものに関する情報、例えば「誰が」「いつ」「何のために」作成したか、といった情報を指します。これらは一般的にファイルプロパティ**と呼ばれます。

どこで確認できるの?

このメタデータ(プロパティ)は、特別なツールがなくても簡単に確認できます。

  • Windows: ファイルを右クリック → プロパティ詳細タブ
  • macOS: ファイルを選択 → command + I(または右クリックから情報を見る
  • Excelアプリ内: ファイルタブ → 情報

ここを見ると、「作成者」「タイトル」「キーワード」といった項目があるはずです。openpyxlは、これらの項目をPythonコードから直接操作する機能を提供しています。

メタデータを編集するメリット

プログラムでメタデータを編集できると、特にファイルの自動生成を行う際に大きなメリットがあります。

  • 識別性の向上: 「どのプログラムが」「いつ」生成したファイルなのかをメタデータに記録することで、後からファイルの出自を簡単に特定できます。
  • 管理・検索の効率化: 特定のキーワードやカテゴリをメタデータに埋め込んでおくことで、大量のファイルの中から目的のものを探しやすくなります。
  • 信頼性の付与: 作成者や会社名を明記することで、ファイルの公式な出自を証明できます。

手作業でこれらの情報を一つ一つ入力するのは大変ですが、プログラムで自動化すれば、手間なく正確に情報を付与できます。

openpyxlでメタデータを読み込む基本

それでは、openpyxlを使って実際にメタデータを読み込む方法を見ていきましょう。

workbook.propertiesでDocumentPropertiesにアクセス

Excelファイルのメタデータは、Workbookオブジェクトのproperties属性に格納されています。この属性にアクセスすると、メタデータ全体を管理するDocumentPropertiesオブジェクトを取得できます。

import openpyxl

# Excelファイルを読み込む
# 事前に 'sample.xlsx' というファイルを作成しておいてください
try:
    wb = openpyxl.load_workbook('sample.xlsx')
    
    # DocumentPropertiesオブジェクトを取得
    props = wb.properties
    
    # メタデータを表示
    print(f"作成者: {props.creator}")
    print(f"タイトル: {props.title}")
    print(f"作成日時: {props.created}")
    print(f"更新日時: {props.modified}")

except FileNotFoundError:
    print("sample.xlsx が見つかりません。")

このように、wb.propertiesにアクセスし、その先の属性(.creator.titleなど)を指定するだけで、簡単に各メタデータを取得できます。

主なメタデータ一覧とサンプルコード

DocumentPropertiesでアクセスできる主なメタデータは以下の通りです。

属性名内容
creator作成者
titleタイトル
description説明(コメント)
subjectサブタイトル
keywordsキーワード(タグ)
lastModifiedBy最終更新者
created作成日時 (datetimeオブジェクト)
modified更新日時 (datetimeオブジェクト)
categoryカテゴリ
versionバージョン

これらの属性を使えば、ファイルのほぼすべてのメタ情報にアクセス可能です。

openpyxlでメタデータを書き込む(設定する)方法

メタデータの書き込みは、読み込みと同じくらい直感的で簡単です。

DocumentPropertiesの属性に値をセットするだけ

読み込みの際に使った属性に、直接文字列やdatetimeオブジェクトを代入することで、メタデータを設定・更新できます。

# 例:タイトルを設定
props.title = "Pythonによる自動生成レポート"

# 例:作成者を設定
props.creator = "Gem the Blogger"

最後にworkbook.save()を呼び出すのを忘れないようにしましょう。

コード例:新規ファイルにメタデータを設定する

新しいExcelファイルを作成し、最初からメタデータを設定して保存するサンプルコードです。

import openpyxl
from datetime import datetime

# 新しいWorkbookオブジェクトを作成
wb = openpyxl.Workbook()

# DocumentPropertiesオブジェクトを取得
props = wb.properties

# 各種メタデータを設定
props.title = "2025年9月度 月次レポート"
props.creator = "販売管理システム"
props.subject = "月次売上データ"
props.keywords = "Python, openpyxl, レポート, 202509"
props.created = datetime(2025, 9, 18, 21, 0, 0) # 具体的な日時を指定
props.lastModifiedBy = "System"

# ワークシートにもデータを書き込む
ws = wb.active
ws.title = "売上サマリー"
ws['A1'] = "2025年9月度の売上は良好です。"

# ファイルを保存
wb.save('report_with_metadata.xlsx')

print("メタデータ付きのファイル 'report_with_metadata.xlsx' を作成しました。")

このコードで生成されたファイルのプロパティを確認すると、設定した情報がすべて反映されていることがわかります。

コード例:既存ファイルのメタデータを更新する

既に存在するファイルのメタデータだけを更新したい場合も簡単です。ファイルを読み込み、プロパティを書き換えて、同じ名前で保存するだけです。

import openpyxl
from datetime import datetime

file_path = 'sample.xlsx'

try:
    # 既存のファイルを読み込む
    wb = openpyxl.load_workbook(file_path)

    # メタデータを更新
    props = wb.properties
    props.title = "(更新済み)サンプルドキュメント"
    props.lastModifiedBy = "最終確認者:Gem"
    props.modified = datetime.now() # 更新日時を現在に

    # ファイルを上書き保存
    wb.save(file_path)
    
    print(f"'{file_path}' のメタデータを更新しました。")

except FileNotFoundError:
    print(f"'{file_path}' が見つかりません。先にファイルを作成してください。")

まとめ

この記事では、openpyxlDocumentProperties機能を使ったExcelメタデータの操作方法について、入門者向けに解説しました。

  • メタデータ(ファイルプロパティ):ファイル自身に関する情報(作成者、タイトルなど)。
  • 読み込み方法wb = openpyxl.load_workbook()で読み込んだ後、wb.properties.creatorのようにアクセスする。
  • 書き込み方法wb.properties.creator = "新しい名前"のように属性に値を代入し、wb.save()で保存する。

Excelのセル操作だけでなく、メタデータまでプログラムで制御できるようになると、ファイル管理の自動化が大きく前進します。ぜひこのテクニックをマスターして、日々の業務効率化に役立ててください。

コメント

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