Necesita convertir un documento de Word al formato OOXML Strict, pero no puede usar el cuadro de diálogo Guardar como para cada archivo. OOXML Strict es la versión estándar ISO del formato Office Open XML, que garantiza la compatibilidad multiplataforma y el cumplimiento para el archivado a largo plazo. Este artículo explica cómo automatizar la conversión mediante macros de VBA, PowerShell con el SDK de Open XML y el modelo de objetos COM de Office. Aprenderá el código y los pasos exactos para convertir documentos individuales o por lotes sin intervención manual.
Puntos clave: Automatización de la conversión a OOXML Strict
- Macro de VBA con FileFormat:=wdFormatXMLStrictDocument: Convierte el documento activo a OOXML Strict en una sola línea de código.
- PowerShell + Open XML SDK 2.5: Permite la conversión sin interfaz gráfica en servidores sin Word instalado mediante el espacio de nombres DocumentFormat.OpenXml.Packaging.
- Procesamiento por lotes mediante bucle de carpeta: Use Dir() en VBA o Get-ChildItem en PowerShell para convertir todos los archivos .docx de una carpeta.
Qué es OOXML Strict y por qué convertir mediante programación
OOXML Strict es la versión estándar ISO 29500:2008 del formato Office Open XML. El formato .docx predeterminado en Word usa una variante transitoria que incluye características binarias heredadas que no forman parte del estándar ISO. OOXML Strict elimina esos elementos heredados, lo que produce un archivo totalmente compatible con el estándar internacional.
La conversión mediante programación es necesaria cuando se deben procesar cientos o miles de archivos. La conversión manual a través de Archivo > Guardar como > Examinar > Guardar como tipo > Documento de Word (docx) con la opción “Strict” seleccionada no es práctica para el trabajo por lotes. La automatización también garantiza una salida coherente: todos los archivos convertidos usan la misma configuración, lo que reduce el error humano.
Requisitos previos para cada método
El método de VBA requiere que Word esté instalado en la máquina. El método de PowerShell requiere el SDK de Open XML 2.5 para Microsoft Office, que se puede instalar a través de NuGet o del Centro de descargas de Microsoft. El método COM también requiere que Word esté instalado, pero se ejecuta fuera de la interfaz gráfica de Word, lo que resulta útil para la automatización del lado del servidor donde no existe una sesión interactiva.
Método 1: Convertir con una macro de VBA
Este método funciona dentro de Word. Se ejecuta una macro que guarda el documento actual en formato OOXML Strict. La macro usa la constante wdFormatXMLStrictDocument, que tiene un valor de 24.
- Abra el Editor de Visual Basic
Presione Alt+F11. En el Explorador de proyectos, haga doble clic en ThisDocument o inserte un nuevo módulo mediante Insertar > Módulo. - Pegue la macro de conversión
Copie y pegue el siguiente código en el módulo:Sub ConvertToOOXMLStrict()Dim doc As DocumentSet doc = ActiveDocumentDim newName As StringnewName = Replace(doc.FullName, ".docx", "_strict.docx")doc.SaveAs2 FileName:=newName, FileFormat:=wdFormatXMLStrictDocumentEnd Sub - Ejecute la macro
Presione F5 mientras el cursor está dentro de la macro. Se guarda un nuevo archivo llamadooriginal_strict.docxen la misma carpeta. - Convertir por lotes todos los documentos de una carpeta
Use esta macro para procesar todos los archivos .docx de una carpeta:Sub BatchConvertToStrict()Dim f As String, doc As Documentf = Dir("C:\Docs\docx")Do While f <> ""Set doc = Documents.Open("C:\Docs\" & f)doc.SaveAs2 FileName:="C:\Docs\Strict\" & f, FileFormat:=wdFormatXMLStrictDocumentdoc.Closef = DirLoopEnd Sub
Cambie las rutas de carpeta para que coincidan con su entorno.
Método 2: Convertir con PowerShell y el SDK de Open XML
Este método no requiere que Word esté instalado. Usa el espacio de nombres DocumentFormat.OpenXml.Packaging para cambiar el formato de archivo mediante programación. El SDK lee el documento, cambia su tipo de paquete a Strict y lo guarda.
- Instale el SDK de Open XML
Ejecute este comando en una consola de PowerShell con privilegios elevados:Install-Package OpenXmlSdk -ProviderName NuGet
Como alternativa, descargue el SDK de Microsoft e instálelo manualmente. - Cree el script de conversión
Guarde lo siguiente comoConvertToStrict.ps1:Add-Type -Path "C:\Program Files\Open XML SDK\V2.5\lib\DocumentFormat.OpenXml.dll"$source = "C:\Docs\report.docx"$destination = "C:\Docs\report_strict.docx"$doc = [DocumentFormat.OpenXml.Packaging.WordprocessingDocument]::Open($source, $false)$doc.ChangeDocumentType([DocumentFormat.OpenXml.WordprocessingDocumentType]::Strict)$doc.SaveAs($destination)$doc.Dispose() - Ejecute el script
Abra PowerShell como administrador y ejecute:powershell -ExecutionPolicy Bypass -File ConvertToStrict.ps1
El archivo de salida se guarda en la ruta de destino. - Convertir por lotes todos los archivos .docx de una carpeta
Envuelva la conversión en un bucle:$files = Get-ChildItem "C:\Docs" -Filter docxforeach ($f in $files) {$doc = [DocumentFormat.OpenXml.Packaging.WordprocessingDocument]::Open($f.FullName, $false)$doc.ChangeDocumentType([DocumentFormat.OpenXml.WordprocessingDocumentType]::Strict)$out = Join-Path "C:\Docs\Strict" $f.Name$doc.SaveAs($out)$doc.Dispose()}
Método 3: Convertir con el modelo de objetos COM (Word no visible)
Este método usa la interfaz COM de Word, pero mantiene la aplicación oculta. Es adecuado para la automatización basada en servidor donde se necesitan las capacidades de representación completas de Word, pero no se desea una ventana visible.
- Cree un script de PowerShell con COM
Guarde lo siguiente comoConvertViaCOM.ps1:$word = New-Object -ComObject Word.Application$word.Visible = $false$doc = $word.Documents.Open("C:\Docs\report.docx")$doc.SaveAs2("C:\Docs\report_strict.docx", [Microsoft.Office.Interop.Word.WdSaveFormat]::wdFormatXMLStrictDocument)$doc.Close()$word.Quit() - Ejecute el script
Ejecute en PowerShell:powershell -ExecutionPolicy Bypass -File ConvertViaCOM.ps1
Word se abre brevemente en segundo plano, convierte el archivo y se cierra. - Conversión por lotes con COM
Recorra todos los archivos .docx:$word = New-Object -ComObject Word.Application$word.Visible = $false$files = Get-ChildItem "C:\Docs" -Filter docxforeach ($f in $files) {$doc = $word.Documents.Open($f.FullName)$out = Join-Path "C:\Docs\Strict" $f.Name$doc.SaveAs2($out, [Microsoft.Office.Interop.Word.WdSaveFormat]::wdFormatXMLStrictDocument)$doc.Close()}$word.Quit()
Errores y limitaciones comunes de conversión
Error “El formato de archivo no es compatible” en el método del SDK de PowerShell
Esto ocurre cuando el archivo de origen no es un archivo .docx válido. El SDK solo puede abrir paquetes basados en OPC. Los archivos dañados o los guardados en formato .doc fallarán. Verifique la extensión del archivo y repare el documento primero con la característica Abrir y reparar de Word.
La macro de VBA falla con “Permiso denegado”
La macro no puede escribir en una ubicación de solo lectura o en una carpeta donde el usuario carece de permisos de escritura. Asegúrese de que la carpeta de salida permita el acceso de escritura. Use una ruta absoluta como C:\Users\YourName\Documents\Strict\ en lugar de una carpeta protegida por el sistema.
El método COM deja procesos Word.exe en ejecución
Si el script se bloquea antes de llamar a $word.Quit(), queda un proceso de Word en memoria. Envuelva siempre las operaciones COM en un bloque try-catch-finally, o use Stop-Process -Name WINWORD después de que finalice el script. Para scripts de producción, use el método System.Runtime.InteropServices.Marshal.ReleaseComObject para liberar limpiamente el objeto COM.
Los archivos OOXML Strict se abren en versiones anteriores de Word
Word 2007 y versiones anteriores no admiten OOXML Strict de forma nativa. Los usuarios con estas versiones verán una advertencia de compatibilidad o es posible que no puedan abrir el archivo. Si se requiere compatibilidad con versiones anteriores, mantenga el formato .docx transitorio.
VBA vs PowerShell vs COM: Comparación de métodos de automatización
| Elemento | Macro de VBA | PowerShell + SDK | Objeto COM |
|---|---|---|---|
| Requiere Word instalado | Sí | No | Sí |
| Requiere el SDK de Open XML | No | Sí | No |
| Se ejecuta sin interfaz gráfica (sin GUI) | No (Word visible) | Sí | Sí |
| Velocidad de conversión por lotes | Lenta (abre cada documento) | Rápida (sin carga de Word) | Moderada |
| Maneja formato complejo | Fidelidad total | Puede perder algunas características | Fidelidad total |
| Ideal para | Archivos individuales puntuales | Automatización de servidores | Servidor con licencia de Word |
Ahora puede convertir documentos de Word al formato OOXML Strict mediante programación usando VBA, PowerShell con el SDK de Open XML o el modelo de objetos COM. Elija el método que se adapte a su entorno: VBA para uso interactivo, SDK para servidores sin interfaz gráfica y COM cuando se necesite la fidelidad completa de Word en un servidor. Como siguiente paso, pruebe cada método en un solo archivo antes de ejecutar un lote. Un consejo avanzado: use el método del SDK para validar la salida comprobando la propiedad DocumentType; debería devolver Strict después de la conversión.