to_spreadsheet 1.0.5 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +149 -0
- data/Rakefile +9 -0
- data/lib/to_spreadsheet.rb +5 -1
- data/lib/to_spreadsheet/rails/action_pack_renderers.rb +15 -5
- data/lib/to_spreadsheet/rails/mime_types.rb +1 -1
- data/lib/to_spreadsheet/railtie.rb +9 -4
- data/lib/to_spreadsheet/version.rb +1 -1
- data/spec/rails_integration_spec.rb +10 -0
- metadata +22 -7
- data/README.textile +0 -116
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b8caf02160bc192777511420e81ac8df803f8f6d
|
4
|
+
data.tar.gz: 393535d43b6e6563ed1e7831532bd607ad485fda
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c0c0ef72af612b307b511e3235c8f91656d56a976855672a8883072b9a0932276192ca68ee4a038fd8640c18414cbb0301bf53f16032fb18bfa9fd16c19bdc11
|
7
|
+
data.tar.gz: 430257b549ee502de4860ea92404e8b97e7182af9fa955a9e19a693311422d10003e432463aa8ad501eb55c197a7877342842a247ff4b33cd6d2da49f5a111a5
|
data/README.md
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
# to_spreadsheet [](http://travis-ci.org/glebm/to_spreadsheet)
|
2
|
+
|
3
|
+
to_spreadsheet lets your Rails 3+ app render Excel files using the existing slim/haml/erb/etc views.
|
4
|
+
|
5
|
+
Installation
|
6
|
+
------------
|
7
|
+
|
8
|
+
Add it to your Gemfile:
|
9
|
+
```ruby
|
10
|
+
gem 'to_spreadsheet'
|
11
|
+
```
|
12
|
+
|
13
|
+
Usage
|
14
|
+
-----
|
15
|
+
|
16
|
+
In the controller:
|
17
|
+
```ruby
|
18
|
+
# my_thingies_controller.rb
|
19
|
+
class MyThingiesController < ApplicationController
|
20
|
+
respond_to :xls, :html
|
21
|
+
def index
|
22
|
+
@my_items = MyItem.all
|
23
|
+
respond_to do |format|
|
24
|
+
format.html
|
25
|
+
format.xlsx { render xlsx: :index, filename: "my_items_doc" }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
```
|
30
|
+
|
31
|
+
In the view partial:
|
32
|
+
```haml
|
33
|
+
# _my_items.haml
|
34
|
+
%table
|
35
|
+
%caption My items
|
36
|
+
%thead
|
37
|
+
%tr
|
38
|
+
%td ID
|
39
|
+
%td Name
|
40
|
+
%tbody
|
41
|
+
- my_items.each do |my_item|
|
42
|
+
%tr
|
43
|
+
%td.number= my_item.id
|
44
|
+
%td= my_item.name
|
45
|
+
%tfoot
|
46
|
+
%tr
|
47
|
+
%td(colspan="2") #{my_items.length}
|
48
|
+
```
|
49
|
+
|
50
|
+
In the XLSX view:
|
51
|
+
```haml
|
52
|
+
# index.xls.haml
|
53
|
+
= render 'my_items', my_items: @my_items
|
54
|
+
```
|
55
|
+
|
56
|
+
In the HTML view:
|
57
|
+
```haml
|
58
|
+
# index.html.haml
|
59
|
+
= link_to 'Download spreadsheet', my_items_url(format: :xlsx)
|
60
|
+
= render 'my_items', my_items: @my_items
|
61
|
+
```
|
62
|
+
|
63
|
+
### Worksheets
|
64
|
+
|
65
|
+
Every table in the view will be converted to a separate sheet.
|
66
|
+
The sheet title will be assigned to the value of the table’s caption element if it exists.
|
67
|
+
|
68
|
+
### Formatting
|
69
|
+
|
70
|
+
You can define formats in your view file (local to the view) or in the initializer
|
71
|
+
|
72
|
+
```ruby
|
73
|
+
format_xls 'table.my-table' do
|
74
|
+
workbook use_autowidth: true
|
75
|
+
sheet orientation: landscape
|
76
|
+
format 'th', b: true # bold
|
77
|
+
format 'tbody tr', bg_color: lambda { |row| 'ddffdd' if row.index.odd? }
|
78
|
+
format 'A3:B10', i: true # italic
|
79
|
+
format column: 0, width: 35
|
80
|
+
format 'td.custom', lambda { |cell| modify cell somehow.}
|
81
|
+
# default value (fallback value when value is blank or 0 for integer / float)
|
82
|
+
default 'td.price', 10
|
83
|
+
end
|
84
|
+
```
|
85
|
+
|
86
|
+
For the full list of supported properties head here: http://rubydoc.info/github/randym/axlsx/Axlsx/Styles#add_style-instance_method
|
87
|
+
In addition, for column formats, Axlsx columnInfo properties are also supported
|
88
|
+
|
89
|
+
### Advanced formatting
|
90
|
+
|
91
|
+
to_spreadsheet [associates](https://github.com/glebm/to_spreadsheet/blob/master/lib/to_spreadsheet/renderer.rb#L33) HTML nodes with Axlsx objects as follows:
|
92
|
+
|
93
|
+
| HTML tag | Axlsx object |
|
94
|
+
|----------|--------------|
|
95
|
+
| table | worksheet |
|
96
|
+
| tr | row |
|
97
|
+
| td, th | cell |
|
98
|
+
|
99
|
+
For example, to directly manipulate a worksheet:
|
100
|
+
```ruby
|
101
|
+
format_xls do
|
102
|
+
format 'table' do |worksheet|
|
103
|
+
worksheet.add_chart ...
|
104
|
+
# to get the associated Nokogiri node:
|
105
|
+
el = context.to_xml_node(worksheet)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
```
|
109
|
+
|
110
|
+
### Themes
|
111
|
+
|
112
|
+
You can define themes, i.e. blocks of formatting code:
|
113
|
+
```ruby
|
114
|
+
ToSpreadsheet.theme :zebra do
|
115
|
+
format 'tr', bg_color: lambda { |row| 'ddffdd' if row.index.odd? }
|
116
|
+
end
|
117
|
+
```
|
118
|
+
|
119
|
+
And then use them:
|
120
|
+
```ruby
|
121
|
+
format_xls 'table.zebra', ToSpreadsheet.theme(:zebra)
|
122
|
+
```
|
123
|
+
|
124
|
+
### Using along side axlsx-rails
|
125
|
+
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
|
126
|
+
```ruby
|
127
|
+
# app/config/application.rb
|
128
|
+
config.to_spreadsheet.renderer = :html2xlsx
|
129
|
+
```
|
130
|
+
|
131
|
+
And then in controller
|
132
|
+
```ruby
|
133
|
+
respond_to do |format|
|
134
|
+
format.html2xlsx
|
135
|
+
end
|
136
|
+
```
|
137
|
+
|
138
|
+
### Types
|
139
|
+
|
140
|
+
The default theme uses class names on td/th to cast values.
|
141
|
+
Here is the list of class to type mapping:
|
142
|
+
|
143
|
+
| CSS class | Format |
|
144
|
+
|------------------|--------------------------|
|
145
|
+
| decimal or float | Decimal |
|
146
|
+
| num or int | Integer |
|
147
|
+
| datetime | DateTime (Chronic.parse) |
|
148
|
+
| date | Date (Date.parse) |
|
149
|
+
| time | Time (Chronic.parse) |
|
data/Rakefile
CHANGED
@@ -21,3 +21,12 @@ task :write_test_xlsx => :env do
|
|
21
21
|
ToSpreadsheet::Renderer.to_package(html).serialize(path)
|
22
22
|
puts "Written to #{path}"
|
23
23
|
end
|
24
|
+
|
25
|
+
desc "Test all rails versions"
|
26
|
+
task :test_all_rails do
|
27
|
+
Dir.glob("./spec/gemfiles/*{[!.lock]}").each do |gemfile|
|
28
|
+
puts "TESTING WITH #{gemfile}"
|
29
|
+
system "BUNDLE_GEMFILE=#{gemfile} bundle | grep Installing"
|
30
|
+
system "BUNDLE_GEMFILE=#{gemfile} bundle exec rspec"
|
31
|
+
end
|
32
|
+
end
|
data/lib/to_spreadsheet.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
require 'to_spreadsheet/version'
|
2
2
|
require 'to_spreadsheet/context'
|
3
3
|
require 'to_spreadsheet/renderer'
|
4
|
-
require 'to_spreadsheet/railtie' if defined?(Rails)
|
5
4
|
|
6
5
|
module ToSpreadsheet
|
7
6
|
class << self
|
7
|
+
def renderer
|
8
|
+
@renderer ||= :xlsx
|
9
|
+
end
|
10
|
+
|
8
11
|
def theme(name, &formats)
|
9
12
|
@themes ||= {}
|
10
13
|
if formats
|
@@ -16,5 +19,6 @@ module ToSpreadsheet
|
|
16
19
|
end
|
17
20
|
end
|
18
21
|
|
22
|
+
require 'to_spreadsheet/railtie' if defined?(Rails)
|
19
23
|
require 'to_spreadsheet/themes/default'
|
20
24
|
ToSpreadsheet::Context.global.format_xls ToSpreadsheet.theme(:default)
|
@@ -1,16 +1,26 @@
|
|
1
1
|
require 'active_support'
|
2
2
|
require 'action_controller/metal/renderers'
|
3
|
-
|
3
|
+
|
4
|
+
# in rails 3.2 it's ActiveSupport::VERSION
|
5
|
+
# in rails 4.0+ it's ActiveSupport.version (instance of Gem::Version)
|
6
|
+
if ActiveSupport.respond_to?(:version) && ActiveSupport.version.to_s >= "4.2.0"
|
7
|
+
# For rails 4.2
|
8
|
+
require 'action_controller/responder'
|
9
|
+
else
|
10
|
+
# For rails 3.2 - rails 4.1
|
11
|
+
require 'action_controller/metal/responder'
|
12
|
+
end
|
13
|
+
|
4
14
|
|
5
15
|
# This will let us do thing like `render :xlsx => 'index'`
|
6
16
|
# This is similar to how Rails internally implements its :json and :xml renderers
|
7
|
-
ActionController::Renderers.add
|
17
|
+
ActionController::Renderers.add ToSpreadsheet.renderer do |template, options|
|
8
18
|
filename = options[:filename] || options[:template] || 'data'
|
9
19
|
data = ToSpreadsheet::Context.with_context ToSpreadsheet::Context.global.merge(ToSpreadsheet::Context.new) do |context|
|
10
20
|
html = render_to_string(template, options.merge(template: template.to_s, formats: ['xlsx', 'html']))
|
11
21
|
ToSpreadsheet::Renderer.to_data(html, context)
|
12
22
|
end
|
13
|
-
send_data data, type:
|
23
|
+
send_data data, type: ToSpreadsheet.renderer, disposition: %(attachment; filename="#{filename}.xlsx")
|
14
24
|
end
|
15
25
|
|
16
26
|
class ActionController::Responder
|
@@ -18,7 +28,7 @@ class ActionController::Responder
|
|
18
28
|
# respond_to do |format|
|
19
29
|
# format.xlsx
|
20
30
|
# end
|
21
|
-
|
22
|
-
controller.render
|
31
|
+
define_method "to_#{ToSpreadsheet.renderer}" do
|
32
|
+
controller.render ToSpreadsheet.renderer => controller.action_name
|
23
33
|
end
|
24
34
|
end
|
@@ -1,2 +1,2 @@
|
|
1
1
|
require 'action_dispatch/http/mime_type'
|
2
|
-
Mime::Type.register "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
2
|
+
Mime::Type.register "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", ToSpreadsheet.renderer unless Mime::Type.lookup_by_extension(ToSpreadsheet.renderer)
|
@@ -1,10 +1,15 @@
|
|
1
1
|
require 'rails/railtie'
|
2
|
-
require 'to_spreadsheet/rails/mime_types'
|
3
|
-
require 'to_spreadsheet/rails/action_pack_renderers'
|
4
|
-
require 'to_spreadsheet/rails/view_helpers'
|
5
2
|
module ToSpreadsheet
|
6
3
|
class Railtie < ::Rails::Railtie
|
7
|
-
|
4
|
+
config.to_spreadsheet = ActiveSupport::OrderedOptions.new
|
5
|
+
config.to_spreadsheet.renderer = ToSpreadsheet.renderer
|
6
|
+
|
7
|
+
config.after_initialize do |app|
|
8
|
+
ToSpreadsheet.instance_variable_set("@renderer", app.config.to_spreadsheet.renderer)
|
9
|
+
|
10
|
+
require 'to_spreadsheet/rails/action_pack_renderers'
|
11
|
+
require 'to_spreadsheet/rails/view_helpers'
|
12
|
+
require 'to_spreadsheet/rails/mime_types'
|
8
13
|
ActionView::Base.send :include, ToSpreadsheet::Rails::ViewHelpers
|
9
14
|
end
|
10
15
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: to_spreadsheet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gleb Mazovetskiy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-11-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -108,15 +108,29 @@ dependencies:
|
|
108
108
|
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: combustion
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
111
125
|
description: Render XLSX from Rails using existing views ( .*.html => .xlsx )
|
112
126
|
email: glex.spb@gmail.com
|
113
127
|
executables: []
|
114
128
|
extensions: []
|
115
129
|
extra_rdoc_files:
|
116
|
-
- README.
|
130
|
+
- README.md
|
117
131
|
files:
|
118
132
|
- LICENSE
|
119
|
-
- README.
|
133
|
+
- README.md
|
120
134
|
- Rakefile
|
121
135
|
- lib/to_spreadsheet.rb
|
122
136
|
- lib/to_spreadsheet/context.rb
|
@@ -139,6 +153,7 @@ files:
|
|
139
153
|
- lib/to_spreadsheet/version.rb
|
140
154
|
- spec/defaults_spec.rb
|
141
155
|
- spec/format_spec.rb
|
156
|
+
- spec/rails_integration_spec.rb
|
142
157
|
- spec/types_spec.rb
|
143
158
|
- spec/worksheets_spec.rb
|
144
159
|
homepage: https://github.com/glebm/to_spreadsheet
|
@@ -160,13 +175,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
160
175
|
version: '0'
|
161
176
|
requirements: []
|
162
177
|
rubyforge_project:
|
163
|
-
rubygems_version: 2.4.
|
178
|
+
rubygems_version: 2.4.8
|
164
179
|
signing_key:
|
165
180
|
specification_version: 4
|
166
181
|
summary: Render existing views as Excel documents with style!
|
167
182
|
test_files:
|
168
|
-
- spec/defaults_spec.rb
|
169
183
|
- spec/format_spec.rb
|
184
|
+
- spec/rails_integration_spec.rb
|
170
185
|
- spec/types_spec.rb
|
186
|
+
- spec/defaults_spec.rb
|
171
187
|
- spec/worksheets_spec.rb
|
172
|
-
has_rdoc: true
|
data/README.textile
DELETED
@@ -1,116 +0,0 @@
|
|
1
|
-
to_spreadsheet is a gem that lets you render xls from your existing slim/haml/erb/etc views from Rails (>= 3.0). !https://secure.travis-ci.org/glebm/to_spreadsheet.png?branch=master(Build Status)!:http://travis-ci.org/glebm/to_spreadsheet
|
2
|
-
|
3
|
-
h2. Installation
|
4
|
-
|
5
|
-
Add it to your Gemfile:
|
6
|
-
|
7
|
-
bc. gem 'to_spreadsheet'
|
8
|
-
|
9
|
-
h2. Usage
|
10
|
-
|
11
|
-
In your controller:
|
12
|
-
|
13
|
-
bc. # my_thingies_controller.rb
|
14
|
-
class MyThingiesController < ApplicationController
|
15
|
-
respond_to :xls, :html
|
16
|
-
def index
|
17
|
-
@my_items = MyItem.all
|
18
|
-
respond_to do |format|
|
19
|
-
format.html
|
20
|
-
format.xlsx { render xlsx: :index, filename: "my_items_doc" }
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
In your view partial:
|
26
|
-
|
27
|
-
bc. # _my_items.haml
|
28
|
-
%table
|
29
|
-
%caption My items
|
30
|
-
%thead
|
31
|
-
%tr
|
32
|
-
%td ID
|
33
|
-
%td Name
|
34
|
-
%tbody
|
35
|
-
- my_items.each do |my_item|
|
36
|
-
%tr
|
37
|
-
%td.number= my_item.id
|
38
|
-
%td= my_item.name
|
39
|
-
%tfoot
|
40
|
-
%tr
|
41
|
-
%td(colspan="2") #{my_items.length}
|
42
|
-
|
43
|
-
In your index.xls.haml:
|
44
|
-
|
45
|
-
bc. # index.xls.haml
|
46
|
-
= render 'my_items', my_items: @my_items
|
47
|
-
|
48
|
-
In your index.html.haml:
|
49
|
-
|
50
|
-
bc. # index.html.haml
|
51
|
-
= link_to 'Download spreadsheet', my_items_url(format: :xlsx)
|
52
|
-
= render 'my_items', my_items: @my_items
|
53
|
-
|
54
|
-
h3. Worksheets
|
55
|
-
|
56
|
-
Every table in the view will be converted to a separate sheet.
|
57
|
-
The sheet title will be assigned to the value of the table's caption element if it exists.
|
58
|
-
|
59
|
-
h3. Formatting
|
60
|
-
|
61
|
-
You can define formats in your view file (local to the view) or in the initializer
|
62
|
-
|
63
|
-
bc. format_xls 'table.my-table' do
|
64
|
-
workbook use_autowidth: true
|
65
|
-
sheet orientation: landscape
|
66
|
-
format 'th', b: true # bold
|
67
|
-
format 'tbody tr', bg_color: lambda { |row| 'ddffdd' if row.index.odd? }
|
68
|
-
format 'A3:B10', i: true # italic
|
69
|
-
format column: 0, width: 35
|
70
|
-
format 'td.custom', lambda { |cell| modify cell somehow.}
|
71
|
-
# default value (fallback value when value is blank or 0 for integer / float)
|
72
|
-
default 'td.price', 10
|
73
|
-
|
74
|
-
For the full list of supported properties head here: http://rubydoc.info/github/randym/axlsx/Axlsx/Styles#add_style-instance_method
|
75
|
-
In addition, for column formats, Axlsx columnInfo properties are also supported
|
76
|
-
|
77
|
-
h3. Advanced formatting
|
78
|
-
|
79
|
-
to_spreadsheet "associates":https://github.com/glebm/to_spreadsheet/blob/master/lib/to_spreadsheet/renderer.rb#L33 HTML nodes with Axlsx objects as follows:
|
80
|
-
|
81
|
-
|_. HTML tag |_. Axlsx object |
|
82
|
-
| table | worksheet |
|
83
|
-
| tr | row |
|
84
|
-
| td, th | cell |
|
85
|
-
|
86
|
-
For example, to directly manipulate a worksheet:
|
87
|
-
|
88
|
-
bc. format_xls do
|
89
|
-
format 'table' do |worksheet|
|
90
|
-
worksheet.add_chart ...
|
91
|
-
# to get the associated Nokogiri node:
|
92
|
-
el = context.to_xml_node(worksheet)
|
93
|
-
|
94
|
-
|
95
|
-
h3. Themes
|
96
|
-
|
97
|
-
You can define "themes" - blocks of formatting code:
|
98
|
-
|
99
|
-
bc. ToSpreadsheet.theme :zebra do
|
100
|
-
format 'tr', bg_color: lambda { |row| 'ddffdd' if row.index.odd? }
|
101
|
-
|
102
|
-
And then use them:
|
103
|
-
|
104
|
-
bc. format_xls 'table.zebra', ToSpreadsheet.theme(:zebra)
|
105
|
-
|
106
|
-
h3. Types
|
107
|
-
|
108
|
-
The default theme uses class names on td/th to cast values.
|
109
|
-
Here is the list of class to type mapping:
|
110
|
-
|
111
|
-
|_. ==CSS== class |_. Format |
|
112
|
-
| decimal or float | Decimal |
|
113
|
-
| num or int | Integer |
|
114
|
-
| datetime | DateTime (Chronic.parse) |
|
115
|
-
| date | Date (Date.parse) |
|
116
|
-
| time | Time (Chronic.parse) |
|