En una de las aplicaciones Rails en las que estoy trabajando actualmente, el cliente necesita poder exportar datos como un archivo que pueda abrir con una hoja de cálculo. Una manera muy sencilla de hacer esto es emplear el formato de manejo de CSV desde Ruby.
Podemos encontrar ejemplos de esto en el libro Rails Recipes de Chad Fowler, o en la web.
Examinemos un ejemplo. Aquí tenemos un controlador “Exportador” con una acción “empresas” que devuelve todas las empresas como CSV, con los valores separados por comas.
-
-
class ExportadorController < ApplicationController
-
require ‘csv’
-
def empresas
-
# Nos traemos todas las empresas y montamos el CSV
-
@empresas = Empresa.find(:all)
-
report = StringIO.new
-
CSV::Writer.generate(report, ‘,’) do |csv|
-
csv << %w(id nombre localidad provincia)
-
@empresas.each do |e|
-
csv << [e.id, e.nombre, e.localidad, e.provincia]
-
end
-
end
-
# Enviamos los datos al navegador
-
report.rewind
-
send_data(report.read,
-
:type => ‘text/csv’,
-
:filename => ‘empresas.csv‘)
-
end
-
end
-
Fíjate en que hace falta la línea require ‘csv’ para hacer uso de este módulo. Como opción podrías especificar otro caracter de separación de columnas, por ejemplo si quisieras emplear la barra vertical, lo harías así:
-
-
CSV::Writer.generate(report, ‘|’) do |csv|
-
Sencillo, ¿no? ![]()
7 comments ↓
[...] unos días veíamos cómo exportar datos de una aplicación Ruby on Rails en formato CSV, y hoy vamos a ver cómo hacer para generar directamente un archivo de Excel. Una de las ventajas [...]
Off-Topic:
Gracias por el comentario sobre Nifty Corners que me dejaste en la http://lacaraoscura.com
Por cierto te invito a que resgistres tu blog en http://www.rubycorner.com
Precisamente yo ando con esto ahora, la verdad es que ha resultado más fácil de lo que pensaba. Pregunta para subir nota: yo tengo que exportar una lista con teléfonos con el prefijo delante para poder enviar sms, pero cuando pongo el signo + para el prefijo se lo come y no aparece en el csv. ¿Tienes idea de como hacerlo?, yo prové así pero no funciona:
csv
Mi blog se ha comido tu código, creo
Si quieres envíamelo por e-mail y le echo un vistazo a ver qué se me ocurre… lo del “+” no será que Ruby te lo interpreta como concatenar cadenas?
¿Y si haces algo como prefijo.to_s + “+” telefono.to_s?
Tengo que escribir en el CSV algo como +34972908070
He probado con
csv
Hola Jaime,
A bote pronto, una pregunta: tengo problemas con el character set al exportar a csv. Las eñes y los acentos salen mal: España, José…
Algún arreglo rápido que se te ocurra?
Gracias
Hola Enrique, eso es debido a los juegos de caracteres que uses (UTF-8, ISO-8859-1, etc.)… este tema es mi pesadilla también.
Básicamente, has de procurar que el juego de caracteres que use tu aplicación sea el mismo en todos lados: códigos, base de datos, html generado, etc.
También puedes usar la librería Iconv para convertir o forzar a conversión de un juego a otro.
Leave a Comment