Hace 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 que tiene el formato XLS sobre CSV es la posibilidad de incluir varias hojas dentro de un mismo archivo.
En primer lugar, necesitaremos instalar la gema spreadsheet-excel. Aunque actualmente está en versión pre-alpha, a mí me ha funcionado estupendamente. Para ello la instalaremos usando gem, en mi caso desde Ubuntu GNU/Linux:
-
jaime@zimpa:~$ sudo gem install spreadsheet-excel
-
Password:
-
Need to update 6 gems from http://gems.rubyforge.org
-
……
-
complete
-
Successfully installed spreadsheet-excel-0.3.5.1
-
Installing ri documentation for spreadsheet-excel-0.3.5.1…
-
Installing RDoc documentation for spreadsheet-excel-0.3.5.1…
Una vez disponible esta gema en nuestro sistema ya podemos usarla desde nuestro controlador:
-
class ExportadorController < ApplicationController
-
require ’spreadsheet/excel’
-
include Spreadsheet
-
def xls
-
# Creamos un nuevo archivo Excel en disco
-
workbook = Excel.new("#{RAILS_ROOT}/public/xls/datos.xls")
-
# Añadimos hoja EMPRESAS
-
hoja_empresas = workbook.add_worksheet("Empresas")
-
# Fila de cabecera
-
@cabecera = %w(id nombre localidad provincia)
-
columna = 0
-
@cabecera.each do |cab|
-
hoja_empresas.write(0,columna,cab)
-
columna += 1
-
end
-
# Una fila para cada empresa
-
@empresas = Empresa.find(:all)
-
fila = 1
-
for e in @empresas
-
# Añado la fila con los datos en sus respectivas columnas
-
hoja_empresas.write(fila,0,e.id)
-
hoja_empresas.write(fila,1,e.nombre)
-
hoja_empresas.write(fila,2,e.localidad)
-
hoja_empresas.write(fila,3,e.provincia)
-
# Pasamos a la siguiente empresa en una nueva fila
-
fila += 1
-
end
-
# Añadimos hoja PRODUCTOS
-
hoja_productos = workbook.add_worksheet("Productos")
-
hoja_productos.write(0,0,"Datos de los productos…")
-
# Cerramos el libro
-
workbook.close
-
# Enviamos el fichero al navegador
-
send_file "#{RAILS_ROOT}/public/xls/datos.xls"
-
end
-
end
En este ejemplo, hemos creado un archivo Excel (workbook) con dos hojas (worksheets), una con los datos de las empresas y otra para los productos (con un par de frases). El archivo se guardará en /public/xls y después se enviará al navegador con send_file.
Un tema importante a tener en cuenta es la codificación de caracteres. Si nuestros datos contienen tildes, eñes, etc., tenemos que asegurarnos de convertirlos a la hora de incorporarlos al Excel, para que se vean correctamente. Haremos esto con iconv, por ejemplo, en lugar de almacenar directamente el nombre, podemos hacerlo convirtiendo a otra codificación así:
-
# En lugar de…
-
# hoja_empresas.write(fila,1,e.nombre)
-
# …usaremos…
-
hoja_empresas.write(fila,1,Iconv.conv("ISO-8859-1","UTF-8", e.nombre))
2 comments ↓
Hola Jaime,
Creo que tengo bien instalada la gema (al menos con gem list sí aparece), pero al hacer workbook.close me da el siguiente error:
Errno::ENOENT in HomeController#pr_xls
No such file or directory -public/xls/datos.xls
¿Sabes que puede pasar? Gracias.
Me contesto yo mismo:
Hay q crear el directorio xls!
Saludos
Leave a Comment