如何使用PowerShell修改docx中匹配Excel词表的字符串字体颜色
解决方案
需修正的问题点
- 原代码打开Word文档时第三个参数设为
$true,是只读模式,修改后无法写入保存 - 未配置查找替换的格式规则,无法实现仅修改匹配文本颜色的需求
- 缺少处理完成后保存、关闭文档的逻辑,修改不会生效
- 变量名拼写错误:
$MatchWholeWorld应为$MatchWholeWord,会导致整词匹配参数失效
完整修改后的代码
# 加载窗体类用于选择目录 Add-Type -AssemblyName System.Windows.Forms $fwd = New-Object System.Windows.Forms.FolderBrowserDialog $null = $fwd.ShowDialog() $path = $fwd.SelectedPath $files = Get-ChildItem -Path $path| Where-Object -Property Extension -Match "\.docx?$" # 导入Excel关键词表,需提前安装ImportExcel模块:Install-Module -Name ImportExcel -Scope CurrentUser $forbiddenWordsFilePath = "<<Path_To_XLSX>>" $forbiddenWords= Import-Excel -Path $forbiddenWordsFilePath $WordApp = New-Object -ComObject Word.Application $WordApp.visible = $false # 固定查找替换参数 $MatchCase = $false $MatchWholeWord = $true # 修正原拼写错误 $MatchWildcards = $false $MatchSoundsLike = $false $MatchAllWordForms = $false $Forward = $true # 设为true从文档开头向后搜索 $Wrap = 1 # wdFindContinue = 1 匹配到文档末尾后继续从头查找 $Format = $true $wdReplaceAll = 2 foreach ($file in $files) { # 备份原文件 $fileBackupPath= $file.FullName + "_bck" Copy-Item $file.FullName -Destination $fileBackupPath # 打开文档,第三个参数设为$false表示非只读,可写入修改 $doc = $WordApp.Documents.Open($file.FullName, [type]::Missing, $false) foreach ($word in $forbiddenWords){ # 配置查找规则 $find = $doc.Content.Find $find.ClearFormatting() # 配置替换规则:仅修改字体颜色,不改动原文内容 $find.Replacement.ClearFormatting() $find.Replacement.Font.ColorIndex = 6 # 6对应红色,可自行修改颜色值 # 执行查找替换,替换内容和查找内容一致,仅修改格式 $find.Execute( $word.Search_Pattern, $MatchCase, $MatchWholeWord, $MatchWildcards, $MatchSoundsLike, $MatchAllWordForms, $Forward, $Wrap, $Format, $word.Search_Pattern, # 替换内容和搜索内容一致,保留原文 $wdReplaceAll ) } # 保存修改并关闭文档 $doc.Save() $doc.Close() [System.Runtime.InteropServices.Marshal]::ReleaseComObject($doc) | Out-Null } # 清理Word COM对象,避免残留进程 $null = [System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$WordApp) [gc]::Collect() [gc]::WaitForPendingFinalizers() Remove-Variable WordApp
颜色自定义说明
代码中ColorIndex为Word内置颜色枚举,常用取值参考:
- 红色:6
- 蓝色:2
- 绿色:4
- 黄色:7
- 黑色:1
- 白色:8
如果需要使用自定义RGB颜色,可将颜色设置行替换为:
$find.Replacement.Font.Color = [System.Drawing.Color]::FromArgb(红数值,绿数值,蓝数值).ToArgb()
例如设置为橙色RGB(255,165,0),就写为:
$find.Replacement.Font.Color = [System.Drawing.Color]::FromArgb(255,165,0).ToArgb()
内容的提问来源于stack exchange,提问作者JHonrubia
相关产品推荐
相关产品推荐

