Exportar a CSV desde Rails

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.

  1.  
  2. class ExportadorController < ApplicationController
  3.   require ‘csv’
  4.   def empresas
  5.     # Nos traemos todas las empresas y montamos el CSV
  6.     @empresas = Empresa.find(:all)
  7.     report = StringIO.new
  8.     CSV::Writer.generate(report, ‘,’) do |csv|
  9.       csv << %w(id nombre localidad provincia)
  10.       @empresas.each do |e|
  11.         csv << [e.id, e.nombre, e.localidad, e.provincia]
  12.       end
  13.     end
  14.     # Enviamos los datos al navegador
  15.     report.rewind
  16.     send_data(report.read,
  17.       :type => ‘text/csv’,
  18.       :filename => ‘empresas.csv)
  19.   end
  20. end
  21.  

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í:

  1.  
  2.     CSV::Writer.generate(report, ‘|’) do |csv|
  3.  

Sencillo, ¿no? :)

7 comments ↓

#1 Exportar a XLS desde Rails // Jaime Iniesta on 03.14.07 at 5:33 am

[...] 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 [...]

#2 Edgar on 03.16.07 at 10:01 am

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

#3 Emili Parreño on 05.22.07 at 6:20 am

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

#4 Jaime Iniesta on 05.22.07 at 7:29 am

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?

#5 Emili Parreño on 05.23.07 at 12:33 am

Tengo que escribir en el CSV algo como +34972908070
He probado con
csv

#6 Enrique on 09.03.07 at 3:13 pm

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

#7 Jaime Iniesta on 09.03.07 at 11:44 pm

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