to_spreadsheet 1.0.4 → 1.1.0
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 +5 -5
- 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 +16 -6
- data/lib/to_spreadsheet/rails/mime_types.rb +1 -1
- data/lib/to_spreadsheet/railtie.rb +9 -4
- data/lib/to_spreadsheet/rule.rb +2 -2
- data/lib/to_spreadsheet/rule/format.rb +2 -2
- data/lib/to_spreadsheet/themes/default.rb +3 -1
- data/lib/to_spreadsheet/version.rb +1 -1
- data/spec/defaults_spec.rb +2 -2
- data/spec/format_spec.rb +4 -4
- data/spec/rails_integration_spec.rb +10 -0
- data/spec/types_spec.rb +4 -4
- data/spec/worksheets_spec.rb +1 -1
- metadata +54 -25
- data/README.textile +0 -116
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 59db3fcd754f0a95dd09f3fe7ffae57462a002745b6993a9fc3baa84014378ed
|
4
|
+
data.tar.gz: 831e9e4a81117cb1904bf503a05d1e3bb24ed817f90de0f031d05cb292308143
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: efe03b92346c0fb021f2d5c4780966bb5267b448e0c209a48a14631af6b8031970d8e09f01c3b5594e72ead6aa89bae257e577ea9f9733bcba059795cbc96b37
|
7
|
+
data.tar.gz: '09271ae875d3d5e3ccddf69a5144afabdbf16e481b05633d4dfeb7aec2132fcea2024b233c65971a870c4d0fdc18ddea0bd4c3053c7d4eef10e178a5ec3d87b1'
|
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 :xlsx, :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.xlsx.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.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.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
|
-
html = render_to_string(template, options.merge(template: template.to_s, formats: [
|
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
|
data/lib/to_spreadsheet/rule.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'active_support/core_ext'
|
1
|
+
require 'active_support/core_ext/string'
|
2
2
|
module ToSpreadsheet
|
3
3
|
module Rule
|
4
4
|
def self.make(rule_type, selector_type, selector_value, options)
|
@@ -6,4 +6,4 @@ module ToSpreadsheet
|
|
6
6
|
klass.new(selector_type, selector_value, options)
|
7
7
|
end
|
8
8
|
end
|
9
|
-
end
|
9
|
+
end
|
@@ -8,7 +8,7 @@ module ToSpreadsheet
|
|
8
8
|
wb = sheet.workbook
|
9
9
|
case selector_type
|
10
10
|
when :css
|
11
|
-
css_match selector_query, context.to_xml_node(sheet) do |xml_node|
|
11
|
+
css_match selector_query, context.to_xml_node(sheet) do |xml_node|
|
12
12
|
add_and_apply_style wb, context, context.to_xls_entity(xml_node)
|
13
13
|
end
|
14
14
|
when :row
|
@@ -18,7 +18,7 @@ module ToSpreadsheet
|
|
18
18
|
sheet.col_style selector_query, inline_styles if inline_styles.present?
|
19
19
|
apply_col_info sheet.column_info[selector_query]
|
20
20
|
when :range
|
21
|
-
add_and_apply_style wb, range_match(
|
21
|
+
add_and_apply_style wb, range_match(selector_query, sheet), context
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
data/spec/defaults_spec.rb
CHANGED
@@ -20,10 +20,10 @@ HAML
|
|
20
20
|
|
21
21
|
context 'default values' do
|
22
22
|
it 'get set when the cell is empty' do
|
23
|
-
row.cells[0].value.
|
23
|
+
expect(row.cells[0].value).to eq(100)
|
24
24
|
end
|
25
25
|
it 'does not get set when the cell is not empty' do
|
26
|
-
row.cells[1].value.
|
26
|
+
expect(row.cells[1].value).to eq(50)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
data/spec/format_spec.rb
CHANGED
@@ -6,7 +6,7 @@ describe ToSpreadsheet::Rule::Format do
|
|
6
6
|
:ruby
|
7
7
|
format_xls do
|
8
8
|
format column: 0, width: 25
|
9
|
-
format 'tr', fg_color: lambda { |row| 'cccccc' if row.
|
9
|
+
format 'tr', fg_color: lambda { |row| 'cccccc' if row.row_index.odd? }
|
10
10
|
format 'table' do |ws|
|
11
11
|
ws.name = 'Test'
|
12
12
|
end
|
@@ -23,16 +23,16 @@ describe ToSpreadsheet::Rule::Format do
|
|
23
23
|
|
24
24
|
context 'local styles' do
|
25
25
|
it 'sets column width' do
|
26
|
-
sheet.column_info[0].width.
|
26
|
+
expect(sheet.column_info[0].width).to eq(25)
|
27
27
|
end
|
28
28
|
it 'runs lambdas on properties' do
|
29
29
|
cell = sheet.rows[1].cells[0]
|
30
30
|
styles = sheet.workbook.styles
|
31
31
|
font_id = styles.cellXfs[cell.style].fontId
|
32
|
-
styles.fonts[font_id].color.rgb.
|
32
|
+
expect(styles.fonts[font_id].color.rgb).to eq(Axlsx::Color.new(rgb: 'cccccc').rgb)
|
33
33
|
end
|
34
34
|
it 'runs blocks for selectors' do
|
35
|
-
sheet.name.
|
35
|
+
expect(sheet.name).to eq('Test')
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
data/spec/types_spec.rb
CHANGED
@@ -19,19 +19,19 @@ HAML
|
|
19
19
|
|
20
20
|
context 'data types' do
|
21
21
|
it 'num' do
|
22
|
-
row.cells[0].value.
|
22
|
+
expect(row.cells[0].value).to eq(20)
|
23
23
|
end
|
24
24
|
|
25
25
|
it 'float' do
|
26
|
-
row.cells[1].type.
|
26
|
+
expect(row.cells[1].type).to be :float
|
27
27
|
end
|
28
28
|
|
29
29
|
it 'date' do
|
30
|
-
row.cells[2].type.
|
30
|
+
expect(row.cells[2].type).to be :date
|
31
31
|
end
|
32
32
|
|
33
33
|
it 'empty date' do
|
34
|
-
row.cells[3].type.
|
34
|
+
expect(row.cells[3].type).not_to be :date
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
data/spec/worksheets_spec.rb
CHANGED
metadata
CHANGED
@@ -1,97 +1,125 @@
|
|
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.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gleb Mazovetskiy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-08-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: nokogiri
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: caxlsx
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: chronic
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: responders
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
67
81
|
- !ruby/object:Gem::Version
|
68
82
|
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: haml-rails
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
|
-
- -
|
87
|
+
- - ">="
|
74
88
|
- !ruby/object:Gem::Version
|
75
89
|
version: '0'
|
76
90
|
type: :development
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
80
|
-
- -
|
94
|
+
- - ">="
|
81
95
|
- !ruby/object:Gem::Version
|
82
96
|
version: '0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: rspec-rails
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
86
100
|
requirements:
|
87
|
-
- -
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: combustion
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
88
116
|
- !ruby/object:Gem::Version
|
89
117
|
version: '0'
|
90
118
|
type: :development
|
91
119
|
prerelease: false
|
92
120
|
version_requirements: !ruby/object:Gem::Requirement
|
93
121
|
requirements:
|
94
|
-
- -
|
122
|
+
- - ">="
|
95
123
|
- !ruby/object:Gem::Version
|
96
124
|
version: '0'
|
97
125
|
description: Render XLSX from Rails using existing views ( .*.html => .xlsx )
|
@@ -99,32 +127,33 @@ email: glex.spb@gmail.com
|
|
99
127
|
executables: []
|
100
128
|
extensions: []
|
101
129
|
extra_rdoc_files:
|
102
|
-
- README.
|
130
|
+
- README.md
|
103
131
|
files:
|
104
|
-
- README.textile
|
105
132
|
- LICENSE
|
133
|
+
- README.md
|
106
134
|
- Rakefile
|
107
|
-
- lib/to_spreadsheet
|
135
|
+
- lib/to_spreadsheet.rb
|
108
136
|
- lib/to_spreadsheet/context.rb
|
137
|
+
- lib/to_spreadsheet/context/pairing.rb
|
109
138
|
- lib/to_spreadsheet/rails/action_pack_renderers.rb
|
110
139
|
- lib/to_spreadsheet/rails/mime_types.rb
|
111
140
|
- lib/to_spreadsheet/rails/view_helpers.rb
|
112
141
|
- lib/to_spreadsheet/railtie.rb
|
113
142
|
- lib/to_spreadsheet/renderer.rb
|
143
|
+
- lib/to_spreadsheet/rule.rb
|
114
144
|
- lib/to_spreadsheet/rule/base.rb
|
115
145
|
- lib/to_spreadsheet/rule/container.rb
|
116
146
|
- lib/to_spreadsheet/rule/default_value.rb
|
117
147
|
- lib/to_spreadsheet/rule/format.rb
|
118
148
|
- lib/to_spreadsheet/rule/sheet.rb
|
119
149
|
- lib/to_spreadsheet/rule/workbook.rb
|
120
|
-
- lib/to_spreadsheet/rule.rb
|
121
150
|
- lib/to_spreadsheet/selectors.rb
|
122
151
|
- lib/to_spreadsheet/themes/default.rb
|
123
152
|
- lib/to_spreadsheet/type_from_value.rb
|
124
153
|
- lib/to_spreadsheet/version.rb
|
125
|
-
- lib/to_spreadsheet.rb
|
126
154
|
- spec/defaults_spec.rb
|
127
155
|
- spec/format_spec.rb
|
156
|
+
- spec/rails_integration_spec.rb
|
128
157
|
- spec/types_spec.rb
|
129
158
|
- spec/worksheets_spec.rb
|
130
159
|
homepage: https://github.com/glebm/to_spreadsheet
|
@@ -136,22 +165,22 @@ require_paths:
|
|
136
165
|
- lib
|
137
166
|
required_ruby_version: !ruby/object:Gem::Requirement
|
138
167
|
requirements:
|
139
|
-
- -
|
168
|
+
- - ">="
|
140
169
|
- !ruby/object:Gem::Version
|
141
170
|
version: '0'
|
142
171
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
143
172
|
requirements:
|
144
|
-
- -
|
173
|
+
- - ">="
|
145
174
|
- !ruby/object:Gem::Version
|
146
175
|
version: '0'
|
147
176
|
requirements: []
|
148
|
-
|
149
|
-
rubygems_version: 2.0.3
|
177
|
+
rubygems_version: 3.1.2
|
150
178
|
signing_key:
|
151
179
|
specification_version: 4
|
152
180
|
summary: Render existing views as Excel documents with style!
|
153
181
|
test_files:
|
154
182
|
- spec/defaults_spec.rb
|
183
|
+
- spec/rails_integration_spec.rb
|
184
|
+
- spec/worksheets_spec.rb
|
155
185
|
- spec/format_spec.rb
|
156
186
|
- spec/types_spec.rb
|
157
|
-
- spec/worksheets_spec.rb
|
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) |
|