{"id":535,"date":"2024-04-03T19:15:18","date_gmt":"2024-04-03T19:15:18","guid":{"rendered":"https:\/\/datacrazyworld.com\/?p=535"},"modified":"2024-04-03T19:15:19","modified_gmt":"2024-04-03T19:15:19","slug":"genera-documentos-word-con-powershell","status":"publish","type":"post","link":"https:\/\/datacrazyworld.com\/index.php\/2024\/04\/03\/genera-documentos-word-con-powershell\/","title":{"rendered":"Genera documentos Word con PowerShell"},"content":{"rendered":"\n<p>\u00bfConoces PowerShell? Es una herramienta que viene ya instalada en todos los Windows que te permite automatizar muchas cosas y te permite hacer cosas que ni imaginar\u00edas. Eso s\u00ed, es para nost\u00e1lgicos del MS-DOS o l\u00ednea de comandos, como yo \ud83d\ude0a.<\/p>\n\n\n\n<p>Uno de mis \u00faltimos grandes descubrimientos, como siempre creado por la necesidad, ha sido que puedes generar un script de PowerShell que genere autom\u00e1ticamente un documento Word y lo vas completando con el contenido que quieras.<\/p>\n\n\n\n<p>Ya puse un ejemplo en mi post: <em><a href=\"https:\/\/datacrazyworld.com\/index.php\/2023\/07\/31\/como-documentar-tu-etl-del-ssis-con-powershell\" title=\"\">C\u00f3mo documentar tu ETL del SSIS con PowerShell<\/a><\/em> pero ahora quiero poner los comandos de forma m\u00e1s expl\u00edcita, ya que, para algunas cosas ,como personalizar la portada, la documentaci\u00f3n escasea.<\/p>\n\n\n\n<p>Voy a empezar desde el principio: Los scripts los puedes escribir en un notepad o donde quieras y si los guardas como con la extensi\u00f3n <em>ps1<\/em> Windows detecta que es un script de Powershell y te da la opci\u00f3n a lanzarlo. Otra opci\u00f3n, es utilizar el programa \u00abWindows PowerShell ISE\u00bb que incorpora el editor y la l\u00ednea comandos, o directamente la l\u00ednea de comandos abriendo \u00abWindows PowerShell\u00bb. Una vez, conocido esto, voy con lo que nos trae a este post: crear un documento word.<\/p>\n\n\n\n<p>Lo primero es configurar y crear el documento Word. Lo \u00fanico que hay que indicar es la url donde se quiere ubicar y si se quiere que se vea o no mientras se genera.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>###############################################################################################\n# Datos a rellenar\n# $docfile --&gt; Url donde se dejara el documento\n###############################################################################################\n\n#Configuraci\u00f3n del documento Word\n#url\n$docfile = \"C:\\Test\\EjemDoc.docx\"\n#Creamos instancia del objeto word\n$MSWord = New-Object -ComObject Word.Application\n#Lo hacemos visible\n$MSWord.Visible = $True\n#Creamos nuevo documento\n$mydoc = $MSWord.Documents.Add() \n<\/code><\/pre>\n\n\n\n<p>A continuaci\u00f3n, y de manera opcional, se pueden rellenar algunas de las propiedades del documento. Esto viene bien para rellenar ciertos par\u00e1metros autom\u00e1ticos a posteriori.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#Rellenamos algunas propiedades del documento.\n#T\u00edtulo\n$comObject = $mydoc.BuiltInDocumentProperties(\"Title\")\n$binding = \"System.Reflection.BindingFlags\" -as &#91;type]\n&#91;System.__ComObject].invokemember(\"Value\",$binding::SetProperty,$null,$comObject,\"Ejemplo de doc con PowerShell\")\n\n#Compa\u00f1ia - Empresa\n$comObject = $mydoc.BuiltInDocumentProperties(\"Company\")\n$binding = \"System.Reflection.BindingFlags\" -as &#91;type]\n&#91;System.__ComObject].invokemember(\"Value\",$binding::SetProperty,$null,$comObject,\"Data Crazy World\")\n\n#Autor\n$comObject = $mydoc.BuiltInDocumentProperties(\"Author\")\n$binding = \"System.Reflection.BindingFlags\" -as &#91;type]\n&#91;System.__ComObject].invokemember(\"Value\",$binding::SetProperty,$null,$comObject,\"Cristina Tarabini-Castellani\") \n<\/code><\/pre>\n\n\n\n<p>\u00a1Y ahora la portada!. Se puede construir a mano una, pero es m\u00e1s sencillo utilizar alguna de las plantillas que se incorporan por defecto en el Word. Las diferentes portadas que te ofrecen son:<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"657\" height=\"926\" data-id=\"543\" src=\"https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Con_bandas.png\" alt=\"\" class=\"wp-image-543\" srcset=\"https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Con_bandas.png 657w, https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Con_bandas-213x300.png 213w\" sizes=\"auto, (max-width: 657px) 100vw, 657px\" \/><figcaption class=\"wp-element-caption\">Con Bandas<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"642\" height=\"913\" data-id=\"546\" src=\"https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Cortar_oscuro.png\" alt=\"\" class=\"wp-image-546\" srcset=\"https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Cortar_oscuro.png 642w, https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Cortar_oscuro-211x300.png 211w\" sizes=\"auto, (max-width: 642px) 100vw, 642px\" \/><figcaption class=\"wp-element-caption\">Cortar (oscuro)<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"663\" height=\"919\" data-id=\"538\" src=\"https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Faceta.png\" alt=\"\" class=\"wp-image-538\" srcset=\"https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Faceta.png 663w, https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Faceta-216x300.png 216w\" sizes=\"auto, (max-width: 663px) 100vw, 663px\" \/><figcaption class=\"wp-element-caption\">Faceta<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"659\" height=\"914\" data-id=\"544\" src=\"https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Filigrana.png\" alt=\"\" class=\"wp-image-544\" srcset=\"https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Filigrana.png 659w, https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Filigrana-216x300.png 216w\" sizes=\"auto, (max-width: 659px) 100vw, 659px\" \/><figcaption class=\"wp-element-caption\">Filigrana<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"810\" height=\"941\" data-id=\"547\" src=\"https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Integral.png\" alt=\"\" class=\"wp-image-547\" srcset=\"https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Integral.png 810w, https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Integral-258x300.png 258w, https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Integral-768x892.png 768w\" sizes=\"auto, (max-width: 810px) 100vw, 810px\" \/><figcaption class=\"wp-element-caption\">Integral<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"578\" height=\"807\" data-id=\"539\" src=\"https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_ion_claro.png\" alt=\"\" class=\"wp-image-539\" srcset=\"https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_ion_claro.png 578w, https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_ion_claro-215x300.png 215w\" sizes=\"auto, (max-width: 578px) 100vw, 578px\" \/><figcaption class=\"wp-element-caption\">Ion (claro)<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"668\" height=\"922\" data-id=\"536\" src=\"https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_ion_oscuro.png\" alt=\"\" class=\"wp-image-536\" srcset=\"https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_ion_oscuro.png 668w, https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_ion_oscuro-217x300.png 217w\" sizes=\"auto, (max-width: 668px) 100vw, 668px\" \/><figcaption class=\"wp-element-caption\">Ion (oscuro)<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"659\" height=\"914\" data-id=\"540\" src=\"https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Retrospectiva.png\" alt=\"\" class=\"wp-image-540\" srcset=\"https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Retrospectiva.png 659w, https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Retrospectiva-216x300.png 216w\" sizes=\"auto, (max-width: 659px) 100vw, 659px\" \/><figcaption class=\"wp-element-caption\">Retrospectiva<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"669\" height=\"915\" data-id=\"541\" src=\"https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Semaforo.png\" alt=\"\" class=\"wp-image-541\" srcset=\"https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Semaforo.png 669w, https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Semaforo-219x300.png 219w\" sizes=\"auto, (max-width: 669px) 100vw, 669px\" \/><figcaption class=\"wp-element-caption\">Semaforo<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"678\" height=\"924\" data-id=\"537\" src=\"https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_slice_luz.png\" alt=\"\" class=\"wp-image-537\" srcset=\"https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_slice_luz.png 678w, https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_slice_luz-220x300.png 220w\" sizes=\"auto, (max-width: 678px) 100vw, 678px\" \/><figcaption class=\"wp-element-caption\">Slice (luz)<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"651\" height=\"915\" data-id=\"542\" src=\"https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Whisp.png\" alt=\"\" class=\"wp-image-542\" srcset=\"https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Whisp.png 651w, https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Whisp-213x300.png 213w\" sizes=\"auto, (max-width: 651px) 100vw, 651px\" \/><figcaption class=\"wp-element-caption\">Whisp<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"651\" height=\"914\" data-id=\"545\" src=\"https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Vista_principal.png\" alt=\"\" class=\"wp-image-545\" srcset=\"https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Vista_principal.png 651w, https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Vista_principal-214x300.png 214w\" sizes=\"auto, (max-width: 651px) 100vw, 651px\" \/><figcaption class=\"wp-element-caption\">Vista principal<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"601\" height=\"816\" data-id=\"548\" src=\"https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Movimiento.png\" alt=\"\" class=\"wp-image-548\" srcset=\"https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Movimiento.png 601w, https:\/\/datacrazyworld.com\/wp-content\/uploads\/2024\/04\/Portada_Movimiento-221x300.png 221w\" sizes=\"auto, (max-width: 601px) 100vw, 601px\" \/><figcaption class=\"wp-element-caption\">Movimiento<\/figcaption><\/figure>\n<\/figure>\n\n\n\n<p>Igual hay m\u00e1s, pero estas son las que he podido averiguar. Hay que tener en cuenta, que yo manejo la versi\u00f3n en espa\u00f1ol y por tanto los nombres est\u00e1n en espa\u00f1ol. Si manejas la versi\u00f3n en ingl\u00e9s, tendr\u00e1s que poner los nombres ingleses.<\/p>\n\n\n\n<p>Y ahora que ya te he hablado un poco de las opciones que hay, toca preparar la portada para a\u00f1adirla al documento.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#Preparamos la portada\n$CoverPage = 'Movimiento' #Nombre de la plantilla de la portada\n$Selection = $MSWord.application.selection   \n\n#Se coge la plantilla de la portada elegida\n$MSWord.Templates.LoadBuildingBlocks()\n$bb =$MSWord.templates | Where-Object -Property name -EQ -Value 'Built-In Building Blocks.dotx'\n\n$part = $bb.BuildingBlockEntries.item($CoverPage) \n<\/code><\/pre>\n\n\n\n<p>Con esto ya tendr\u00eda la portada, pero hay que tratarla un poco y este c\u00f3digo que incluyo a continuaci\u00f3n, es para personalizar la portada \u201cMovimiento\u201d. Si se escoge otra, habr\u00eda que estudiar c\u00f3mo personalizarla. En este c\u00f3digo, cambio la imagen y el color, adem\u00e1s de rellenar algunos de los textos que vienen en la portada.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#Tratamos la plantilla de portada elegida. \n######################### Esto es para la portada \"Movimiento\"\n$null = $part.Insert($MSWord.Selection.range, $true)   \n\n#Las 3 l\u00edneas verdes verticales. Les voy a cambiar el color a Rosa :)\n$Selection.Document.Shapes.Item(\"Grupo 78\").GroupItems&#91;1].Fill.ForeColor.Rgb = 16711847 ##ff00a7\n#El rect\u00e1ngulo grande verde. Tambi\u00e9n lo cambio a Rosa                                 \n$Selection.Document.Shapes.Item(\"Grupo 78\").GroupItems&#91;2].Fill.ForeColor.Rgb = 16711847 ##ff00a7\n\n#Borramos la imagen por defecto de la portada. No he sido capaz de sustituirla\n$Selection.Document.Shapes.Item('Imagen 1').Delete()\n\n#Creamos el nuevo Canva para recoger el logo y colocarla en el mismo lugar. Hay que configurar el tama\u00f1o\n$null = $Selection.Document.Shapes.AddCanvas(1, 1, 200, 107.5)\n$null = $Selection.Document.Shapes.Item('Lienzo 1').CanvasItems.AddPicture(\"C:\\DataCrazyWorld\\Logos DataCrazyWorld\\Elementos\\Logos\\Color_Small.png\", $false, $True, $null, $null, 200, 107.5)#439.2, 295.55\n$Selection.Document.Shapes.Item('Lienzo 1').Left =-999996\n$Selection.Document.Shapes.Item('Lienzo 1').Top = -999995\n$Selection.Document.Shapes.Item('Lienzo 1').Height = 107.5\n$Selection.Document.Shapes.Item('Lienzo 1').Width = 200\n$Selection.Document.Shapes.Item('Lienzo 1').Title = \"Logo\"\n$Selection.Document.Shapes.Item('Lienzo 1').AlternativeText = \"Imagen del logo\"\n$Selection.Document.Shapes.Item('Lienzo 1').RelativeHorizontalPosition = 1\n$Selection.Document.Shapes.Item('Lienzo 1').RelativeVerticalPosition = 1\n$Selection.Document.Shapes.Item('Lienzo 1').CanvasItems.PictureFormat\n\n#Reemplazamos la etiqueta &#91;A\u00f1o]\n$a\u00f1o = Get-Date -Format \"yyyy\"\n$Selection.Document.Shapes.Item(\"Grupo 78\").GroupItems&#91;3].TextFrame.TextRange.Text= $a\u00f1o #A\u00f1o\n\n#Reemplazamos la etiqueta &#91;Fecha]\n$fecha = Get-Date -Format \"dd\/MM\/yyyy\"\n$Texto = $Selection.Document.Shapes.Item(\"Grupo 78\").GroupItems&#91;4].TextFrame.TextRange.Text\n$Selection.Document.Shapes.Item(\"Grupo 78\").GroupItems&#91;4].TextFrame.TextRange.Text = $Texto.Replace(\"&#91;Fecha]\",$fecha) \n\n#########################Fin portada \"Movimiento\" \n\n<\/code><\/pre>\n\n\n\n<p>Tras la portada, viene el \u00edndice, as\u00ed que se puede crear una tabla de contenidos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#Metemos un salto de p\u00e1gina para incluir la tabla de contenidos\n$Selection = $MSWord.Selection\n$Selection.InsertBreak(&#91;Microsoft.Office.Interop.Word.WdBreakType]::wdSectionBreakNextPage)\n$Selection = $MSWord.Selection\n$range = $Selection.Range\t\n$toc = $mydoc.TablesOfContents.Add($range)\n$Selection.TypeParagraph()\n\n#Metemos un salto de p\u00e1gina para empezar a documentar\n$Selection.InsertBreak(&#91;Microsoft.Office.Interop.Word.WdBreakType]::wdSectionBreakNextPage) \n<\/code><\/pre>\n\n\n\n<p>Y a partir de aqu\u00ed ya es crear el contenido. Se pueden usar t\u00edtulos, listas, tablas\u2026 Aqu\u00ed ten\u00e9is algunos ejemplos<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#Creamos array de stilos para las cabeceras. Esto es opcional... me sirve para acortar luego los comandos\n$styles = @(\n        &#91;Microsoft.Office.Interop.Word.WdBuiltinStyle]::wdStyleHeading1\n    ,&#91;Microsoft.Office.Interop.Word.WdBuiltinStyle]::wdStyleHeading2\n    ,&#91;Microsoft.Office.Interop.Word.WdBuiltinStyle]::wdStyleHeading3\n    ,&#91;Microsoft.Office.Interop.Word.WdBuiltinStyle]::wdStyleHeading4\n    ,&#91;Microsoft.Office.Interop.Word.WdBuiltinStyle]::wdStyleHeading5\n    ,&#91;Microsoft.Office.Interop.Word.WdBuiltinStyle]::wdStyleHeading6\n    ,&#91;Microsoft.Office.Interop.Word.WdBuiltinStyle]::wdStyleHeading7\n    ,&#91;Microsoft.Office.Interop.Word.WdBuiltinStyle]::wdStyleHeading8\n    ,&#91;Microsoft.Office.Interop.Word.WdBuiltinStyle]::wdStyleHeading9\n    \n)\n\n#Configuramos la apariencia del documento a partir de aqu\u00ed\n$Section = $mydoc.Sections.Item(1)\n$Header = $Section.Headers.Item(1)\n$Footer = $Section.Footers.Item(1)\n$Footer.PageNumbers.Add()\n\n#Creamos una referencia al documento actual, para a\u00f1adirle el texto\n$myText = $MSWord.Selection\n\n#Ponemos el Titulo1\n$myText.Style = $styles&#91;0] #Titulo 1\n$myText.TypeText(\"Ejemplo de documento generado por PowerShell\")\n$myText.TypeParagraph()\n\n#Seguimos rellenando con texto normal\n$myText.TypeText(\"Rellenas el contenido que quieras\")\n$myText.TypeParagraph()\n\n#Ponemos el Titulo2\n$myText.Style = $styles&#91;1] #Titulo 2\n$myText.TypeText(\"Ejemplo t\u00edtulo 2\")\n$myText.TypeParagraph()\n\n#Hacemos una lista\n$myText.Style = &#91;Microsoft.Office.Interop.Word.WdBuiltinStyle]::wdStyleListBullet\n$myText.Font.Bold = 1\n$myText.TypeText('Tit. Lista: ')\n$myText.TypeParagraph()             \n$myText.Font.Bold = 0\n$myText.Style = &#91;Microsoft.Office.Interop.Word.WdBuiltinStyle]::wdStylePlainText\n$myText.TypeText('Detalle lista')\n$myText.TypeParagraph()  \n\n#Dejamos libre una l\u00ednea\n$myText.TypeParagraph()\n\n#Creamos una tabla\n$Range = @($myText.Paragraphs)&#91;-1].Range\n$Table = $myText.Tables.add(\n    $myText.Range #$Range\n    ,2 #Rows\n    ,3 #Columns\n    ,&#91;Microsoft.Office.Interop.Word.WdDefaultTableBehavior]::wdWord9TableBehavior\n    ,&#91;Microsoft.Office.Interop.Word.WdAutoFitBehavior]::wdAutoFitContent\n)\n## Cabecera de la Tabla\n$Table.cell(1,1).range.Bold=1\n$Table.cell(1,1).range.text = \"Columna 1\"\n$Table.cell(1,2).range.Bold=1\n$Table.cell(1,2).range.text = \"Columna 2\"\n$Table.cell(1,3).range.Bold=1\n$Table.cell(1,3).range.text = \"Columna 3\"\n\n#rellenamos la celda con la descripci\u00f3n de la columna cogida de BBDD\n$Table.cell(2,1).range.Bold = 0\n$Table.cell(2,1).range.text = 'Cont. Col1'\n$Table.cell(2,2).range.Bold = 0\n$Table.cell(2,2).range.text = 'Cont. Col2'\n$Table.cell(2,3).range.Bold = 0\n$Table.cell(2,3).range.text = 'Cont. Col3'\n\n#Para continuar escribiendo fuera de la tabla y dejar una linea\n$myText.Start= $mydoc.Content.End\n$myText.TypeParagraph() \n\n<\/code><\/pre>\n\n\n\n<p>Una vez terminado de introducir el contenido, hay que pedir que se actualice la tabla de contenidos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#Actualizamos el \u00edndice\t\n$toc.Update()\n<\/code><\/pre>\n\n\n\n<p>Y por \u00faltimo, hay que salvar el documento, cerrar y limpiar todo.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#Salvamos el documento Word\n$saveFormat = &#91;Microsoft.Office.Interop.Word.WdSaveFormat]::wdFormatDocumentDefault\n$mydoc.SaveAs(&#91;ref]&#91;system.object]$docfile, &#91;ref]$saveFormat)\n$mydoc.Close()\n$MSWord.Quit()\n\n# Limpiar el objeto Com\n$null = &#91;System.Runtime.InteropServices.Marshal]::ReleaseComObject(&#91;System.__ComObject]$MSWord)\nRemove-Variable MSWord \n<\/code><\/pre>\n\n\n\n<p>Dejo <a href=\"https:\/\/github.com\/DataCrazyWorld\/DataCrazyWorld\/blob\/main\/Posts\/RecopilacionComandosWordPS.ps1\" title=\"\">aqu\u00ed <\/a>,en el GitHub, toda esta recopilaci\u00f3n de comandos de PowerShell para crear documentos Word. <\/p>\n\n\n\n<p>Ahora te invito a imaginar todas las aplicaciones que puede tener. Ya puse un ejemplo, pero en los pr\u00f3ximos posts, pondr\u00e9 muchos m\u00e1s\u2026 como ya dije, iban a ser unos cuantos post relativos a la documentaci\u00f3n . Y a ti \u00bfqu\u00e9 se te ocurre? \u00a1Te leo!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Bibliograf\u00eda<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/learn-powershell.net\/2015\/01\/04\/creating-a-table-of-contents-in-word-using-powershell\/\">Creating a Table of Contents in Word Using PowerShell<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.rlvision.com\/blog\/read-write-ms-office-custom-properties-with-powershell\/\">Read &amp; Write MS Office custom properties with PowerShell<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/stackoverflow.com\/questions\/27781428\/how-to-change-custom-properties-for-many-word-documents\">How to change custom properties for many Word documents<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.erickscottjohnson.com\/blog--examples\/how-to-add-a-cover-page-to-word-with-powershell#comments\">https:\/\/www.erickscottjohnson.com\/blog&#8211;examples\/how-to-add-a-cover-page-to-word-with-powershell#comments<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/ss64.com\/ps\/syntax-word.html\">Automate Microsoft Word &#8211; PowerShell &#8211; SS64.com<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.powershellgallery.com\/packages\/WordDoc\/1.2.0\/Content\/WordDoc.psm1\">https:\/\/www.powershellgallery.com\/packages\/WordDoc\/1.2.0\/Content\/WordDoc.psm1<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/zloeber\/Powershell\/blob\/master\/Supplemental\/WordFunctions.ps1\">https:\/\/github.com\/zloeber\/Powershell\/blob\/master\/Supplemental\/WordFunctions.ps1<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.reddit.com\/r\/PowerShell\/comments\/be6tm5\/edit_a_word_template_with_variables_using\/\">Edit a Word template with variables using Powershell?<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/api\/microsoft.office.core.documentproperty?view=office-pia&amp;redirectedfrom=MSDN\">DocumentProperty Interface (Microsoft.Office.Core)<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/learn.microsoft.com\/en-us\/office\/vba\/api\/word.shape\">Shape object (Word)<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/ascott18\/PowershellGallery\/blob\/master\/Functions\/WordDocument.ps1\">https:\/\/github.com\/ascott18\/PowershellGallery\/blob\/master\/Functions\/WordDocument.ps1<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/learn.microsoft.com\/en-us\/office\/vba\/api\/word.shape.textframe\">Shape.TextFrame property (Word)<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>2\u00ba post sobre documentaci\u00f3n. Base para que la documentaci\u00f3n se genere con un solo clic.<\/p>\n","protected":false},"author":2,"featured_media":525,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[11],"tags":[35],"class_list":["post-535","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-powershell","tag-crazydocu"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/datacrazyworld.com\/index.php\/wp-json\/wp\/v2\/posts\/535","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/datacrazyworld.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/datacrazyworld.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/datacrazyworld.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/datacrazyworld.com\/index.php\/wp-json\/wp\/v2\/comments?post=535"}],"version-history":[{"count":3,"href":"https:\/\/datacrazyworld.com\/index.php\/wp-json\/wp\/v2\/posts\/535\/revisions"}],"predecessor-version":[{"id":554,"href":"https:\/\/datacrazyworld.com\/index.php\/wp-json\/wp\/v2\/posts\/535\/revisions\/554"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/datacrazyworld.com\/index.php\/wp-json\/wp\/v2\/media\/525"}],"wp:attachment":[{"href":"https:\/\/datacrazyworld.com\/index.php\/wp-json\/wp\/v2\/media?parent=535"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/datacrazyworld.com\/index.php\/wp-json\/wp\/v2\/categories?post=535"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/datacrazyworld.com\/index.php\/wp-json\/wp\/v2\/tags?post=535"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}