見積書や予算表を社外に送る前に、ブックのプロパティを開いて「作成者」や「会社名」が残っていないか確認する——手作業でやると、ファイルが数十個ある時点で現実的ではなくなります。逆に、受領したブックのプロパティを読み取って、どの部署がいつ作成したのかを機械的に一覧化したい場面もあります。
どちらも対象は同じ「ドキュメントプロパティ」です。Excel のプロパティはセルの値と違って画面上で目立たないため、後回しにされがちですが、コードから読み書きできるようにしておくと、チェックも除去も自動化できます。
本記事では、Spire.XLS for Python を使用して Python で Excel のドキュメントプロパティを読み取り・削除する方法 を解説します。
クイックナビゲーション
実行環境の準備
本記事のコードは Spire.XLS for Python と plum-dispatch v1.7.4 を使用しています(動作確認は Spire.XLS for Python 16.8.2)。pip コマンドでインストールしてください。
pip install Spire.XLS
スクリプト側では次の 2 行をインポートします。
from spire.xls import *
from spire.xls.common import *
手動でセットアップする場合は、Spire.XLS for Python のダウンロードページ からパッケージを取得できます。以降のコードでは、プロパティが設定済みの Sample.xlsx というブックを読み込む前提で進めます。
標準プロパティを読み取る
Excel のプロパティは、あらかじめ項目が決まっている 標準プロパティ(タイトル、件名、分類、キーワード、コメント、作成者、会社名など)と、利用者が名前から自分で決める カスタムプロパティ(部署コード、承認日など)の 2 種類に分かれます。Excel の[ファイル]→[情報]→[プロパティ]→[詳細プロパティ]を開くと、前者は「概要」タブ、後者は「ユーザー設定」タブに並びます。
標準プロパティは Workbook.DocumentProperties プロパティ(BuiltInDocumentProperties クラス)から取得します。取得した値をリストに積んで、最後にテキストファイルへ書き出してみましょう。
from spire.xls import *
from spire.xls.common import *
def AppendAllText(fname, text):
fp = open(fname, "w", encoding="utf-8")
for s in text:
fp.write(s + "\n")
fp.close()
inputFile = "Sample.xlsx"
outputFile = "GetExcelProperties.txt"
# Workbook インスタンスを作成
workbook = Workbook()
# Excel ブックを読み込む
workbook.LoadFromFile(inputFile)
builder = []
# 標準プロパティのコレクションを取得
standardProperties = workbook.DocumentProperties
builder.append("Standard Document Properties:")
# 未設定の標準プロパティは None で返るため、空文字列へ整えてから連結する
builder.append("Title: " + (standardProperties.Title or ""))
builder.append("Subject: " + (standardProperties.Subject or ""))
builder.append("Category: " + (standardProperties.Category or ""))
builder.append("Keywords: " + (standardProperties.Keywords or ""))
builder.append("Comments: " + (standardProperties.Comments or ""))
builder.append("")
# 取得した内容をテキストファイルに書き出す
AppendAllText(outputFile, builder)
workbook.Dispose()
実行すると、GetExcelProperties.txt に次の内容が出力されます。
Standard Document Properties:
Title: 2026年度 部門別予算管理表
Subject: 部門ごとの予算と実績の差異を管理する
Category: 業務
Keywords: 予算, 部門, 実績
Comments: 承認後に配布してください

ここで注意したいのが、一度も設定されていない標準プロパティは None を返すという点です。実際の Excel ファイルでは、タイトルや件名を空のまま保存しているケースが珍しくありません。その状態で "Title: " + standardProperties.Title のようにそのまま連結すると、TypeError: can only concatenate str (not "NoneType") to str で処理が止まります。
上のコードで (standardProperties.Title or "") としているのは、None のときに空文字列へ置き換えるためです。空文字列を代入して明示的にクリアした項目は '' を返すので連結できますが、未設定の項目は None です。どちらが来ても壊れないよう、値をそのまま連結せず or "" を挟むか str() で包んでください。
なお、DocumentProperties にはここで使った項目のほかに Author、Company、Manager、LastSaveTime、LastAuthor なども用意されています。項目名が決まっているため、読みたいものを直接指定できるのが、次に説明するカスタムプロパティとの違いです。
カスタムプロパティを型ごとに取り出す
カスタムプロパティのコレクションは、標準プロパティとは別の Workbook.CustomDocumentProperties プロパティ(ICustomDocumentProperties クラス)から取得します。項目名が固定でないため、添字を回して名前・型・値を 1 件ずつ取り出す形になります。
次に押さえておきたいのが 値の型 です。カスタムプロパティは Excel 側で型を保持しており、Value プロパティが返すのは SpireObject というラッパーオブジェクトです。str() でそのまま文字列化しても <spire.xls.common.SpireObject.SpireObject object at 0x...> というオブジェクト表記が返るだけで、値にはなりません。PropertyType を見てから、対応する変換クラスをかぶせて取り出します。
from spire.xls import *
from spire.xls.common import *
def AppendAllText(fname, text):
fp = open(fname, "w", encoding="utf-8")
for s in text:
fp.write(s + "\n")
fp.close()
inputFile = "Sample.xlsx"
outputFile = "GetExcelProperties.txt"
workbook = Workbook()
workbook.LoadFromFile(inputFile)
builder = ["Custom Properties:"]
# カスタムプロパティのコレクションを取得
customProperties = workbook.CustomDocumentProperties
# コレクションをループ処理
for i in range(len(customProperties)):
# プロパティの名前・型・値を取得
name = customProperties[i].Name
type = customProperties[i].PropertyType
obj = customProperties[i].Value
# 型に応じて値を変換する
value = None
if type == PropertyType.Double:
value = Double(obj).Value
elif type == PropertyType.DateTime:
value = DateTime(obj).ToShortDateString()
elif type == PropertyType.Bool:
value = Boolean(obj).Value
elif type == PropertyType.Int:
value = Int32(obj).Value
elif type == PropertyType.Int32:
value = Int32(obj).Value
else:
value = String(obj).Value
builder.append(name + ": " + str(value))
AppendAllText(outputFile, builder)
workbook.Dispose()
PropertyType と変換クラスの対応は次のとおりです。Excel 側でどの型として保存されるかもあわせて載せます。
PropertyType |
変換クラス | 実際の値の例 |
|---|---|---|
String |
String(obj).Value |
SALES-01 |
Int / Int32 |
Int32(obj).Value |
3 |
DateTime |
DateTime(obj).ToShortDateString() |
2026/4/1 |
Bool |
Boolean(obj).Value |
True |
Double |
Double(obj).Value |
157.25 |
上のコードを実行すると、標準プロパティの出力に続けて次の行が書き出されます。
Custom Properties:
部署コード: SALES-01
予算改訂回数: 3
承認日: 2026/4/1
機密区分: True
為替レート: 157.25

型の判定は省かないでください。 変換クラスは型が一致していなければ機能しません。5 種類の値に対して変換クラスを総当たりで試したところ、値を取り出せたのは正しい組み合わせだけで、型が合わない変換クラスは すべて SpireException(内部では Arg_InvalidCastException)を送出 しました。
既定値が返って処理が続行するのではなく、その場で例外になって停止します。原因が分かりやすい反面、try で囲んでいなければスクリプト全体が中断するため、PropertyType での分岐は省略しないでください。
また、CustomDocumentProperties コレクションは 追加した順序 で項目を保持します(項目名のアルファベット順ではありません)。上の出力も、実際に追加した順に並んでいます。len(customProperties) で件数を取得できるので、range() と組み合わせれば全件を漏れなく処理できます。
プロパティを削除する
削除は 2 種類で方法が異なります。標準プロパティには削除用のメソッドが用意されていないため 空文字列を代入 します。カスタムプロパティは Remove() メソッドに項目名を渡して、項目ごと削除します。
from spire.xls import *
from spire.xls.common import *
inputFile = "Sample.xlsx"
outputFile = "RemoveProperties.xlsx"
workbook = Workbook()
workbook.LoadFromFile(inputFile)
# 標準プロパティを空にする
standardProperties = workbook.DocumentProperties
standardProperties.Title = ""
standardProperties.Subject = ""
standardProperties.Category = ""
standardProperties.Keywords = ""
standardProperties.Comments = ""
# カスタムプロパティを 1 件ずつ削除する
customProperties = workbook.CustomDocumentProperties
for i in range(len(customProperties) - 1, -1, -1):
customProperties.Remove(customProperties[i].Name)
workbook.SaveToFile(outputFile, ExcelVersion.Version2016)
workbook.Dispose()
カスタムプロパティを削除するときは、添字を 末尾から先頭に向かって 減らすのがポイントです。Remove() を実行するとコレクションの要素が詰められて添字がずれるため、先頭から順に削除していくと項目が残ります。5 件のカスタムプロパティを先頭から削除した場合、3 回処理した時点で添字が範囲外になり、2 件が未削除のまま残りました。
保存したファイルを調べると、削除は OOXML レベルでも確認できます。カスタムプロパティの実体である docProps/custom.xml は パッケージから丸ごと消え、標準プロパティは docProps/core.xml の各要素が空になった状態で残ります。

なお、カスタムプロパティを削除する方法は Remove() のほかに RemoveAt(添字) もあります。名前は保持しておらず添字だけが分かっている場合はこちらが使えますが、削除中は添字がずれる点は同じなので、やはり末尾からのループと組み合わせてください。
削除したつもりでも残る項目
ここまでで「標準プロパティは空、カスタムプロパティは全削除」の状態になりました。ただし、これでブックから個人情報が消えたわけではありません。削除後のファイルを調べてみると、次の項目は そのまま残っていました。
| 残った項目 | 保存先 | 内容の例 |
|---|---|---|
作成者(Author) |
docProps/core.xml の dc:creator |
山田 太郎 |
会社名(Company) |
docProps/app.xml の Company |
株式会社アイスブルー |
管理者(Manager) |
docProps/app.xml の Manager |
佐藤 花子 |
上のコードで空にしたのはタイトル・件名・分類・キーワード・コメントの 5 項目だけで、作成者・会社名・管理者は含まれていません。社外に配布する資料から組織名や個人名を消したい場合、これでは不十分です。
同じ考え方で、DocumentProperties の該当プロパティも空にしておきましょう。カスタムプロパティの削除処理の直前に、次の 3 行を加えます。
standardProperties.Author = ""
standardProperties.Company = ""
standardProperties.Manager = ""
どの項目まで消すかは運用次第ですが、「とりあえず標準プロパティを空にしたから安全」と判断せず、削除後に何が残っているかを実際に確認する 習慣をつけておくと、配布時の事故を避けられます。
まとめ
本記事では、Spire.XLS for Python を使用して Python で Excel のドキュメントプロパティを読み取り・削除する方法 を解説しました。
読み取り:標準プロパティは DocumentProperties から専用プロパティで取得し、カスタムプロパティは CustomDocumentProperties を添字で回して Name / PropertyType / Value を取り出します。値は型に合った変換クラスをかぶせてから使います。
削除:標準プロパティは空文字列を代入、カスタムプロパティは Remove() で削除します。添字がずれるため、削除ループは末尾から回します。
注意点:作成者・会社名・管理者は削除リストに入っていなければ残ります。配布前の自動チェックに組み込む場合は、読み取りと削除を同じスクリプトで回し、処理後のブックを再度読み取って残存項目を確認すると確実です。
ファイルを受け取る側の立場でも、この仕組みは役に立ちます。フォルダ内のブックをまとめて走査し、作成者や最終保存日時を一覧化すれば、資料の出自を追う手がかりになります。
Spire.XLS for Python の全機能を評価したい場合は、30 日間の無料ライセンスを申請できます。
FAQ
標準プロパティとカスタムプロパティは、コード上でどう見分けますか?
別のコレクションとして取得します。標準プロパティは Workbook.DocumentProperties、カスタムプロパティは Workbook.CustomDocumentProperties です。標準プロパティは Title のような専用プロパティで直接アクセスできるのに対し、カスタムプロパティは添字を回して Name を確認する必要があります。
カスタムプロパティの型を判定せずに値を取り出すとどうなりますか?
Value が返すのは SpireObject というラッパーオブジェクトなので、str() でそのまま文字列化しても意味のある表示にはなりません。また、型に合わない変換クラスをかぶせると SpireException が送出され、読み取り処理がその場で停止します。PropertyType を確認してから、対応する変換クラスを選んでください。
カスタムプロパティは追加した順に並びますか?
はい。Excel のカスタムプロパティは追加した順序で保持され、添字 0 が最初に追加した項目になります。削除ループを末尾から回すのは、この並び順を前提にしても変わりません。
作成者や会社名だけを残して、他のプロパティを消すことはできますか?
できます。削除したい項目だけを選んで処理してください。標準プロパティは個別のプロパティに空文字列を代入する形なので、Comments だけを消して Author は残す、といった制御が可能です。ただし、そもそも削除対象に含めていない項目は残るため、消し忘れには注意してください。
プロパティの読み取りと削除は同じスクリプトで実行できますか?
はい。読み取って内容を確認したあとに削除し、別ファイルとして保存する流れが実用的です。読み取りに使った Workbook インスタンスをそのまま使い、SaveToFile() で別名を指定すれば、元のファイルを残したまま処理後のブックを得られます。
読み取り時に TypeError: can only concatenate str (not "NoneType") to str が出ます。原因は何ですか?
未設定の標準プロパティが None を返しているためです。None は文字列と連結できないので、(standardProperties.Title or "") のように空文字列へ整めてから連結してください。エラーになるのは「一度も設定されていない項目」を読んだときで、空文字列を代入してクリアした項目は '' を返すため、削除後のブックでも同じコードがそのまま動きます。






