M365関連 プログラム 技術

PowerShellでファイル読み込み(Word)

Wordファイルを読み込んでみる

読み込むファイルの種類

今回、紹介するファイル読み込みは以下の拡張子が対象です
・Wordファイル(.doc / .docx / .docm)

前提条件

Word、Excel、PowerPointといったOfficeファイル形式を読み込む際は
実行環境に読み込み対象とするWord、Excel、PowerPointといったデスクトップアプリが
あらかじめインストールされており、ライセンス等の認証が完了している必要があります
今回紹介する方法がそのアプリの機能を使用しているためです

実際に読み込む

Wordファイルを開く

Wordに対して処理する際にWordを表示しないで実行し
パスワードがかかっている場合にパスワードを使用して開くようにしています
もし、パスワードがかかっていない場合はパスワードの値は無視して開くようになっています

$word = New-Object -ComObject word.Application
$word.Visible = $false
$openPass = "Wordを開く際に使用するパスワード"
$openTemple = "Wordテンプレートを開く際に使用するパスワード"
$doc = $word.Documents.Open("Wordファイルパス",[type]::Missing,[type]::Missing,[type]::Missing,$openPass,$openTemple)

Wordファイル内を読み込む

Word内で設定されているハイパーリンクやWord内に記載されているテキスト、
図形に記載されているテキストを読み込んでいます

$doc.Hyperlinks | ForEach-Object {
    Write-Host $_.Address
}

$doc.Paragraphs | ForEach-Object {
    Write-Host $_.Range.Text
}

$doc.Shapes | ForEach-Object {
    #描画キャンパス(msoCanvasは値が20)
    if($_.Type -eq 20){
        #すべてのアイテムに対して実行
        $_.CanvasItems | ForEach-Object {
            #グループの場合(msoGroupの値は6)
            if($_.Type -eq 6){
                $_.GroupItems | ForEach-Object {
                    if($_.TextFrame.HasText){
                        Write-Host $_.TextFrame.TextRange.Text
                    }
                 }
            }else{
                if($_.TextFrame.HasText){
                    Write-Host  $_.TextFrame.TextRange.Text
                }
            }
        }
    }
    #グループの場合(msoGroupの値は6)
    elseif($_.Type -eq 6){
        $_.GroupItems | ForEach-Object {
            if($_.TextFrame.HasText){
                Write-Host $_.TextFrame.TextRange.Text
            }
        }
    }
    #それ以外
    else{
        if($_.TextFrame.HasText){
            Write-Host $_.TextFrame.TextRange.Text
        }
    }
}

開いたWordを閉じる

開いたWordを変更があった場合にも保存せずに閉じています
Closeで特に指定がない場合は変更を保存するかどうかのポップアップが表示されるので
必ずどちらかを指定した方がよさそうです
また、以下はWordを読み込んだ後始末の決まった作法みたいなものになるのでそのまま使用してください。Wordを読み込むときに使用したメモリーを開放したり、Wordタスクを終了させたりしています

if($doc){
    $doc.Close($false)
    [System.Runtime.InteropServices.Marshal]::ReleaseComObject($doc) | Out-Null
    $doc = $null
    Remove-Variable -Name doc -ErrorAction SilentlyContinue
}
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
[System.GC]::Collect()
if($word){
    $word.Quit()
    [System.Runtime.InteropServices.Marshal]::ReleaseComObject($word) | Out-Null
    $word = $null
    Remove-Variable -Name word -ErrorAction SilentlyContinue
    [System.GC]::Collect()
    [System.GC]::WaitForPendingFinalizers()
    [System.GC]::Collect()
}

最後に

今回はWord内の様々な箇所からのテキスト読み込みをしてみました
ExcelやPowerPointの読み込みも別の記事で紹介します
全体のコードはGitHubにアップしているので参考になれば

サンプルコード
BlogSampleCodeProjects/PowerShell_FileLoad/WordFileLoad.ps1 at main · nasuton/BlogSampleCodeProjects · GitHub
BlogSampleCodeProjects/PowerShell_FileLoad/WordFileLoad.ps1 at main · nasuton/BlogSampleCodeProjects · GitHub

Project for sample code used in the blog.(Blogで記載しているサンプルコード ...

続きを読む

-M365関連, プログラム, 技術
-,