es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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”.

Tags:  ,

Answer

  1. Avatar for 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 objeto Range. Puedes utilizar el método Find del objeto Range para buscar las cadenas en los archivos .docx. Luego, puedes utilizar la propiedad Font del objeto Range 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 objeto Range aquí.

Comments are closed.