equisd

Ruby on Rails: Generar reportes en excel • Hojas de cálculo

Hola cibernautas, como la están pasando en domingo? Por aquí es día de lluvia asi que aprovecho para dejarles unos cuantos recortes de código para que generen reportes en excel.

Es un paso a paso fácil de seguir e implementar. Previamente claro recomiendo que tengas ya un proyecto aunque sea pequeño para que puedas aplicar el código que te dejo. Y evidentemente que tengas ciertos conocimientos de Ruby / Ruby on rails.

Quizá te ayude a prender más: Ruby para principiantes, instalación en ubuntu + RVM

Bueno, utilizaremos la gema “axlsx”, aquí la documentación para trastear más: https://github.com/randym/axlsx

Paso 1.- Colocamos en el archivo Gemfile de nuestro proyecto, la gema “axlsx_rails

# Use sqlite3 as the database for Active Record
gem 'sqlite3'
#Otras gemas arriba ...
gem 'axlsx_rails'
#Otras gemas abajo ...
gem 'sass-rails', '~> 5.0'

Acto seguido vamos a la linea de comandos, nos ubicamos en la ruta principal de nuestro proyecto y ejecutamos:

> bundle install 

Esto instalará la gema para que funcione en el proyecto, toma unos segundos. Asi que no desperen y revizar si el internet va bien si esque responde un poco lento.

Paso 2.- En el controlador realizamos la consulta de datos que queremos mostrar en la hoja de cálculo.

Para el ejemplo, voy a listar registros de la tabla: Personal.

class PersonalController < ApplicationController
    def xls_report
        @personal = Personal.all
        #La variable @personal contiene a la lista del personal de una empresa x.
    end
end

Paso 3.- Generamos la plantilla que va a renderizar a la hoja de cálculo.

wb = xlsx_package.workbook
wb.styles do |s|
    header_cell = s.add_style bg_color: "EFEFEF", 
        fg_color: "00", 
        sz: 14,
        alignment: { horizontal: :center }
    wb.add_worksheet(name: "lista-personal") do |sheet|
        sheet.add_row ["ID", "Nombre", "Apellidos", "Cargo"], 
            :style => [header_cell, header_cell, header_cell, header_cell]
        @query_sorted.each do |t|
            sheet.add_row [t[:id], 
                t[:first_name], 
                t[:last_name], 
                t[:role]]
        end
    end
end

Paso 4.- Asignamos la plantilla a nuestro controlador.

class PersonalController < ApplicationController
    def xls_report
        @personal = Personal.all
        #En la siguiente linea, indicamos que plantilla usará el 
        #controlador para pintar la data
        render xlsx: 'personal-list-report', 
            template: 'reports/personal_list.xlsx.axlsx'
    end
end

Paso 5.- Ubicamos nuestra vista en las rutas de Rails

Rails.application.routes.draw do
    root 'summer#index'
    get 'reports/personal.xls', to: 'personal#xls_report'
end

Listo, con estos pasos y algo más de su experiencia podrán generar archivos en excel con Ruby on rails.
Espero que les sea útil y bueno me despido, gracias.

Colofón

Y que paso con los estilos en la hoja de calculo? Y los colores? Celdas con fondo y más bla bla bla.
Lo sé. Quieren la solución de un sólo clic, pero eso ya lo dejo para otro articulo asi que por ahora pueden trastear en más en la documentación. https://github.com/randym/axlsx

Salir de la versión móvil