22 de Junio, 2006

CSV como formato para exportación

Normalmente cuando se hace una aplicación a medida se cubren unos requisitos, o se intentan cubrir ;), y a veces, dependiendo del cliente, se hace un poco más, por eso de que contra más azucar más dulce.

Pero lo que siempre hay que evitar es quedarse corto en funcionalidades, porque por un pequeño detalle que el usuario no puede hacer como él desea, podemos terminar con que toda la aplicación acaba siendo un fracaso por simple rechazo del cliente.

Cuando se manejan muchos datos, como en el caso que voy a usar de ejemplo (una aditoría de actividad de un gestor de documentación, para cumplir con las exigencias de una norma ISO), nunca está de más que el usuario pueda exportar la información empleanto un formato de intercambio, de forma que pueda trabajar por su cuenta todo lo que quiera (y nos deje a nostros tranquilos).

¿Cómo podríamos hacer esto? Espera... ¿no había algo por ahí llamado XML? Vale, es broma :P.

Por mi experiencia creo que lo más fácil es generar un fichero en formato CSV (Comma Separated Values, o valores separados por comas; pese a que no es obligatorio). Es un formato muy sencillo que cualquier hoja de cálculo podrá abrir sin problemas.

Aplicación web
Desde la aplicación web damos la oportunidad de exportar a CSV

El formato CSV es muy simple, tanto que nos puede causar algunos problemas si no llevamos un poco de cuidado. Aunque hay abundante información sobre el formato, con la práctica se aprenden algunos truquillos ;).

Por ejemplo: todas las cadenas de texto las pondremos entre comillas. Tampoco es nada del otro mundo, aunque ojo: nos referimos a cadena de texto con todo aquello que no sea un número entero, porque no sabemos cómo representará los decimales el programa destino. Las comillas las representaremos duplicándolas (" pasa a ser ""), y en lugar de emplear comas, usaremos el tabulador para separar campos porque es un caracter no imprimible que, previsiblemente, no aparecerá en los datos (aunque para eso ya están la comillas, no siempre va todo tan bien como debería).

La primera linea será la cabecera, y cada fila o registro se separa de la anterior con un salto de linea. Sencillo, ¿verdad?

Con estas pequeñas normas obtenemos algo como:

DNI	NOMBRE	APELLIDOS	TELÉFONO
11111111	"Pepe"	"Pérez Pérez"	"666 66 66 66"
22222222	"Juan"	"García García"	"555 55 55 55"
33333333	"Antonio"	"Sánchez Sánchez"	"444 44 44 44"

Aunque aquí parezca que queda descuadrado, cada campo se separa por un tabulador, y la primera fila corresponde con la cabecera.

Importando CSV
Abrimos el fichero generado desde OpenOffice.org

Al abrir un CSV con OpenOffice.org nos aparece un diálogo bastante completo con una previsualización de los datos. Solo hay que indicar que los campos se separan con tabuladores y asegurarnos que las comillas son el separador de texto.

Desde la implementación no hay que tener mucho más en cuenta de lo que ya he explicado, solo que para que el fichero generado se identifique correctamente por el navegador hay que indicar las cabeceras HTTP adecuadas antes de enviar el contenido. Por ejemplo, en PHP yo lo hago de la siguiente manera:

/* antes de enviar nada al cliente */
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="auditoria.csv"');

/* seguiría el CSV generado */

El tipo MIME que empleo es bastante conservador, desde luego no hemos generado un documento de Excel :), pero da buenos resultados teniendo en cuenta las posibilidades que hay y que no todos los programas/navegadores las reconocen:

# este es el nombre OFICIAL registrado en el IANA (RFC4180)
# pero es bastante nuevo... del 2005 :(
text/csv

# esta es la que usa GNOME
text/x-comma-separated-values

# otras posibilides que he encontrado
text/comma-separated-values
application/csv
application/excel
application/vnd.msexcel

Una vez ajustado lo que sea necesario en el diálogo de importación de CSV, ya podemos trabajar con los datos en nuestra hoja de cálculo preferida:

Datos importados
Ahora tenemos toda la potencia de OpenOffice.org para trabajar con la información

Desde luego el coste de implementar la exportación de datos a formato CSV es despreciable en comparación de los beneficios que podemos obtener. No todos los datos serán últiles para una exportación, pero está claro que por mucho que trabajemos en nuestra aplicación a medida... ¡tampoco vamos a implementar un OpenOffice.org!

Anotación por Juan J. Martínez, clasificada en: programming, php.

Hay 2 comentarios

Gravatar

Vaya posts mas interesante y trabajado. Gracias. :)

por corsaria, en 2006-06-25 10:22:44

Gravatar

Hace poco implementé en un programa la opción de exportar un listado a Excel. Elegí también la opción del CSV.

Leyendo documentación por ahí siempre decian de separar los campos con comas o tabuladores pero al intentarlo abrir con Excel no interpretaba los separadores y lo juntaba todo en una columna. Luego habia que ir a las opciones y decirle que interpretara las comas o los tabuladores como separaciones y al fin lo hacía bien.

Dado el nivelazo informatico de los usuarios de mi programa, eso representaba un problema. Hasta que descubrí que el Excel en castellano acepta como separador por defecto el punto y coma! ';'

Lo digo por si alguien hace una aplicación para españoles, que sepa que el excel en español solo entiende bien los CSV separados por punto y coma.

Saludos.

por emili, en 2006-06-25 12:52:02

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 15 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Algunas anotaciones relacionadas: