Leyendo esos viejos Excel (xls no XML) con PHP5

Se me habia presentado un problema con respecto a un paquete encontrado en sourceforge llamado PHPExcelReader (al parecer tambien es de PEAR, pero no lo he visto ahi :p); la idea era leer archivos Excel desde PHP5 para luego cargarlos a la DB; pero cuando comencé a usarlo empezaron los problemas, pues dicho paquete estaba en un código casi que PHP3; muy desordenado, no funcionaba correctamente en plataformas de 64 bits y al parecer solo habia sido probado en sistemas Windows ya que en mi sistema Linux no abria correctamente el archivo y causaba una parcial corrupción de la data; me dediqué en la noche de ayer a modificar dicha clase y no solo adaptarla a un código php5 estricto; sino que además, hacerla funcionar correctamente en plataformas Linux y sistemas a 64 bits.

Utilidad Práctica:

En la actualidad Microsoft Excel 2003 y siguientes guardan en un formato XML llamado Workbook (que se modificó para crear en excel 2007 el actual formato OOXML que tanto he “atacado”); pero muchas cosas (como aplicaciones, plugins de aplicaciones, gestores de backup o export desde otras bases de datos o incluso datos generados por aplicaciones) siguen llegando en los viejos formatos Office 2000/XP; un formato binario propietario dificil de interpretar para ser cargado en base de datos.

Por qué no un CSV?

Porque simplemente una aplicación debe “automatizar procesos y no computarizar burocracias”; no voy a poner a un usuario a “guardar como” un archivo de Excel en formato coma-separado y tener que enseñarle reglas de como separar, que usar de separador, que usar de terminador de línea, etc

La idea tácita es que el usuario tome su archivo de excel, lo suba y este sea “parseado” en una forma entendible; como un objeto iterable que pueda ser luego cargado en base de datos, mostrado en pantalla, etc.

Uso:

Tambien debe ser de facil uso; en este caso, solamente necesitas el nombre del archivo y cargarlo:


<?php
$data = new excel_reader();
$data->read($filename);
?>

Con esas dos líneas creas un objeto excel_reader y luego lees el documento; el documento automáticamente (si está bien analizado) es parseado por la clase y puede accederse a él a través de ciertas vías:

Un objeto tipo array conocido como sheets contiene cada una de las hojas presentes en la hoja de calculo; comenzando con 0; todas pueden ser referenciadas por número (TODO: referenciar por nombre):

echo '<pre>';
echo $data->sheets;
echo '</pre>';

Mostrar la hoja 1 solamente sería:

echo $data->sheets[0];

y mostrar la celda ubicada en la fila 13, columna 7 sería:

$data->sheets[0]['cells'][13][7]

Obtener el array de todas las celdas de la hoja 2 sería:

$data->sheets[1]['cells'];

Podemos obtener el número de columnas de la hoja 1 con:

$data->sheets[0]['numCols']

y el número de Filas:

$data->sheets[0]['numRows']

TODO (por hacer):

Aplicarle el patrón iterator para poder usar foreach en la iteración de una hoja determinada

Por ahora solo me preocupo de hacer encoding en UTF8; agregar soporte para otros encoding

probar con hojas de cálculo más complejas, con formulas y eso

Como para el momento actual para lo cual necesitaba esta clase se adapta a mis necesidades; muchas cosas realmente no las he probado; espero con tiempo ir testeando y/o agregando funcionalidades.

Para evitar todo esto; como conclusión, USEN OPENOFFICE!, es un formato XML, estable y además aceptado ISO (ISO 23600 Open Document).😀

Aquí les dejo el vínculo para descargarse la clase y el oleread (no viaja con ejemplos, sorry …)

UPDATE:

La ubicación del código es en un repositorio SVN en Google checkout; pueden leer sobre ello acá: https://phenobarbital.wordpress.com/2010/04/09/php5-actualizacion-de-librerias/

Acerca de phenobarbital

http://about.me/phenobarbital

Publicado el 20 marzo 2008 en PHP, PlanetaLinux, Programacion, trucos de la abuela. Añade a favoritos el enlace permanente. 9 comentarios.

  1. Ahora pregunto ¿si por mala suerte guardaron en formato nuevo? ¿cómo se identifica la version del excel para parsear?

  2. La clase solo abre archivos Excel 2000/XP y algunos compatibles 2003 (los binarios); en este caso, al abrir el archivo, lee un signature de cabecera.
    En el caso de los Excel 2003/2005/2007 es más facil; ya que se trata de un documento XML que puede ser cargado y analizado con DOM; en ese caso usas las infinidades de clases que leen XML como esta:
    http://www-128.ibm.com/developerworks/opensource/library/os-phpexcel/
    La idea podría ser crear una clase delegadora; que si el signature es de un Excel viejo, cree un excel_reader, o en su defecto usar DOM …

  3. Esta super la informacion suministrada en este sitio, muchas gracias, felicidades.

  4. El link para descargar la clase esta roto….podrias corregir esto?…te lo agradeceria….

  5. Buenas jorge; este artículo tiene ya bastante tiempo; yo mudé el blog de origen y no traje los objetos, si lo deseas dame una dirección donde pueda enviarte el paquete tar.gz o en algun momento lo subo a algun sitio gratuito …
    Disculpa el enlace roto …

  6. Ok no te preocupes…mi correo es jorgejarava@gmail.com…te agradezco tu colaboracion….

  7. Amigo estoy intentando la descarga pero veo que el link no existe, por favor enviarme el archivo a mi correo oscar.z-at-gmail.com Gracias!!

  8. phenobarbital

    Hola a todos; este artículo es algo viejo; una actualización para que sepan donde encontrar las librerias; acá:
    https://phenobarbital.wordpress.com/2010/04/09/php5-actualizacion-de-librerias/

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: