What Office Open XML means for Developers

Durante mi última visita a Redmond, estuve en un curso de Office Open XML (OOXML). Este curso o taller lo tomamos para conocer lo último de esta tecnología y traernos el material para impartir los mismos cursos dentro del programa de Adopción Ágil para ISVs de OOXML.

Pero, ¿qué es OOXML?

Es un formato basado en XML descriptivo que nos permite integrado medios, documentos y textos dentro de Office. Toda la nueva generación de herramientas de Office System estarán soportando este formato. Este nuevo formato trae una serie de beneficios que ayudan no solamente a los desarrolladores y a las organizaciones, de todos tamaños.

Pero que beneficios nos trae para los desarrolladores usar este nuevo formato:

  1. Abierto y libre de regalías. Gracias a que usa XML como lenguaje descriptivo y ZIP para empaquetarlo va ser universalmente accesible.
  2. Interoperable. Siendo un estándar de la industria, podremos usar este formato en diferentes plataformas sin tener que depender de la suite de Office.
  3. Robusto. Gracias a que su estructura lo hace más robusto en comparación a los formatos anteriores de Office, se reducirá el riesgo de pérdida de información debido a archivos dañados o corruptos.
  4. Eficiente. Como usa compresión ZIP para guardar los documentos, será más sencillo enviarlos vía correo electrónico y su transferencia será menor; además que podrá ser desempaquetado desde cualquier programa compatible con este formato.
  5. Seguro. Contenido sensible puede ser removido fácilmente de los archivos así como código VBA y objetos OLE.

Para una descripción más detallada de los beneficios referirse a la información descrita en el sitio de Office.

Bueno, ya entendimos que es el formato OOXML a grandes rasgos, ahora ¿cómo puedo utilizarlo e incluirlo en nuestras aplicaciones?

.NET 2.0 ya tiene todas las herramientas necesarias para construir aplicaciones con este formato. Desde el API para Packaging (guardar en ZIP) hasta el XPath, XSLT y DOM para construir nuestros archivos. Por ahora veremos como hacerlo sin .NET todo completamente a mano.

Un archivo basado en este formato, típicamente se compone de las siguientes partes:

  • Archivo ZIP. Es el contenedor que almacena todos los archivos relacionados con el formato. Al estar comprimido le da al usuario final la experiencia de «un solo archivo», aunque para nosotros los desarrolladores esto es un poco diferente.
  • Partes. Las partes (parts) son las piezas que componen un documento basado en OOXML. Cada parte es representada como un archivo físico dentro del ZIP y normalmente son XML (aunque podemos incluir gráficos, objetos OLE y archivos misceláneos sin ningún problema).
  • Relaciones. Las relaciones (relationships) son partes que nos permiten proveer vínculos entre partes dentro de mi archivo. Todas estos vínculos son descritos usando XML y pueden definir la estructura con una navegación sencilla además que pueden víncular a archivos externos que no se encuentren dentro del mismo archivo.
  • Macros. Por omisión todos los archivos basados en este formato no presentan ningún tipo de código macro, para evitar cualquier inseguridad o que se corra código malicioso. Sin embargo, el que no presenten no quiere decir que no puedan tener pero se tiene que guardar explícitamente; haciendo el documento Macro-Enabled. Estos tienen exactamente el mismo formato mas el código necesario para correr. Al tener esta ventaja los desarrolladores se pueden dar cuenta antes de abrir el documento que existen macros en el mismo.
  • Extensiones de archivos. Todos los archivos de OOXML tienen el sufijo «x» dentro de su extensión, permitiendo así identificarlos fácilmente (docx, pptx, xlsx, etc.)

Veamos un ejemplo de como crear un documento de Word 2007 paso a paso:

1. Creamos un folder dentro de tu máquina y le llamamos package (se puede llamar como quieras pero para efectos de este tutorial le ponemos así).

2. Creamos un nuevo archivo de texto (con extension .XML), lo nombramos [ContentTypes].xml y ponemos el siguiente contenido (recuerda salvar después de ponerle el contenido eh):

<?xml version=»1.0″ encoding=»utf-8″ standalone=»yes» ?>
<Types xmlns=»http://schemas.openxmlformats.org/package/2006/content-types»>
<Default Extension=»rels» ContentType=»application/vnd.openxmlformats-package.relationships+xml» />
</Types>

3. Dentro del folder package creamos un sub-folder que sea llamado docProps.

4. Creamos un archivo dentro de ese folder y le llamamos core.xml, y le añadimos el siguiente código:

<?xml version=»1.0″ encoding=»UTF-8″ standalone=»yes» ?>
<cp:coreProperties xmlns:cp=»http://schemas.openxmlformats.org/package/2006/metadata/core-properties» xmlns:dc=»http://purl.org/dc/elements/1.1/» xmlns:dcterms=»http://purl.org/dc/terms/» xmlns:dcmitype=»http://purl.org/dc/dcmitype/» xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance»>
<dc:title>Bienvenidos a Office OpenXML</dc:title>
<dc:description>Esta es la descripción del ejemplo que estamos realizando. </dc:description>
</cp:coreProperties>

5. Ya que tenemos las propiedades, tenemos que decirle a nuestro archivo que añadimos las propiedades; así que nos regresamos al directorio de package y abrimos de nuevo el archivo [ContentTypes].xml y añadimos el siguiente código (dentro del tag </Types>):

<Override PartName=»/docProps/core.xml»
ContentType=»application/vnd.openxmlformats-package.
core-properties+xml» />

6. Ya tenemos nuestro archivo que nos define los contenidos, tenemos las propiedades del archivo ahora tenemos que relacionar todos estos elementos para que Word pueda interpretarlos correctamente. Hagamos lo siguiente: creamos un sub-folder dentro de package y le llamamos _rels.

7. Creamos un nuevo archivo de texto que se llame .rels (aquí hay un pequeño detalle, este archivo está interpretado por el explorador como un archivo sin nombre con pura extensión, lo que tenemos que hacer es crear el documento en Notepad y seleccionar Guardar como…, cuando lo salves pones el nombre .rels y seleccionas dentro del combo Todos los archivos en el Guardar de tipo).

8. Añadimos el siguiente código para añadir la relación a la parte de docProps/core.xml:

<?xml version=»1.0″ encoding=»UTF-8″ standalone=»yes»?>
<Relationships xmlns=»http://schemas.openxmlformats.org/package/2006/relationships»>
<Relationship Id=»rId1″ Type=»http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties» Target=»/docProps/core.xml»/>
</Relationships>

9. Ahora agregamos el contenido, creamos un sub-folder de package que se llame word. Creamos un nuevo documento dentro de este nuevo sub-folder y le llamamos document.xml añadiendo el siguiente contenido:

<?xml version=»1.0″ encoding=»UTF-8″ standalone=»yes»?>
<w:document xmlns:ve=»http://schemas.openxmlformats.org/markup-compatibility/2006″ xmlns:o=»urn:schemas-microsoft-com:office:office» xmlns:r=»http://schemas.openxmlformats.org/officeDocument/2006/relationships» 
xmlns:m=»http://schemas.openxmlformats.org/officeDocument/2006/math» xmlns:v=»urn:schemas-microsoft-com:vml» xmlns:wp=»http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing» xmlns:w10=»urn:schemas-microsoft-com:office:word» xmlns:w=»http://schemas.openxmlformats.org/wordprocessingml/2006/main» xmlns:wne=»http://schemas.microsoft.com/office/word/2006/wordml»>
<w:body>
<w:p>
<w:r>
<w:t>Este es un documento creado completamente a mano de Office OpenXML</w:t>
</w:r>
</w:p>
</w:body>
</w:document>

10. Para decirle que existe contenido, abrimos de nuevo el archivo [ContentTypes].xml que se encuentra en el folder package para añadir la parte del documento. Agrega el siguiente código:

<Override PartName=»/word/document.xml»
ContentType=»application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml» />

11. Añadimos la nueva relación del documento al paquete, abre el archivo .rels que se encuentra en el directorio _rels y agrega este código:

<Relationship Id=»rId2″
Type=»http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument» Target=»/word/document.xml»/>

12. Listo… ya tenemos todos los elementos necesarios para ver este archivo dentro de Word 2007. Lo que tenemos que hacer ahora es empaquetar el documento en un formato ZIP para que funcione correctamente… lo que haremos es lo siguiente: selecciona todos los archivos a nivel del folder package y después haz clic derecho y selecciona Enviar a y elige Carpeta comprimida. Esto nos creará un archivo con extensión .ZIP  dentro del mismo directorio, lo renombramos a prueabita.docx (asegurate que la extensión .zip haya sido cambiada).

13. Abrimos el documento en Word 2007 y tenemos el parráfo que encontramos dentro de document.xml.

IMPORTANTE: si te sale algún error al intentar abrir el documento, sucede que muchas veces cuando hacemos copy-n-paste del código que está en la página, se cortan los caracteres, asegurate que todos los tags vayan en una línea y estén bien escritos (esto me sucedió al probar el ejercicio).

Como pueden ver, el formato es relativamente sencillo y podemos crear archivos basados en esta plataforma fácilmente.

Les dejo algunos vínculos de interés sobre Office OpenXML para que revisen y puedan ir adoptando esta nueva tecnología dentro de sus programas.

Cheers! Beer


Comentarios

Deja una respuesta