to_spreadsheet 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/to_spreadsheet.rb +2 -4
- data/lib/to_spreadsheet/context.rb +18 -2
- data/lib/to_spreadsheet/{action_pack_renderers.rb → rails/action_pack_renderers.rb} +24 -32
- data/lib/to_spreadsheet/{mime_types.rb → rails/mime_types.rb} +2 -2
- data/lib/to_spreadsheet/rails/view_helpers.rb +11 -0
- data/lib/to_spreadsheet/railtie.rb +11 -0
- data/lib/to_spreadsheet/renderer.rb +13 -17
- data/lib/to_spreadsheet/rule/format.rb +7 -14
- data/lib/to_spreadsheet/version.rb +3 -3
- data/spec/format_spec.rb +5 -2
- metadata +116 -101
- data/lib/to_spreadsheet/helpers.rb +0 -19
data/lib/to_spreadsheet.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
|
-
require 'nokogiri'
|
2
|
-
require 'to_spreadsheet/action_pack_renderers'
|
3
|
-
require 'to_spreadsheet/mime_types'
|
4
1
|
require 'to_spreadsheet/version'
|
5
|
-
require 'to_spreadsheet/helpers'
|
6
2
|
require 'to_spreadsheet/context'
|
3
|
+
require 'to_spreadsheet/renderer'
|
4
|
+
require 'to_spreadsheet/railtie' if defined?(Rails)
|
7
5
|
|
8
6
|
module ToSpreadsheet
|
9
7
|
class << self
|
@@ -17,10 +17,26 @@ module ToSpreadsheet
|
|
17
17
|
def global
|
18
18
|
@global ||= new
|
19
19
|
end
|
20
|
+
|
21
|
+
def current
|
22
|
+
Thread.current[:_to_spreadsheet_ctx]
|
23
|
+
end
|
24
|
+
|
25
|
+
def current=(ctx)
|
26
|
+
Thread.current[:_to_spreadsheet_ctx] = ctx
|
27
|
+
end
|
28
|
+
|
29
|
+
def with_context(ctx, &block)
|
30
|
+
old = current
|
31
|
+
self.current = ctx
|
32
|
+
r = block.call(ctx)
|
33
|
+
self.current = old
|
34
|
+
r
|
35
|
+
end
|
20
36
|
end
|
21
37
|
|
22
38
|
def initialize(wb_options = nil)
|
23
|
-
@rules
|
39
|
+
@rules = []
|
24
40
|
workbook wb_options if wb_options
|
25
41
|
end
|
26
42
|
|
@@ -83,7 +99,7 @@ module ToSpreadsheet
|
|
83
99
|
|
84
100
|
# A new context
|
85
101
|
def merge(other_context)
|
86
|
-
ctx
|
102
|
+
ctx = Context.new()
|
87
103
|
ctx.rules = rules + other_context.rules
|
88
104
|
ctx
|
89
105
|
end
|
@@ -1,32 +1,24 @@
|
|
1
|
-
require 'active_support'
|
2
|
-
require 'action_controller/metal/renderers'
|
3
|
-
require 'action_controller/metal/responder'
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
# This sets up a default render call for when you do
|
26
|
-
# respond_to do |format|
|
27
|
-
# format.xlsx
|
28
|
-
# end
|
29
|
-
def to_xlsx
|
30
|
-
controller.render xlsx: controller.action_name
|
31
|
-
end
|
32
|
-
end
|
1
|
+
require 'active_support'
|
2
|
+
require 'action_controller/metal/renderers'
|
3
|
+
require 'action_controller/metal/responder'
|
4
|
+
|
5
|
+
# This will let us do thing like `render :xlsx => 'index'`
|
6
|
+
# This is similar to how Rails internally implements its :json and :xml renderers
|
7
|
+
ActionController::Renderers.add :xlsx do |template, options|
|
8
|
+
filename = options[:filename] || options[:template] || 'data'
|
9
|
+
data = ToSpreadsheet::Context.with_context ToSpreadsheet::Context.global.merge(ToSpreadsheet::Context.new) do |context|
|
10
|
+
html = render_to_string(template, options.merge(template: template, formats: ['html']))
|
11
|
+
ToSpreadsheet::Renderer.to_data(html, context)
|
12
|
+
end
|
13
|
+
send_data data, type: :xlsx, disposition: %(attachment; filename="#{filename}.xlsx")
|
14
|
+
end
|
15
|
+
|
16
|
+
class ActionController::Responder
|
17
|
+
# This sets up a default render call for when you do
|
18
|
+
# respond_to do |format|
|
19
|
+
# format.xlsx
|
20
|
+
# end
|
21
|
+
def to_xlsx
|
22
|
+
controller.render xlsx: controller.action_name
|
23
|
+
end
|
24
|
+
end
|
@@ -1,2 +1,2 @@
|
|
1
|
-
require 'action_dispatch/http/mime_type'
|
2
|
-
Mime::Type.register "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", :xlsx unless Mime::Type.lookup_by_extension(:xlsx)
|
1
|
+
require 'action_dispatch/http/mime_type'
|
2
|
+
Mime::Type.register "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", :xlsx unless Mime::Type.lookup_by_extension(:xlsx)
|
@@ -0,0 +1,11 @@
|
|
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
|
+
module ToSpreadsheet
|
6
|
+
class Railtie < ::Rails::Railtie
|
7
|
+
initializer "to_spreadsheet.view_helpers" do
|
8
|
+
ActionView::Base.send :include, ToSpreadsheet::Rails::ViewHelpers
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -1,34 +1,30 @@
|
|
1
1
|
require 'axlsx'
|
2
|
+
require 'nokogiri'
|
3
|
+
|
2
4
|
module ToSpreadsheet
|
3
5
|
module Renderer
|
4
6
|
extend self
|
5
7
|
|
6
|
-
def to_stream(html,
|
7
|
-
to_package(html,
|
8
|
+
def to_stream(html, context = nil)
|
9
|
+
to_package(html, context).to_stream
|
8
10
|
end
|
9
11
|
|
10
|
-
def to_data(html,
|
11
|
-
to_package(html,
|
12
|
+
def to_data(html, context = nil)
|
13
|
+
to_package(html, context).to_stream.read
|
12
14
|
end
|
13
15
|
|
14
|
-
def to_package(html,
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
end
|
21
|
-
package
|
16
|
+
def to_package(html, context = nil)
|
17
|
+
context ||= ToSpreadsheet::Context.global.merge(Context.new)
|
18
|
+
package = build_package(html, context)
|
19
|
+
context.rules.each do |rule|
|
20
|
+
#Rails.logger.debug "Applying #{rule}"
|
21
|
+
rule.apply(context, package)
|
22
22
|
end
|
23
|
+
package
|
23
24
|
end
|
24
25
|
|
25
26
|
private
|
26
27
|
|
27
|
-
def init_context(local_context)
|
28
|
-
local_context ||= ToSpreadsheet::Context.new
|
29
|
-
ToSpreadsheet::Context.global.merge local_context
|
30
|
-
end
|
31
|
-
|
32
28
|
def build_package(html, context)
|
33
29
|
package = ::Axlsx::Package.new
|
34
30
|
spreadsheet = package.workbook
|
@@ -5,10 +5,11 @@ module ToSpreadsheet
|
|
5
5
|
class Format < Base
|
6
6
|
include ::ToSpreadsheet::TypeFromValue
|
7
7
|
def apply(context, sheet)
|
8
|
+
wb = sheet.workbook
|
8
9
|
case selector_type
|
9
10
|
when :css
|
10
11
|
css_match selector_query, context.to_xml_node(sheet) do |xml_node|
|
11
|
-
|
12
|
+
add_and_apply_style wb, context, context.to_xls_entity(xml_node)
|
12
13
|
end
|
13
14
|
when :row
|
14
15
|
sheet.row_style selector_query, options if options.present?
|
@@ -17,7 +18,7 @@ module ToSpreadsheet
|
|
17
18
|
sheet.col_style selector_query, inline_styles if inline_styles.present?
|
18
19
|
apply_col_info sheet.column_info[selector_query]
|
19
20
|
when :range
|
20
|
-
|
21
|
+
add_and_apply_style wb, range_match(selector_type, sheet), context
|
21
22
|
end
|
22
23
|
end
|
23
24
|
|
@@ -32,7 +33,7 @@ module ToSpreadsheet
|
|
32
33
|
end
|
33
34
|
end
|
34
35
|
|
35
|
-
def
|
36
|
+
def add_and_apply_style(wb, context, xls_ent)
|
36
37
|
# Custom format rule
|
37
38
|
# format 'td.sel', lambda { |node| ...}
|
38
39
|
if self.options.is_a?(Proc)
|
@@ -47,17 +48,9 @@ module ToSpreadsheet
|
|
47
48
|
options[k] = context.instance_exec(xls_ent, &v) if v.is_a?(Proc)
|
48
49
|
end
|
49
50
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
setter = :"#{k}="
|
54
|
-
xls_ent.send setter, v if xls_ent.respond_to?(setter)
|
55
|
-
if xls_ent.respond_to?(:cells)
|
56
|
-
xls_ent.cells.each do |cell|
|
57
|
-
cell.send setter, v if cell.respond_to?(setter)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
51
|
+
style = wb.styles.add_style options
|
52
|
+
cells = xls_ent.respond_to?(:cells) ? xls_ent.cells : [xls_ent]
|
53
|
+
cells.each { |cell| cell.style = style }
|
61
54
|
end
|
62
55
|
end
|
63
56
|
end
|
@@ -1,3 +1,3 @@
|
|
1
|
-
module ToSpreadsheet
|
2
|
-
VERSION = '1.0.
|
3
|
-
end
|
1
|
+
module ToSpreadsheet
|
2
|
+
VERSION = '1.0.1'
|
3
|
+
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',
|
9
|
+
format 'tr', fg_color: lambda { |row| 'cccccc' if row.index.odd? }
|
10
10
|
end
|
11
11
|
%table
|
12
12
|
%tr
|
@@ -23,7 +23,10 @@ describe ToSpreadsheet::Rule::Format do
|
|
23
23
|
sheet.column_info[0].width.should == 25
|
24
24
|
end
|
25
25
|
it 'runs lambdas' do
|
26
|
-
sheet.rows[1].cells[0]
|
26
|
+
cell = sheet.rows[1].cells[0]
|
27
|
+
styles = sheet.workbook.styles
|
28
|
+
font_id = styles.cellXfs[cell.style].fontId
|
29
|
+
styles.fonts[font_id].color.rgb.should == Axlsx::Color.new(rgb: 'cccccc').rgb
|
27
30
|
end
|
28
31
|
end
|
29
32
|
end
|
metadata
CHANGED
@@ -1,111 +1,128 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: to_spreadsheet
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
5
|
-
|
6
|
-
- 1
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
version: 1.0.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 1.0.1
|
10
6
|
platform: ruby
|
11
|
-
authors:
|
7
|
+
authors:
|
12
8
|
- Gleb Mazovetskiy
|
13
9
|
autorequire:
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
12
|
+
date: 2012-12-04 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
version_requirements: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ! '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
none: false
|
21
21
|
name: rails
|
22
|
-
prerelease: false
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
-
requirements:
|
25
|
-
- - ">="
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
segments:
|
28
|
-
- 0
|
29
|
-
version: "0"
|
30
22
|
type: :runtime
|
31
|
-
version_requirements: *id001
|
32
|
-
- !ruby/object:Gem::Dependency
|
33
|
-
name: nokogiri
|
34
23
|
prerelease: false
|
35
|
-
requirement:
|
36
|
-
requirements:
|
37
|
-
- -
|
38
|
-
- !ruby/object:Gem::Version
|
39
|
-
|
40
|
-
|
41
|
-
|
24
|
+
requirement: !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - ! '>='
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
version: '0'
|
29
|
+
none: false
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
version_requirements: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - ! '>='
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '0'
|
36
|
+
none: false
|
37
|
+
name: nokogiri
|
42
38
|
type: :runtime
|
43
|
-
version_requirements: *id002
|
44
|
-
- !ruby/object:Gem::Dependency
|
45
|
-
name: axlsx
|
46
39
|
prerelease: false
|
47
|
-
requirement:
|
48
|
-
requirements:
|
49
|
-
- -
|
50
|
-
- !ruby/object:Gem::Version
|
51
|
-
|
52
|
-
|
53
|
-
|
40
|
+
requirement: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ! '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
45
|
+
none: false
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
version_requirements: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - ! '>='
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
52
|
+
none: false
|
53
|
+
name: axlsx
|
54
54
|
type: :runtime
|
55
|
-
version_requirements: *id003
|
56
|
-
- !ruby/object:Gem::Dependency
|
57
|
-
name: chronic
|
58
55
|
prerelease: false
|
59
|
-
requirement:
|
60
|
-
requirements:
|
61
|
-
- -
|
62
|
-
- !ruby/object:Gem::Version
|
63
|
-
|
64
|
-
|
65
|
-
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ! '>='
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
none: false
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ! '>='
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
none: false
|
69
|
+
name: chronic
|
66
70
|
type: :runtime
|
67
|
-
version_requirements: *id004
|
68
|
-
- !ruby/object:Gem::Dependency
|
69
|
-
name: mocha
|
70
71
|
prerelease: false
|
71
|
-
requirement:
|
72
|
-
requirements:
|
73
|
-
- -
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
|
76
|
-
|
77
|
-
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
none: false
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ! '>='
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
none: false
|
85
|
+
name: mocha
|
78
86
|
type: :development
|
79
|
-
version_requirements: *id005
|
80
|
-
- !ruby/object:Gem::Dependency
|
81
|
-
name: sqlite3-ruby
|
82
87
|
prerelease: false
|
83
|
-
requirement:
|
84
|
-
requirements:
|
85
|
-
- -
|
86
|
-
- !ruby/object:Gem::Version
|
87
|
-
|
88
|
-
|
89
|
-
|
88
|
+
requirement: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - ! '>='
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '0'
|
93
|
+
none: false
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
version_requirements: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ! '>='
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
none: false
|
101
|
+
name: sqlite3-ruby
|
90
102
|
type: :development
|
91
|
-
|
103
|
+
prerelease: false
|
104
|
+
requirement: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - ! '>='
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
109
|
+
none: false
|
92
110
|
description: Rendering spreadsheets from Rails made easy
|
93
111
|
email: glex.spb@gmail.com
|
94
112
|
executables: []
|
95
|
-
|
96
113
|
extensions: []
|
97
|
-
|
98
|
-
extra_rdoc_files:
|
114
|
+
extra_rdoc_files:
|
99
115
|
- README.textile
|
100
|
-
files:
|
116
|
+
files:
|
101
117
|
- README.textile
|
102
118
|
- LICENSE
|
103
119
|
- Rakefile
|
104
|
-
- lib/to_spreadsheet/action_pack_renderers.rb
|
105
120
|
- lib/to_spreadsheet/context/pairing.rb
|
106
121
|
- lib/to_spreadsheet/context.rb
|
107
|
-
- lib/to_spreadsheet/
|
108
|
-
- lib/to_spreadsheet/mime_types.rb
|
122
|
+
- lib/to_spreadsheet/rails/action_pack_renderers.rb
|
123
|
+
- lib/to_spreadsheet/rails/mime_types.rb
|
124
|
+
- lib/to_spreadsheet/rails/view_helpers.rb
|
125
|
+
- lib/to_spreadsheet/railtie.rb
|
109
126
|
- lib/to_spreadsheet/renderer.rb
|
110
127
|
- lib/to_spreadsheet/rule/base.rb
|
111
128
|
- lib/to_spreadsheet/rule/container.rb
|
@@ -119,37 +136,35 @@ files:
|
|
119
136
|
- lib/to_spreadsheet/type_from_value.rb
|
120
137
|
- lib/to_spreadsheet/version.rb
|
121
138
|
- lib/to_spreadsheet.rb
|
122
|
-
|
139
|
+
- spec/defaults_spec.rb
|
140
|
+
- spec/format_spec.rb
|
141
|
+
- spec/types_spec.rb
|
142
|
+
- spec/worksheets_spec.rb
|
123
143
|
homepage: https://github.com/glebm/to_spreadsheet
|
124
144
|
licenses: []
|
125
|
-
|
126
145
|
post_install_message:
|
127
146
|
rdoc_options: []
|
128
|
-
|
129
|
-
require_paths:
|
147
|
+
require_paths:
|
130
148
|
- lib
|
131
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
132
|
-
requirements:
|
133
|
-
- -
|
134
|
-
- !ruby/object:Gem::Version
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
- 0
|
144
|
-
version: "0"
|
149
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
150
|
+
requirements:
|
151
|
+
- - ! '>='
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: '0'
|
154
|
+
none: false
|
155
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ! '>='
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
none: false
|
145
161
|
requirements: []
|
146
|
-
|
147
162
|
rubyforge_project:
|
148
|
-
rubygems_version: 1.
|
163
|
+
rubygems_version: 1.8.24
|
149
164
|
signing_key:
|
150
165
|
specification_version: 3
|
151
166
|
summary: Render existing views as Excel documents with style!
|
152
|
-
test_files:
|
167
|
+
test_files:
|
153
168
|
- spec/defaults_spec.rb
|
154
169
|
- spec/format_spec.rb
|
155
170
|
- spec/types_spec.rb
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module ToSpreadsheet
|
2
|
-
module Helpers
|
3
|
-
def format_xls(selector = nil, &block)
|
4
|
-
context.format_xls selector, &block
|
5
|
-
end
|
6
|
-
|
7
|
-
def context
|
8
|
-
@context || ToSpreadsheet::Context.global
|
9
|
-
end
|
10
|
-
|
11
|
-
def with_context(context, &block)
|
12
|
-
context_was = self.context
|
13
|
-
@context = context
|
14
|
-
result = block.call
|
15
|
-
@context = context_was
|
16
|
-
result
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|