viernes, 13 de julio de 2007

El formato Open XML de Microsoft Office

Yo utilizo Word, Excel y PowerPoint con enorme frecuencia – tal vez como quienes lean esto - y me toca estar en presencia de un cambio significativo en herramientas de trabajo cotidiano. Estoy empeñado en colaborar con este cambio llamado Open XML.

Imperceptiblemente, gradualmente esos archivos de Microsoft Office se guardarán de un nuevo modo y detrás de ese cambio está el hecho de que la información que voy incorporando a los mismos es verdaderamente procesable, analizable, transferible con o sin la estética que he utilizado para presentarla.

El conflicto entre datos y formato disminuye cada vez más. Nuestras horas de trabajo pueden quedar expuestas o ser aprovechadas de otra manera.

A eso yo llamo cambio.

      
1. La información quedará “desprendible” del formato que adopta

       2. Mi información queda disponible para ser reprocesada eficientemente

       3. El cambio comprende a todos los documentos Word, Excel y PowerPoint producidos desde el cambio de siglo y más aún.

Lo primero que cambia es el modelo informativo de los documentos.

Un archivo de Excel 2003 (extensión xls), por ejemplo, era una caja fuerte binaria dependiente de Excel. El archivo era prácticamente imposible de manipular fuera de Office.

Eso era natural. ¿Sí? ¿Por qué debería ser de otra manera?

Porque la tecnología de la información está cambiando todo el tiempo. Porque ese paquete no sirve para el cable, que es el lugar en el que está la información que importa.

No sirve porque guarda la información de una manera ininteligible para un adecuado proceso automático y no sirve porque es propietaria, demasiado propietaria para la cantidad de información que se acumula en los escritorios de todo el planeta en forma de presentaciones, documentos de texto y hojas de cálculo.

Microsoft abrió el juego, el formato de estos documentos dejó de ser propietario, es ahora un estándar abierto y su uso es gratuito.

Ante este cambio se me ofrecen 2 puntos de vista diferentes:

       1. El punto de vista del desarrollo: cómo se crea, se analiza o se modifica un archivo Word, Excel o PowerPoint a partir de Open XML sin utilizar Office, sin licencia de Office, sin VBA, sin nada más que nuestra plataforma habitual de desarrollo.

       2. El punto de vista del significado: de qué sirve y por qué es importante.

El primer punto de vista, el del desarrollo, el punto de vista técnico, de grano fino no es impactante porque - justamente - se trata de utilizar nuestras herramientas habituales de programación.

Para los programadores .Net voy a mostrar un poco de Packaging, el namespace de .Net destinado a Open XML.

Voy a guardar una copia de este mismo documento que están leyendo en el escritorio de otra máquina: un Windows Server 2003 que no tiene Office en ninguna de sus versiones.

Windows no reconocerá el formato de archivo (.docx en este caso) ya que Office no está instalado.

¡Vamos a renombrar el archivo con extensión .zip para poder abrirlo!

Lo descomprimimos aprovechando el cambio de extensión. Y ¿qué vemos? Una carpeta de Windows con subcarpetas y archivos.

¡En realidad el archivo es una carpeta comprimida que contiene carpetas y archivos (mayormente XML aunque hay algunos binarios como las imágenes y los proyectos VBA)!

¿Entienden ahora lo de OPEN?

· Una carpeta _rels contiene información de relaciones entre partes del documento (en qué lugar se inserta una imagen, por ejemplo)

· docProps trae información básica del documento en archivos XML

· Word (según podemos ver en la ilustración 3) trae la información que esperamos encontrar

o Estilos

o Fuentes

o El contenido del documento

o Etc.

Esa información que estamos observando aquí es accesible, obviamente, por vía de programación.

No podría ser de otro modo: son documentos XML dentro de un archivo ZIP.

Hagamos un rápido paso a paso utilizando .Net.

Creamos una aplicación de consola y agregamos una referencia a WindowsBase para poder importar System.IO.Packaging.

Abrimos el archivo:

C#

private Package ObtenerPaquete(string NombreArchivo, FileAccess TipoAcceso)

{

Package paquete;

try

{

paquete = Package.Open(NombreArchivo, FileMode.Open, TipoAcceso);

}

catch (IOException ex)

{

//Manejar excepciones aquí…..

throw;

}

return paquete;

}

VB

Private Function ObtenerPaquete(ByVal NombreArchivo As String, ByVal TipoAcceso As FileAccess) As Package

Dim paquete As Package

Try

paquete = Package.Open( _

NombreArchivo, FileMode.Open, TipoAcceso)

Catch ex As IOException

‘Manejar excepciones aquí…..

End Try

Return paquete

End Function

Obtenemos un XmlDocument de un archivo XML dentro del paquete:

C#

private static System.Xml.XmlDocument PartToXMLDocument(PackagePart parte)

{

System.Xml.XmlDocument doc=new XmlDocument();

doc.Load(parte.GetStream());

return doc;

}

VB

Private Shared Function PartToXMLDocument(ByVal parte As PackagePart) As System.Xml.XmlDocument

Dim doc As System.Xml.XmlDocument = New XmlDocument()

doc.Load(parte.GetStream())

Return doc

End Function

Localizamos el archivo (la parte) deseado dentro del paquete:

C#

private static System.Xml.XmlDocument doc(Package paquete)

{

foreach (PackagePart var in paquete.GetParts())

{

if(var.Uri.OriginalString==@"/word/document.xml")

{

return PartToXMLDocument(var);

}

}

return null;

}

VB


Private Shared Function doc(ByVal paquete As Package) As System.Xml.XmlDocument

For Each var As PackagePart In paquete.GetParts()

If var.Uri.OriginalString = "/word/document.xml" Then

Return PartToXMLDocument(var)

End If

Next

Return Nothing

End Function

Integrando todo, este código nos muestra todo el texto escrito en el documento en una ventana de consola:

static void Main(string[] args)

{

Package paquete = ObtenerPaquete(@"F:\Deploy\Office 2007 Open XML.docx", FileAccess.ReadWrite);

System.Xml.XmlDocument Texto = doc(paquete);///

XmlNameTable nt = new NameTable();

XmlNamespaceManager nsMgr = new XmlNamespaceManager(nt);

nsMgr.AddNamespace("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main");

foreach (System.Xml.XmlNode var in Texto.SelectNodes("w:document/w:body/w:p/w:r/w:t",nsMgr))

{

Console.WriteLine(var.InnerXml);

}

Console.Read();

}

Como vemos en el código fuente nunca utilizamos Office sino algunas utilidades específicas de .Net alrededor de la compresión Zip para obtener el paquete y de XML para analizar contenidos.

Antes era binario y necesitábamos Word para editar Word, Excel para editar Excel. Ahora que es Zip + XML lo abrimos con múltiples herramientas al alcance de cualquiera.

Obviamente un proceso ZIP/XML como este no excluye casi ninguna plataforma actual de desarrollo, podemos procesar esta información con variadísimas herramientas de desarrollo en cualquier sistema operativo sin - obviamente - disponer de Office.

Tienes la opción de buscar el código escrito ya en http://openxmldeveloper.org en donde hoy puedo ver – a modo de ejemplo - código para crear una hoja de cálculo Excel en PHP, la noticia de que Altova XML Spy soporta edición directa de Open XML y de que Novell soporta el formato en Open Office, creación de documentos Office en un servidor Windows que no tiene Office instalado (usando sólo código .Net), conversiones de Excel a HTML o XBRL, código fuente Java, generación dinámica de documentos Office obtenibles como servicio, etc.

Lo difícil es lo fácil: cualquier buen programador con experiencia en XML puede corroborar lo que digo. Trabajar la tecnología es de una complejidad no más que media.

¿Es una jugada fuerte no?

Antes los documentos eran ininteligibles y ahora son transparentes como peceras.


El jueves pasado en la subsidiaria de Microsoft en Buenos Aires presenté una charla sobre Open XML.


Creo que llegué a algo cuando dije que – en Open XML - "lo fácil es lo difícil y lo difícil es lo fácil".

Lo difícil no es codificar sino entender el nuevo paradigma de “documentos transparentes”.

No vayan por el lado de la seguridad en este momento por favor: claro que podemos firmar, encriptar, proteger, asegurar, etc. Claro que sí.

También la seguridad de macros queda controlada de una manera mucho más drástica. Hay extensiones de archivos Office que no van a ejecutar macros de ningún modo, ni siquiera las firmadas. Esos documentos enviados por email serán tan seguros como un archivo de texto plano.

Todo lo contrario: los nuevos archivos son más seguros y más pequeños. La iniciativa incluye la conversión necesaria (de uso libre) para trabajar con Open XML desde Office 2000 en adelante como formato normal y reemplazar en el uso cotidiano el formato anterior por el nuevo.

Es todo ganancia. Todo, sin duda. Quienes trabajen en versiones anteriores de Office podrán guardar sus documentos y leer/escribir los nuevos sin otro sacrificio que instalar un liviano plug-in gratuito descargable desde http://www.microsoft.com/downloads/details.aspx?FamilyId=941b3470-3ae9-4aee-8f43-c6bb74cd1466&displaylang=es .

La apertura de los archivos va más allá aún. Como los documentos Open XML son de esquema abierto podemos agregar información XML que Office no entienda simplemente porque queremos que este allí como metadata, como información sobre la información.

Un recurso poderoso si deseamos que estos documentos formen parte de desarrollos que manejen librerías o flujos o lo que la necesidad dicte.

Por ejemplo un documento que genera un alta de operación podría ir acompañado de información precisa firmada digitalmente e incluida en el documento como una “parte” más.

¿Cómo haríamos esto de otro modo? Nunca con esta limpieza y claridad.

Otro concepto importante es lo que yo denomino el “rompecabezas”.

Hay una decisión de diseño en el formato de Office 2007 distinta a las versiones XML anteriores.

En aquellos casos los documentos consistían de un solo documento XML, lo cual traía consecuencias no deseadas como por ejemplo la incrustación de las imágenes como binarios codificados, la dificultad para incluir otras características (este es el primer formato XML de Office que soporta totalmente todo lo que Office proporciona y – más aún - es el formato por defecto en Office 2007; las versiones XML anteriores tenían límites y no soportaban algunas características de Office como escenarios, VBA, etc.) y el crecimiento del tamaño de archivo.

La solución Open XML de 1 sólo archivo apunta a 2 características sustanciales:

1. A que no cambie la experiencia del usuario no avanzado

2. A la modularidad (el “rompecabezas”)

Esta modularidad define archivos específicos para características precisas (hojas de cálculo, imágenes, texto del documento, cadenas de texto reutilizables, fuentes, estilos) dentro de carpetas de archivos y un esquema de relaciones que pone todo junto.

Todo especificadito (Open Packaging Conventions) y claro.

Si – por ejemplo - quiero cambiar una imagen en un documento Word abro el paquete y cambio el archivo específico de esa imagen (GIF/PNG/JPG, etc.) o si deseo cambiar los datos de un gráfico Excel voy a la hoja de cálculo (hay un documento XML específico para cada hoja de cálculo) que los contiene y así sucesivamente.

Si deseo generar documentos en Runtime puedo “juntar” información de diferentes orígenes a la hora de componer el archivo (una imagen en el disco + una consulta a una base de datos + archivos específicos de estilos y formato).

Si deseo quitar los comentarios de un documento, o extraer sólo determinadas cosas adopto la política de usar sólo lo necesario sin inconvenientes.

¡Si deseo que los documentos Word, Excel o PowerPoint sean servicios SOA que compongo a pedido puedo hacerlo!

La plataforma Open XML es un estándar abierto con acuerdo explícito de uso libre (Covenant not to sue). Es útil navegar a http://www.openxmlcommunity.org/ y observar esta característica en detalle:

   ü Descargar la especificación ECMA completa

   ü Estado del proceso ISO

   ü Beneficios de la plataforma

   ü La necesidad de múltiples estándares (avalada por el acuerdo con Novell para soporte de estos estándares y por la disponibilidad de conversores para las aplicaciones Linux de oficina)

   ü No dejen – si son desarrolladores - de seguir este vinculo: http://openxmldeveloper.org/default.aspx

Open XML es – de hecho - un nuevo protocolo que se agrega a la estrategia de programar la Web iniciada con la utilización del estándar XML.

¿Donde está mayormente la información útil hoy?

Está viajando, está en el cable, con frecuencia multiplicada y replicada.

Ese es el mundo de hoy.

¿Cuánto vale la información acumulada de un estudio contable?

Si un contador quiere poner información disponible para ser transformada en XBRL, si un docente toma un examen utilizando Word, si tengo cualquier tipo de información almacenada y definida con claridad…

¿Copio y pego, imprimo, tomo nota?

Eso era antes.

No hay comentarios: