Render XLSX from Rails using existing views (html ⇒ xlsx)
Ruby HTML Groff
Failed to load latest commit information.
lib Added Chronic import to default theme Aug 11, 2016
spec Add config.to_spreadsheet.renderer option. Fixes #21 Nov 2, 2015
.gitignore Move ./gemfiles to ./spec/gemfiles Sep 11, 2015
LICENSE Initial commit: simple xls + test environment Mar 15, 2011 Add config.to_spreadsheet.renderer option. Fixes #21 Nov 2, 2015
Rakefile Move ./gemfiles to ./spec/gemfiles Sep 11, 2015

to_spreadsheet Build Status

to_spreadsheet lets your Rails 3+ app render Excel files using the existing slim/haml/erb/etc views.


Add it to your Gemfile:

gem 'to_spreadsheet'


In the controller:

# my_thingies_controller.rb
class MyThingiesController < ApplicationController
  respond_to :xls, :html
  def index
    @my_items = MyItem.all
    respond_to do |format|
      format.xlsx { render xlsx: :index, filename: "my_items_doc" }

In the view partial:

# _my_items.haml
  %caption My items
      %td ID
      %td Name
    - my_items.each do |my_item|
      %td(colspan="2") #{my_items.length}

In the XLSX view:

# index.xls.haml
= render 'my_items', my_items: @my_items

In the HTML view:

# index.html.haml
= link_to 'Download spreadsheet', my_items_url(format: :xlsx)
= render 'my_items', my_items: @my_items


Every table in the view will be converted to a separate sheet. The sheet title will be assigned to the value of the table’s caption element if it exists.


You can define formats in your view file (local to the view) or in the initializer

format_xls '' do
  workbook use_autowidth: true
  sheet    orientation: landscape
  format 'th', b: true # bold
  format 'tbody tr', bg_color: lambda { |row| 'ddffdd' if row.index.odd? }
  format 'A3:B10', i: true # italic
  format column: 0, width: 35
  format 'td.custom', lambda { |cell| modify cell somehow.}
  # default value (fallback value when value is blank or 0 for integer / float)
  default 'td.price', 10

For the full list of supported properties head here: In addition, for column formats, Axlsx columnInfo properties are also supported

Advanced formatting

to_spreadsheet associates HTML nodes with Axlsx objects as follows:

HTML tag Axlsx object
table worksheet
tr row
td, th cell

For example, to directly manipulate a worksheet:

format_xls do
  format 'table' do |worksheet|
    worksheet.add_chart ...
    # to get the associated Nokogiri node:
    el = context.to_xml_node(worksheet)


You can define themes, i.e. blocks of formatting code:

ToSpreadsheet.theme :zebra do
  format 'tr', bg_color: lambda { |row| 'ddffdd' if row.index.odd? }

And then use them:

format_xls 'table.zebra', ToSpreadsheet.theme(:zebra)

Using along side axlsx-rails

If you are using axlsx-rails, :xlsx renderer might have already been defined. In that case define a custome renderer using

# app/config/application.rb
config.to_spreadsheet.renderer = :html2xlsx

And then in controller

respond_to do |format|


The default theme uses class names on td/th to cast values. Here is the list of class to type mapping:

CSS class Format
decimal or float Decimal
num or int Integer
datetime DateTime (Chronic.parse)
date Date (Date.parse)
time Time (Chronic.parse)