PythonでExcelのプロパティ情報操作

Excel,python,python

今回はpythonのopenpyxlを使用して、エクセルファイルのプロパティ情報の操作を行っていきたいと思います。

というのも、会社の納品物としてExcelで記載した設計書等を提出するわけですが、作成者情報など残しちゃだめだよねと。

とはいえ、各ファイルを右クリックして削除していくのも不毛なため、pythonで一括削除できるといいなと思い調べてみました。

そのため、フォルダを指定してフォルダ内のすべてのエクセルファイルのプロパティ情報を削除するようなツールも作ってみます。

Excelのプロパティ情報

Excelファイルには、以下のようなプロパティ情報が含まれています。

正直特に意識していなければ大した情報は残らないのですが、作成者前回保存者についてはどうしても情報が残ってしまいます。

また、ベースのエクセルが何かあってコピーして使ったりしていると、思わぬ値がプロパティに残っていたりもします。

openpyxlによるプロパティ情報の操作

試しに各パラメータの表示と書き換えを行うコードを作ってみました。

「プログラム名」「会社」「マネージャー」のパラメータに関してはどうしても方法が分からなかったので今回は諦めました。

import openpyxl
import datetime

# Excelファイルの読み込み
wb = openpyxl.load_workbook('Book1.xlsx')
props = wb.properties

# プロパティ情報を表示する
# 説明
print("タイトル:", props.title)
print("件名:", props.subject)
print("タグ:", props.keywords)
print("分類項目:", props.category)
print("コメント:", props.description)
# 元の場所
print("作成者:", props.creator)
print("前回保存者:", props.lastModifiedBy)
print("改訂番号:", props.revision)
print("バージョン番号:", props.revision)
#print("プログラム名:", props.application )
#print("会社:", props.company  )
#print("マネージャー:", props.manager )
print("コンテンツの作成日時:", props.created)
print("前回保存日時:", props.modified)
print("前回印刷日:", props.lastPrinted)
# コンテンツ
print("内容の状態:", props.contentStatus)
print("言語:", props.language)

# プロパティ情報を更新する
# 説明
props.title="title"
props.subject="subject"
props.keywords="keywords"
props.category="category"
props.description="description"
# 元の場所
props.creator='openpyxl'
props.lastModifiedBy="lastModifiedBy"
props.revision="revision"
props.version="version"
props.created=datetime.datetime(2023, 5, 1, 1, 1, 1, 1)
props.modified=datetime.datetime(2023, 5, 2, 2, 2, 2, 2)
props.lastPrinted=datetime.datetime(2023, 5, 3, 3, 3, 3, 3)
# コンテンツ
props.contentStatus="contentStatus"
props.language="language"

# Excelファイルの保存
wb.save('Book1.xlsx')

実際に実行してみると各パラメータが更新されているのが確認できます。

指定フォルダ内、全エクセルファイルのプロパティ情報削除

いよいよ本題のフォルダ内の全エクセルファイルのプロパティ情報削除です。

少し修正すれば、任意のプロパティを一括して同じ値に更新なんかも可能です。

# coding: utf -8
from tkinter import filedialog
import os
import openpyxl


def main():
    # 対象のフォルダパス取得
    fTyp = [("", "*")]
    iDir = os.path.abspath(os.path.dirname(__file__))
    folder_path = filedialog.askdirectory( initialdir=iDir , title="対象のフォルダを選択" )
    serch_file(folder_path)
    return


def serch_file(path):
    with os.scandir(path) as it:
        for entry in it:
            # 対象ファイルがディレクトリ
            if entry.is_dir():
                # 再起処理による検索
                serch_file(entry.path)
            # 対象ファイルがディレクトリ以外
            elif entry.is_file():
                if ".xlsx" in entry.name:
                    delete_properties(entry.path)
                    print(entry.path)
    return


def delete_properties(path):
    # Excelファイルの読み込み
    wb = openpyxl.load_workbook(path)
    props = wb.properties
    # プロパティ情報を削除する
    # 説明
    props.title=None
    props.subject=None
    props.keywords=None
    props.category=None
    props.description=None
    # 元の場所
    props.creator=None
    props.lastModifiedBy=None
    props.revision=None
    props.version=None
    # コンテンツ
    props.contentStatus=None
    props.language=None
    # Excelファイルの保存
    wb.save(path)
    return

if __name__ == '__main__':
    main()

最後に

一部諦めちゃったパラメータ(「プログラム名」「会社」「マネージャー」)があるのでそこ次第では見直さなきゃかもです。

ExtendedPropertiesっていうモジュールを使えば出来そうではあったのですが。

あとそもそもこのエクセルのプロパティ情報って活用している人いるんですかね。