この記事について
以前、PowerShellでExcelをいじる方法を書き留めましたが、今回Wordから情報を抜いてくる方法を調べる際に、同様にWordもPowerShellで操作できないか、試してみました。
本当は別の方法も模索したいんですが、諸事情により必ず入っているPowerShellと(ほぼ必ず入っている)Wordを使う方法を取っています…
例のごとく、寝かせていたら、数か月そのままになってしまっていたので、現時点で公開することにしました。適宜追記したいと思います。
備忘録
Wordファイルを開く
ファイルを開く
$word = New-Object -ComObject Word.Application
$word.Visible = $true #画面に表示させたい時
$FileName = "sample.docx"
$FullPath = (Get-Childitem -Path $FileName).FullName
$doc = $word.Documents.Open($FullPath)
ファイルを新規作成
$word = New-Object -ComObject Word.Application
$word.Visible = $true #画面に表示させたい時
$doc = $word.Documents.Add()
ページ設定
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
入力関係
テキスト入力
$doc.Paragraphs(1).Range.Text = "第1段落のテキスト"#パラグラフのテキストを設定
$doc.Paragraphs(1).Range.InsertAfter("`r`n")#段落最後に改段落を挿入(パラグラフの追加)(WordでのEnter)
$doc.Paragraphs(1).Range.InsertBefore("`t")#段落頭にタブを挿入
$doc.Paragraphs(1).Range.InsertAfter("`v")#段落最後に改行を挿入(WordでのShift+Enter)
フォント周り
フォント等
下線・アンダーライン
$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"
フォントの色
# 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にある10進数で行う。
- RGB値で指定する場合は、「R + G * 256 + B * 256 * 256」で計算した値を用いることもできる模様。
- ColorIndexでの指定は、WdColorIndexにある値で指定する。
表
表の挿入など
# 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
保存用ダイアログ
ファイルダイアログを開く
# 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が参照したのは以下のページです。
終了する
ファイルを閉じて、終了する
$doc.Close()
$word.Quit()
オブジェクトのリリース
[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()
参考
notes
- 2024-05-06 公開