XLSX para curiosos

lunes, 26 de febrero de 2007

Con la aparición de Microsoft Office 2007, se cambia el formato default de los archivos y nace un nuevo formato Abierto basado en XML (Open XML format) que se distingue con la aparición de nuevas extensiones (DOCX, XLSX y PPTX) para las aplicaciones Word, Excel y PowerPoint 2007 respectivamente.

Estos archivos son en realidad un ZIP el cual contiene varias carpetas y múltiples archivos XML que definen al documento y sus datos, esto en contraste con las versiones anteriores que permitían generar XML pero dejaban toda la información en un archivo solo.

Esto tiene algunas ventajas importantes:

  • No necesitamos mirar el archivo entero para buscar información específica.
  • Las imágenes, y archivos específicos contenidos se encuentran guardados en sus formatos originales.

  • Al estar comprimidos son más pequeños.
  • Podemos acceder a la información sin necesitar el modelo de objetos de Excel por ejemplo.
La idea es empezar a conocer cómo es este nuevo formato, en particular vamos a hablar de los archivos de EXCEL ya que, en general, son los que más necesitamos generar nosotros los programadores en nuestras aplicaciones.

XLSX por dentro

Los archivos Open XML ZIP son denominados PACKAGE, y los archivos contenidos dentro de estos PARTS, cada una de estas PARTS se auto definen, y pueden describir cualquier tipo de archivo (XMLs, imágenes, sonido, video, o cualquier objeto binario).

Estas PARTS se encuentran relacionadas dentro de un archivo especial con extensión RELS, que también es un XML dentro del mismo ZIP.

Pero ¿dóne están los datos?

Para esto veamos cómo estan compuestos estos archivos, si descomprimimos uno con cualquier herramienta de descompresión ZIP, vemos que se crean una serie de carpetas y archivos.


El archivo “[Content_Types].xml” describe todas las partes que definen al documento, en este ejemplo tenemos un para de imágenes insertadas, un gráfico y algunos datitos sueltos.


Por último tres carpetas:

_rels: Esta carpeta contiene uno o más archivos RELS, que definen relaciones.
docProps: Declarada información referida al archivo XLSX, como el número de versión de Excel, datos del creador, etc.
xl: Contiene todo lo referido al documento, datos, archivos externos, relaciones, etc.

Siguiendo con la búsqueda de los datos, entramos en la carpeta xl:



Acá vamos a ver una estructura de carpetas variable dependiendo de la información del documento, carpetas para almacenar las imágenes, carpetas para los gráficos, etc. y algunos documentos XML sueltos sharedString.xml donde estan definidos todos los strings que tengamos como dato, styles.xml describen los formatos utilizados, workbook.xml contiene una referencia a las hojas que contiene el documento, y algunos archivos más dependiendo del contenido del mismo.

Siguiendo por la carpeta worksheets, en ella tenemos un XML por cada hoja (sheet) que tengamos, en este caso tenemos tres sheets, con sus nombres, sheet1, sheet2 y sheet3.

Si editamos estos archivo vamos a ver que toda la información (data) de la hoja, se encuentra dentro de un elemento llamado sheetdata, por cada fila hay un elemento row, dentro un elemento por cada celda, y más abajo un elemento mas con su valor.


Por razones de performance, los strings se guardan en una tabla única dentro del archivo sharedStrings.xml, por eso desde aquí se marca una referencia al mismo y se indica que es un string con el atributo t=”s”.

En este caso las celdas A1 y A2 contienen texto que está definido en el archivo sharedString.xml, que básicamente contiene una tabla con todos los textos del documento completo.

En resumen

Con lo que vimos acá claro esta que no vamos a poder desarrollar una herramienta para editar estos archivos, ni tampoco creo que esa sea la idea, pero si tener una noción básica de cómo son internamente estos archivos, para saciar un poco la curiosidad.

Acá dejo un par de links de interés sobre el tema.

Detalles sobre la nueva versión de office:

http://office.microsoft.com/es-es/default.aspx

Importante

Para poder leer estos archivos desde versiones anteriores de office, es necesario instalar un paquete de compatibilidad que se puede bajar desde aquí:

http://www.microsoft.com/downloads/details.aspx?FamilyID=941b3470-3ae9-4aee-8f43-c6bb74cd1466&DisplayLang=es