¿Cómo puedo cambiar el color de una lista de palabras específicas dentro de un archivo docx?
Estoy configurando un script de Powershell que, al pasar la ruta a un directorio, verifica si alguna de las cadenas contenidas en un archivo de Excel aparece en los archivos doc o docx en ese directorio. Si es así, el color de esa cadena debe cambiarse en el archivo doc/docx.
He estado probando con el objeto COM de Word durante un tiempo y no he podido hacer que funcione.
Esto es lo que tengo hasta ahora:
Abrir un navegador de carpetas para seleccionar la carpeta a procesar
$fwd = New-Object System.Windows.Forms.FolderBrowserDialog
$null = $fwd.ShowDialog()
$path = $fwd.SelectedPath
$files = Get-ChildItem -Path $path| Where-Object -Property Extension -Match ".docx?"
Cargar los datos del archivo de Excel en un objeto de arraylist para una posterior iteración
$forbiddenWordsFilePath = "<<ruta hacia="" xlsx="">>"
$forbiddenWords= Import-Excel -Path $forbiddenWordsFilePath
$WordDoc = New-Object -ComObject Word.Application
$WordDoc.visible=$false
Iterar sobre los archivos contenidos en la carpeta
foreach ($file in $files) {
Hacer una copia de seguridad del archivo docx previo a trabajar con él
$fileBackupPath= $file.FullName+"_bck"
Copy-Item $file.FullName -Destination $fileBackupPath
Abre el archivo docx en segundo plano
$doc = $WordDoc.Documents.Open($file.FullName,[type]::Missing,$true)
$MatchCase = $false
$MatchWholeWorld = $true
$MatchWildcards = $false
$MatchSoundsLike = $false
$MatchAllWordForms = $false
$Forward = $false
$Wrap = 1
$Format = $true
$wdReplaceAll = 2
Iterar sobre la lista de palabras y buscarlas en el archivo docx
foreach ($word in $forbiddenWords){
$Replace=$word.SearchPattern
$doc.Content.Find.Execute($word.SearchPattern, $MatchCase, $MatchWholeWorld, $MatchWildcards, $MatchSoundsLike, $MatchAllWordForms, $Forward, $Wrap, $Format, $Replace, $wdReplaceAll)
}
}
Limpiar cualquier proceso de Microsoft Word abierto
$null = [System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$WordDoc)
Remove-Variable WordDoc
Está claro para mí que el cambio de color debería estar en el segundo foreach. Pero no puedo encontrar el código que me permita hacerlo.
Soy un poco novato en tratar con el objeto COM de Word con Powershell.
El archivo de Excel tiene las siguientes cabeceras:
Tipo de control Control Comentarios Patron de búsqueda
En caso de haber dudas sobre cómo obtener la propiedad “Search_word”.
davy.ai
Parece que estás intentando utilizar el objeto COM de Microsoft Word para buscar cadenas de texto en un directorio de archivos
.docx
y cambiar el color de esas cadenas. Ya has configurado el código para abrir la carpeta, cargar los datos del archivo Excel en un objeto ArrayList y recorrer los archivos en la carpeta.Para cambiar el color de las cadenas, puedes utilizar la propiedad
Font
del objetoRange
. Puedes utilizar el métodoFind
del objetoRange
para buscar las cadenas en los archivos.docx
. Luego, puedes utilizar la propiedadFont
del objetoRange
para cambiar el color de las cadenas. Aquí tienes un ejemplo de cómo hacerlo:$range = $doc.Content.Find.Execute($word.Search_Pattern, $MatchCase, $MatchWholeWorld, $MatchWildcards, $MatchSoundsLike, $MatchAllWordForms, $Forward, $Wrap, $Format, $Replace, $wdReplaceAll)
$range.Font.ColorIndex = 5
Puedes encontrar más información sobre la propiedad
Font
del objetoRange
aquí.