Editar Varios Documentos Word con PowerShell
Editar Varios Documentos Word con PowerShell

Cómo Editar Uno o Varios Documentos Word con PowerShell

En este tutorial, vamos a aprender a editar documentos de Word (Microsoft Office) a través de PowerShell utilizando marcadores. ¡Es un truco que puede ahorrar tiempo en muchas situaciones! Las operaciones realizadas en este tutorial no requieren el uso de un módulo adicional de PowerShell.

Office: Marcadores en Word

Empecemos con un breve recordatorio sobre los marcadores en Office Word. Un marcador en Word te permite marcar un lugar que quieres encontrar fácilmente. Puedes crear tantos marcadores como quieras en tu documento, y puedes darles un nombre único para poder identificarlos fácilmente. En nuestro contexto, vamos a utilizar marcadores para marcar el lugar donde nuestro script/comando PowerShell debe insertar información específica.

Por ejemplo, utilizaremos un marcador AUTOR que estará presente en varios documentos; nuestro script podrá abrir estos documentos, encontrar el marcador e insertar los datos deseados, todo automáticamente. Para manejar eficazmente los marcadores, lo mejor es hacerlos visibles primero en Word. Para ello, ve a “ARCHIVO” y luego a “Opciones“, entra en la pestaña “Opciones avanzadas” y marca “Mostrar marcadores“:

Opciones Avanzadas y Mostrar marcadores en Word
Opciones Avanzadas y Mostrar marcadores en Word

Ahora vamos a añadir un marcador al final de una línea AUTOR. Una vez que hayamos colocado el cursor donde queremos añadir el marcador, vamos a “INSERTAR” y luego a “Marcador“, damos a nuestro marcador el nombre que queramos (y no lo olvidemos) y luego hacemos clic en “Añadir“:

Agregar Marcador en documento de Word
Agregar Marcador en documento de Word
Ejemplo de marcador mostrado en Word
Ejemplo de marcador mostrado en Word

Ahora podemos ver nuestro marcador por una marca específica en nuestro documento. También podemos volver a nuestro menú “Marcador” y utilizar el botón “Ir a” para encontrar un marcador concreto (en el caso de un documento grande en el que se utilicen varios marcadores). También hay que tener en cuenta que el mismo marcador puede insertarse en varios lugares de un documento, lo que significa que la misma información puede modificarse varias veces sin error.

Abrir y Cerrar un Documento Word con PowerShell

Una vez colocado nuestro marcador, vamos a aprender a manipular un documento de Word con PowerShell. Para empezar, necesitamos abrir un documento y cerrarlo, guardando cualquier cambio. Aquí están las líneas de código en cuestión, con comentarios:

# Ruta a nuestro archivo Word
$docfile = "C:Users\WDC\Desktop\Documento.docx"
# Creación de un objeto COM Word.Application
$Word = New-Object -comobject Word.Application
$Word.Visible = $False

# Abrir un documento Word
$document = $Word.Documents.Open($docfile)

#[Código de manipulación/lectura/modificación]

# Guardar los cambios en el archivo especificado
$document.SaveAs($docfile)
# Cerrar el documento
$document.Close()
# Cerrar la aplicación
$Word.Quit()

Nota

Recuerda cambiar el C:Users\WDC\Desktop\Documento.docx por la ubicación de tu archivo .docx/

Si insertas estas líneas en un script .ps1, verás que no pasa gran cosa. Nada sorprendente por el momento :).

Word: Insertar Texto en un Marcador usando PowerShell

Ahora vamos a insertar unas líneas entre las instrucciones anteriores para insertar datos en el marcador llamado AUTOR :

# Contenido de los datos a insertar
$data="Alex"

# Nombre del marcador a modificar
$signet = "AUTOR"
# Eliminación de los saltos de línea
$data = $data.Trim() 
# Buscar el marcador a modificar en el documento
$bookmark = $document.Bookmarks | Where-Object -FilterScript { $_.Name -eq $signet }
$bookmarkToModify = $bookmark.Range
# Insertar datos en el marcador
$bookmarkToModify.Text = $data

Como recordatorio, estas instrucciones deben insertarse en la ubicación [Código de manipulación/lectura/modificación] del fragmento de código visto anteriormente (Abrir y Cerrar un Documento Word con PowerShell).

Visualización del editor de código PowerShell
Visualización del editor de código PowerShell

Cuando se ejecute el script, si consultas el documento Word de destino, el contenido deseado se habrá insertado en la ubicación del marcador AUTOR. Este valor corresponde a la variable $data del código anterior.

Ejemplo de Insertar Texto en Marcador de Word con PowerShell
Ejemplo de Insertar Texto en Marcador de Word con PowerShell

Si tienes varios marcadores diferentes en tu documento, simplemente repite la operación con un nombre de marcador diferente (variable $signet).

Generar Documentos Word a partir de Plantillas

Ahora que ya sabemos cómo hacerlo, podemos plantearnos casos de uso más realistas. Por ejemplo, cuando se crea un nuevo proyecto en una empresa, es necesario inicializar varios documentos:

  • un documento de presentación del proyecto (presentation.docx),
  • un documento con la lista de las personas implicadas en el proyecto (stakeholders.docx),
  • un documento que enumere las compras que hay que hacer para poner en marcha el proyecto (compras.docx).

Todos estos documentos tendrán un contenido diferente, pero algunas informaciones serán comunes:

  • el autor: el director del proyecto,
  • la fecha: la fecha de creación del proyecto,
  • el destinatario: el nombre de nuestro cliente.
Plantilla de documentos con Marcadores en Word
Plantilla de documentos con Marcadores en Word

Introducir esta información manualmente en varios documentos lleva mucho tiempo y es fuente de errores. Necesitamos crear un script que genere una estructura de árbol para un nuevo proyecto e inserte la información que se puede insertar en cada documento. Por lo tanto, vamos a crear un pequeño árbol de archivos en una carpeta llamada “modelos” y un script que tomará como entrada

  • el nombre del proyecto
  • la fecha de creación deseada
  • el nombre del autor
  • el nombre del cliente.
Estructura de ejemplo de modelos de marcadores Word
Estructura de ejemplo de modelos de marcadores Word (la pantalla de terminal lo veremos a continuación)

A continuación, este script PowerShell (lo llamaremos PlantillaWordPS.ps1) inicializará todos los documentos de nuestro proyecto e insertará los datos en los marcadores correspondientes:

# Parámetros
param ( [string] $autor, [string] $date, [string] $client, [string] $nom)

# Función para escribir datos en el marcador del objeto "$doc" pasado como parámetro.
function modifySignet{
  param($doc,$key,$value)
  # Nombre del marcador a modificar
  $signet = $key 
  # Buscar el marcador a modificar en el documento
  $bookmark = $document.Bookmarks | Where-Object -FilterScript { $_.Name -eq $signet }
  $bookmarkToModify = $bookmark.Range
  # Insertar datos en el marcador
  $bookmarkToModify.Text = $value.Trim()
  return $doc
}

# Función para generar el documento a partir de la plantilla
function createDoc {
  param ($i, $o, $d, $c, $a)
  # Creación de un objeto COM Word.Application
  $Word = New-Object -comobject Word.Application
  $Word.Visible = $False

  # Abrir el archivo
  $document = $Word.Documents.Open($i)
  Write-host " [+] Inserción de datos en marcadores"
  # Llamada a nuestra función para insertar datos en el marcador
  $document = modifySignet -doc $document -key "AUTOR" -value $a
  $document = modifySignet -doc $document -key "DATE" -value $d
  $document = modifySignet -doc $document -key "CLIENT" -value $c

  # Guardar los cambios en el archivo especificado
  $document.SaveAs($o)
  # Cerrar el documento
  $document.Close()
  # Cerrar la aplicación
  $Word.Quit()
}

# Creación del directorio del proyecto
Write-Host "[+] Generación de directorios del proyecto"$nom
New-Item -itemtype directory -name $nom | Out-Null

# Para cada fichero del directorio "modelos"
Get-ChildItem .\modelos\ |foreach {
  Write-host "[+] Generación del archivo"$_.Name"a partir de la plantilla"
  # Ruta a nuestro archivo Word
  $infile = (Resolve-Path ".").Path.Replace('Microsoft.PowerShell.Core\FileSystem::', '') +"\modelos\"+$_.Name
  $outfile= (Resolve-Path ".").Path.Replace('Microsoft.PowerShell.Core\FileSystem::', '') +"\"+$nom+"\"+$_.Name
  # Llamada a la función de modificación de marcadores
  createDoc -i $infile -o $outfile -d $date -c $client -a $autor
}

Nota

Recuerda cambiar AUTOR, FECHA y CLIENTE por los nombres de marcadores de tus archivos. Además, cambia el nombre modelos por el nombre de tu carpeta. También puedes seguir nuestro ejemplo para comprobar que todo funciona correctamente.

Además del código ya presentado, este proyecto también incluye líneas de código para crear el directorio del proyecto y navegar por la carpeta “modelos” para encontrar todos los documentos a copiar en el directorio de nuestro proyecto, además de líneas para gestionar los parámetros. El script se utilizará de la siguiente manera:

> .\PlantillaWordPS.ps1 -nom ProyectoXY -autor "Alex" -date "10/07/2023" -client "MSWORD"
[+] Generación de directorios del proyecto ProyectoXY
[+] Generación del archivo Adquisicion_proyecto.doc a partir de la plantilla
       [+] Inserción de datos en marcadores 
[+] [+] Generación del archivo Interesados_proyecto.docx a partir de la plantilla 
       [+] Inserción de datos en marcadores 
[+] Generación del archivo Presentación_proyecto.doc a partir de la plantilla
       [+] Inserción de datos en marcadores
Generar Documentos Word con script PowerShell
Generar Documentos Word con script PowerShell

Después de ejecutar este script, obtendré un directorio project342 con los documentos deseados rellenados previamente con los marcadores indicados:

Generación de documentos Word con marcadores y PowerShell
Generación de documentos Word con marcadores y PowerShell

Por supuesto, esto es sólo un ejemplo para mostrar lo que se puede conseguir en contextos más reales :).