Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/glebm/to_spreadsheet
Render XLSX from Rails using existing views (html ⇒ xlsx)
https://github.com/glebm/to_spreadsheet
Last synced: 3 months ago
JSON representation
Render XLSX from Rails using existing views (html ⇒ xlsx)
- Host: GitHub
- URL: https://github.com/glebm/to_spreadsheet
- Owner: glebm
- License: other
- Created: 2011-03-21T21:10:42.000Z (over 13 years ago)
- Default Branch: master
- Last Pushed: 2021-08-12T13:21:39.000Z (almost 3 years ago)
- Last Synced: 2024-03-18T01:42:05.683Z (3 months ago)
- Language: Ruby
- Homepage:
- Size: 545 KB
- Stars: 92
- Watchers: 5
- Forks: 37
- Open Issues: 7
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Lists
- awesome-ruby - to_spreadsheet - Render XLSX from Rails using existing views (Spreadsheets)
README
# to_spreadsheet [![Build Status](https://secure.travis-ci.org/glebm/to_spreadsheet.png?branch=master)](http://travis-ci.org/glebm/to_spreadsheet)
to_spreadsheet lets your Rails 3+ app render Excel files using the existing slim/haml/erb/etc views.
Installation
------------Add it to your Gemfile:
```ruby
gem 'to_spreadsheet'
```Usage
-----In the controller:
```ruby
# my_thingies_controller.rb
class MyThingiesController < ApplicationController
respond_to :xlsx, :html
def index
@my_items = MyItem.all
respond_to do |format|
format.html
format.xlsx { render xlsx: :index, filename: "my_items_doc" }
end
end
end
```In the view partial:
```haml
# _my_items.haml
%table
%caption My items
%thead
%tr
%td ID
%td Name
%tbody
- my_items.each do |my_item|
%tr
%td.number= my_item.id
%td= my_item.name
%tfoot
%tr
%td(colspan="2") #{my_items.length}
```In the XLSX view:
```haml
# index.xlsx.haml
= render 'my_items', my_items: @my_items
```In the HTML view:
```haml
# index.html.haml
= link_to 'Download spreadsheet', my_items_url(format: :xlsx)
= render 'my_items', my_items: @my_items
```### Worksheets
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.### Formatting
You can define formats in your view file (local to the view) or in the initializer
```ruby
format_xls 'table.my-table' do
workbook use_autowidth: true
sheet orientation: landscape
format 'th', b: true # bold
format 'tbody tr', bg_color: lambda { |row| 'ddffdd' if row.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
end
```For the full list of supported properties head here: http://rubydoc.info/github/randym/axlsx/Axlsx/Styles#add_style-instance_method
In addition, for column formats, Axlsx columnInfo properties are also supported### Advanced formatting
to_spreadsheet [associates](https://github.com/glebm/to_spreadsheet/blob/master/lib/to_spreadsheet/renderer.rb#L33) 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:
```ruby
format_xls do
format 'table' do |worksheet|
worksheet.add_chart ...
# to get the associated Nokogiri node:
el = context.to_xml_node(worksheet)
end
end
```### Themes
You can define themes, i.e. blocks of formatting code:
```ruby
ToSpreadsheet.theme :zebra do
format 'tr', bg_color: lambda { |row| 'ddffdd' if row.row_index.odd? }
end
```And then use them:
```ruby
format_xls 'table.zebra', ToSpreadsheet.theme(:zebra)
```### Using along side axlsx-rails
If you are using [axlsx-rails](https://github.com/straydogstudio/axlsx_rails), :xlsx renderer might have already been defined. In that case define a custome renderer using
```ruby
# app/config/application.rb
config.to_spreadsheet.renderer = :html2xlsx
```And then in controller
```ruby
respond_to do |format|
format.html2xlsx
end
```### Types
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) |