📖

Python で Microsoft Word の脚注番号を一括ハイライトする

2 min read

sample

before↓

after↓

Python 経由で COM オブジェクトを操作しているだけなので Office が必要です。

コード

pip で入手できる pywin32 を使用します。

今回のスクリプトは Word を開いた状態で動かしますwin32com.client でインスタンスを生成するとき、すでに Word 文書を開いていると ActiveDocument でその文書を操作できるようになります。

構文は基本的に VBA のままです。 ActiveDocument.FootNotes を for ループで回して、 Reference.Shading.BackgroundPatternColor に RGB を10進数に変換した数値を渡してやれば OK です。


import win32com.client

def colorcode_to_int(colorcode):
    hex = colorcode[1:7]
    r = int(hex[0:2], 16)
    g = int(hex[2:4], 16)
    b = int(hex[4:6], 16)
    return r + g*256 + b*256*256

def main():
    wdApp = win32com.client.Dispatch("Word.Application")
    if wdApp.Documents.Count < 1:
        if not wdApp.Visible:
            wdApp.Quit()
        return 0

    doc = wdApp.ActiveDocument
    for nt in doc.FootNotes:
        print("背景色を設定しています:", nt.Index)
        print("  - {}...".format(nt.Range.Text[0:20]))
        if nt.Reference.Shading.BackgroundPatternColor < 0:
            nt.Reference.Shading.BackgroundPatternColor = colorcode_to_int("#84daff")
        else:
            print("  - この注番号にはすでに背景色が設定されています。スキップしました。")


if __name__ == '__main__':
    main()

Word を起動していても文書を起動していない場合は何もしないで終了します。その際にウィンドウが表示されていない場合はゾンビプロセスと考えて Word 自体を終了させます。

PowerShell から呼び出す

日常用の PowerShell から呼び出せるようにコマンドレットを作りました。

上記の通り Word 文書を開いている場合にのみ処理するようにしていますが、念のため呼び出し側でも Word が立ち上がっている場合のみ起動するようにしています。

function Set-NotationShadingOnActiveWordDocumentWithPython {
        if ((Get-Process | Where-Object ProcessName -EQ "winword").Count -lt 1) {
            return
        }
        $pyCodePath = "(ファイルへのパスを指定)"
        'python -B "{0}"' -f $pyCodePath | Invoke-Expression
}

コマンドレット名がとんでもないことになっていますが、 *nota*py くらいまで入力して Ctrl+Space を押すと補完されるので実用上は困っていません。