使用PowerShell修改Word文档中形状内的字体
解决PowerShell修改Word文档所有字体(含文本框、目录)的问题
你的脚本仅能修改正文是因为Word里的文本框属于独立的Shapes对象,目录则是特殊的域(Field)结构,需要单独处理。以下是修改后的完整脚本,覆盖正文、文本框、目录的字体修改:
$WordExts = '.docx','.doc','.docm' $Word = New-Object -ComObject Word.Application $Word.Visible = $false $folder = Get-ChildItem $PSScriptRoot | Where-Object {$_.Extension -in $WordExts} foreach ($file in $folder){ Write-Host "处理文件: $($file.FullName)" $worddoc = $Word.Documents.Open($file.FullName) # 1. 修改正文所有文本字体 $worddoc.Select() $Word.Selection.Font.Name = "Arial" # 2. 修改所有文本框内的字体 foreach ($shape in $worddoc.Shapes) { if ($shape.HasTextFrame -and $shape.TextFrame.HasText) { $shape.TextFrame.TextRange.Font.Name = "Arial" } } # 3. 修改目录字体(含更新目录+修改样式) foreach ($field in $worddoc.Fields) { if ($field.Type -eq [Microsoft.Office.Interop.Word.WdFieldType]::wdFieldTOC) { # 可选:更新目录内容到最新状态 $field.Update() # 修改目录结果的字体 $field.Result.Font.Name = "Arial" # 更彻底:修改目录对应的样式(影响所有同级目录项) $worddoc.Styles.Item("目录 1").Font.Name = "Arial" $worddoc.Styles.Item("目录 2").Font.Name = "Arial" $worddoc.Styles.Item("目录 3").Font.Name = "Arial" } } # 可选:修改页眉页脚字体 foreach ($section in $worddoc.Sections) { # 处理页眉 foreach ($header in $section.Headers) { if ($header.Range.Text.Trim() -ne "") { $header.Range.Font.Name = "Arial" } } # 处理页脚 foreach ($footer in $section.Footers) { if ($footer.Range.Text.Trim() -ne "") { $footer.Range.Font.Name = "Arial" } } } # 保存并关闭文档 $worddoc.Save() $worddoc.Close() [System.Runtime.Interopservices.Marshal]::ReleaseComObject($worddoc) | Out-Null } $Word.Quit() [System.Runtime.Interopservices.Marshal]::ReleaseComObject($Word) | Out-Null [System.GC]::Collect() [System.GC]::WaitForPendingFinalizers()
关键部分说明:
- 文本框处理:遍历文档的
Shapes集合,判断每个形状是否包含可编辑文本框,通过TextFrame.TextRange直接修改字体。 - 目录处理:
- 先识别目录域(
wdFieldTOC类型),可选调用Update()刷新目录内容; - 直接修改目录结果的字体,或者修改对应的目录样式(推荐,因为样式会统一控制所有同级别目录项的格式)。
- 先识别目录域(
- COM对象释放:添加了
ReleaseComObject和垃圾回收操作,避免Word进程残留。
内容的提问来源于stack exchange,提问作者Emma G
相关产品推荐
相关产品推荐

