PowerShellでWordをいじる方法の備忘録


# この記事について
以前、[PowerShellでExcelをいじる方法](https://qiita.com/23fumi/items/aa65ffa2098509337d33)を書き留めましたが、今回Wordから情報を抜いてくる方法を調べる際に、同様にWordもPowerShellで操作できないか、試してみました。

~~本当は別の方法も模索したいんですが、諸事情により必ず入っているPowerShellと（ほぼ必ず入っている）Wordを使う方法を取っています…~~

:::note warn
例のごとく、寝かせていたら、数か月そのままになってしまっていたので、現時点で公開することにしました。適宜追記したいと思います。
:::

# 備忘録
## Wordファイルを開く


```PowerShell:ファイルを開く
$word = New-Object -ComObject Word.Application
$word.Visible = $true #画面に表示させたい時
$FileName = "sample.docx"
$FullPath = (Get-Childitem -Path $FileName).FullName
$doc = $word.Documents.Open($FullPath)
```

```PowerShell:ファイルを新規作成
$word = New-Object -ComObject Word.Application
$word.Visible = $true #画面に表示させたい時
$doc = $word.Documents.Add()
```

<!--## スタイルの適用-->


## ページ設定
```PowerShell:PageSetup
#ページの向き
$doc.PageSetup.Orientation = 1 #既定は0で縦向き、1で横向き

# 余白
## 標準
$doc.PageSetup.TopMargin = 99.25
$doc.PageSetup.BottomMargin = 85.05
$doc.PageSetup.LeftMargin = 85.05
$doc.PageSetup.RightMargin = 85.05

## やや狭い
$doc.PageSetup.TopMargin = 72
$doc.PageSetup.BottomMargin = 72
$doc.PageSetup.LeftMargin = 54
$doc.PageSetup.RightMargin = 54

```




## 入力関係

```PowerShell:テキスト入力
$doc.Paragraphs(1).Range.Text = "第１段落のテキスト"#パラグラフのテキストを設定
$doc.Paragraphs(1).Range.InsertAfter("`r`n")#段落最後に改段落を挿入（パラグラフの追加）（WordでのEnter）
$doc.Paragraphs(1).Range.InsertBefore("`t")#段落頭にタブを挿入
$doc.Paragraphs(1).Range.InsertAfter("`v")#段落最後に改行を挿入（WordでのShift+Enter）

```

## フォント周り

```PowerShell:フォント等
下線・アンダーライン
$doc.Paragraphs(10).Range.Underline = 1
#1 下線、2 空白以外下線、3 二重線、4 点線、6 太い下線、7 破線、9 一点鎖線、10二点鎖線、11波線

$fontSerif = "BIZ UDP明朝 Medium" #変数にフォント名を入れる。
#Range.Font.Nameで設定
$doc.Paragraphs(10).Range.Font.Name = "$fontSerif"
```

```PowerShell:フォントの色
# Colorで設定する方法
$doc.Paragraphs(1).Range.Text.Font.Color = 16776960 #wdTurquoise
$doc.Paragraphs(1).Range.Text.Font.Color = -16777216 #wdColorAutomatic（通常は黒）
# ColorIndexで設定する方法
$doc.Paragraphs(1).Range.Text.Font.ColorIndex = 3 #wdTurquoise
$doc.Paragraphs(1).Range.Text.Font.ColorIndex = 0 #wdAuto（通常は黒）

```
* Colorでの指定は、[WdColor](https://learn.microsoft.com/ja-JP/office/vba/api/Word.WdColor)にある10進数で行う。
    * RGB値で指定する場合は、「R + G * 256 + B * 256 * 256」で計算した値を用いることもできる模様。

https://help-vba.com/rgb-color/

    
* ColorIndexでの指定は、[WdColorIndex](https://learn.microsoft.com/ja-jp/office/vba/api/Word.WdColorIndex)にある値で指定する。


## 表

```PowerShell:表の挿入など
# 10行目に、3×3の表を挿入する
$newTable = $doc.Tables.Add($doc.Paragraphs(10).Range(), 3, 3)

# 表のスタイルの変更
$newTable.Style = "表 (格子)"

# 表全体のフォントの変更
$newTable.Range().Font.Name = "BIZ UDPゴシック"
$newTable.Range().Font.Size = 9
# 表のセルのフォントの変更
$newTable.Cell(1,1).Range.Font.name = "BIZ UDPゴシック"

# セルへのテキスト入力
$newTable.Cell(1,1).Range().Text = "1列1行目"

# セルのテキスト末尾に改段落を追加
$newTable.Cell(1,1).Range().InsertParagraphAfter()

# セルのテキスト末尾にテキストを追加
$newTable.Cell(1,1).Range().InsertAfter("追加のテキスト")

# セルの結合
$newTable.Cell(1,1).Merge($newTable.Cell(1,3)) #結合の開始セルと終了セルを指定する

# 表の位置
## 基準
$newTable.Rows.RelativeVerticalPosition = 0 #0がページ余白、1がページ、2が段落（文字列と一緒に移動する）

# セルのテキストの向き
$newTable.Cell(1,1).Range.Orientation = 0 #0で横書き、1で縦書き

# セルの文字の揃え
## 縦
## 0上揃え:wdCellAlignVerticalTop
## 1中央揃え:wdCellAlignVerticalCenter
## 3下揃え:wdCellAlignVerticalBottom
$newTable.Cell(1,1).Range.Cells.VerticalAlignment = 0

## 横
## 0左揃え: wdAlignParagraphLeft
## 1中央揃え: wdAlignParagraphCenter
## 2右揃え：wdAlignParagraphRight
## 3両端揃え: wdAlignParagraphJustify
## 4均等割り付け: wdAlignParagraphDistribute
$newTable.Cell(1,1).Range.ParagraphFormat.Alignment = 3


```

## 保存用ダイアログ

```PowerShell:ファイルダイアログを開く
# Bing AIに聞きつつ調べました
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$dialog = New-Object System.Windows.Forms.SaveFileDialog
$dialog.Filter = "Wordファイル (*.docx)|*.docx" #ファイル形式の指定
$dialog.InitialDirectory = (Get-Location).Path #初期ディレクトリの指定（現在のディレクトリ）
$dialog.FileName = "既定のファイル名.docx"
if($dialog.ShowDialog() -eq "OK"){
    $dialog.FileName
}

```

### 参考
Bing AIに聞きつつ調べて、微修正しました。
Bing AIが参照したのは以下のページです。

https://news.mynavi.jp/techplus/article/natonakucommand-43/

## 終了する
```PowerShell:ファイルを閉じて、終了する
$doc.Close()
$word.Quit()
```

```PowerShell:オブジェクトのリリース
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($doc) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($word) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($range) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($table) | Out-Null

# 解放する変数
Remove-Variable doc,word, range, table

# ガベージコレクション
[gc]::collect()
[gc]::WaitForPendingFinalizers()
```

### 参考
https://devblogs.microsoft.com/scripting/use-powershell-to-add-table-to-word-doc-and-email-as-attachment/


# notes
* 2024-05-06 公開