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).

VisualizacioŐĀn del editor de coŐĀdigo PowerShell
VisualizacioŐĀn del editor de coŐĀ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 :).