osheet 0.10.0 → 1.0.0.rc.1
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.
- data/Gemfile +0 -1
- data/Gemfile.lock +9 -6
- data/Rakefile +35 -19
- data/bench/bench_runner.rb +91 -0
- data/bench/profiler_runner.rb +1 -0
- data/examples/basic.rb +1 -1
- data/examples/basic.xls +2 -1
- data/examples/basic_with_templates.rb +2 -2
- data/examples/basic_with_templates.xls +3 -3
- data/examples/formats.rb +2 -2
- data/examples/formats.xls +46 -46
- data/examples/formula.rb +2 -2
- data/examples/styles.rb +2 -2
- data/examples/styles.xls +5 -5
- data/examples/trivial.rb +2 -2
- data/lib/osheet/cell.rb +48 -46
- data/lib/osheet/column.rb +23 -29
- data/lib/osheet/format.rb +3 -3
- data/lib/osheet/meta_element.rb +2 -1
- data/lib/osheet/mixin.rb +21 -9
- data/lib/osheet/partial.rb +5 -9
- data/lib/osheet/row.rb +28 -32
- data/lib/osheet/style.rb +11 -25
- data/lib/osheet/styled_element.rb +9 -1
- data/lib/osheet/template.rb +3 -8
- data/lib/osheet/version.rb +1 -1
- data/lib/osheet/workbook.rb +135 -43
- data/lib/osheet/workbook_api.rb +208 -0
- data/lib/osheet/workbook_element.rb +225 -8
- data/lib/osheet/worksheet.rb +22 -28
- data/lib/osheet/xmlss_writer/style_cache.rb +64 -0
- data/lib/osheet/xmlss_writer/style_settings.rb +148 -0
- data/lib/osheet/xmlss_writer.rb +143 -1
- data/lib/osheet.rb +3 -29
- data/osheet.gemspec +4 -1
- data/test/cell_test.rb +33 -98
- data/test/column_test.rb +20 -88
- data/test/{mixins.rb → fixtures/mixins.rb} +6 -4
- data/test/fixtures/test_writer.rb +68 -0
- data/test/format_test.rb +2 -2
- data/test/helper.rb +34 -68
- data/test/mixin_test.rb +37 -43
- data/test/partial_test.rb +3 -26
- data/test/row_test.rb +32 -85
- data/test/style_test.rb +9 -26
- data/test/template_test.rb +5 -6
- data/test/workbook_element_test.rb +231 -0
- data/test/workbook_test.rb +225 -116
- data/test/worksheet_test.rb +51 -98
- data/test/xmlss_writer/api_test.rb +139 -0
- data/test/xmlss_writer/style_cache_test.rb +65 -0
- data/test/xmlss_writer/style_settings_test.rb +263 -0
- data/test/xmlss_writer/styles_test.rb +121 -153
- data/test/xmlss_writer_test.rb +91 -0
- metadata +75 -50
- data/lib/osheet/associations.rb +0 -58
- data/lib/osheet/instance.rb +0 -30
- data/lib/osheet/markup_element.rb +0 -22
- data/lib/osheet/partial_set.rb +0 -57
- data/lib/osheet/railtie.rb +0 -9
- data/lib/osheet/style_set.rb +0 -39
- data/lib/osheet/template_set.rb +0 -51
- data/lib/osheet/view_handler/rails.rb +0 -44
- data/lib/osheet/view_handler/tilt.rb +0 -42
- data/lib/osheet/view_handler.rb +0 -2
- data/lib/osheet/worksheet_element.rb +0 -17
- data/lib/osheet/xmlss_writer/base.rb +0 -49
- data/lib/osheet/xmlss_writer/elements.rb +0 -56
- data/lib/osheet/xmlss_writer/styles.rb +0 -216
- data/test/osheet_test.rb +0 -13
- data/test/partial_set_test.rb +0 -64
- data/test/style_set_test.rb +0 -47
- data/test/template_set_test.rb +0 -74
- data/test/xmlss_writer/base_test.rb +0 -103
- data/test/xmlss_writer/elements_test.rb +0 -172
@@ -0,0 +1,208 @@
|
|
1
|
+
module Osheet; end
|
2
|
+
module Osheet::WorkbookApi
|
3
|
+
|
4
|
+
# reference API
|
5
|
+
|
6
|
+
[ :templates,
|
7
|
+
:partials,
|
8
|
+
:styles
|
9
|
+
].each do |meth|
|
10
|
+
define_method(meth) do |*args|
|
11
|
+
workbook.send(meth, *args)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def worksheets
|
16
|
+
workbook.worksheets
|
17
|
+
end
|
18
|
+
|
19
|
+
def columns
|
20
|
+
worksheets.last.columns
|
21
|
+
end
|
22
|
+
|
23
|
+
def rows
|
24
|
+
worksheets.last.rows
|
25
|
+
end
|
26
|
+
|
27
|
+
def cells
|
28
|
+
rows.last.cells
|
29
|
+
end
|
30
|
+
|
31
|
+
# markup handling API
|
32
|
+
|
33
|
+
def template(*args, &build)
|
34
|
+
Osheet::Template.new(*args, &build).tap do |template|
|
35
|
+
element_stack.current.template(template)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def partial(*args, &build)
|
40
|
+
Osheet::Partial.new(*args, &build).tap do |partial|
|
41
|
+
element_stack.current.partial(partial)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class StyleBuild
|
46
|
+
|
47
|
+
def initialize(scope, *args, &build)
|
48
|
+
@scope = scope
|
49
|
+
@style = Osheet::Style.new(*args, &build)
|
50
|
+
end
|
51
|
+
|
52
|
+
def add
|
53
|
+
@scope.element_stack.current.style(@style)
|
54
|
+
if block_given?
|
55
|
+
@scope.element_stack.using(@style) { yield @style.build }
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def style(*args, &build)
|
61
|
+
StyleBuild.new(self, *args, &build).add do |build|
|
62
|
+
build.call
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# element handling API
|
67
|
+
|
68
|
+
class TemplatedElement
|
69
|
+
|
70
|
+
# this class is used to create elements that can be templated.
|
71
|
+
# Arguments are handled differently if building an element from
|
72
|
+
# a template vs. building from a build block.
|
73
|
+
# After the element is built, it is added to the current stack element
|
74
|
+
# and either the build or writer is called.
|
75
|
+
|
76
|
+
ELEMENT_CLASS = {
|
77
|
+
:worksheet => Osheet::Worksheet,
|
78
|
+
:column => Osheet::Column,
|
79
|
+
:row => Osheet::Row,
|
80
|
+
:cell => Osheet::Cell
|
81
|
+
}
|
82
|
+
|
83
|
+
def initialize(scope, name, *args, &build)
|
84
|
+
@scope = scope
|
85
|
+
@workbook = @scope.workbook
|
86
|
+
@name = name
|
87
|
+
@args = args
|
88
|
+
if (@template = @workbook.templates.get(@name, @args.first))
|
89
|
+
@element = ELEMENT_CLASS[@name].new
|
90
|
+
@build = Proc.new { @scope.instance_exec(*@args[1..-1], &@template) }
|
91
|
+
else
|
92
|
+
@element = ELEMENT_CLASS[@name].new(*@args)
|
93
|
+
@build = build || Proc.new {}
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def add
|
98
|
+
@scope.element_stack.current.send(@name, @element)
|
99
|
+
@scope.element_stack.using(@element) do
|
100
|
+
if @scope.writer
|
101
|
+
@scope.writer.send(@name, @element, &@build)
|
102
|
+
else
|
103
|
+
@build.call
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
# used on: workbook
|
111
|
+
def worksheet(*args, &block)
|
112
|
+
if args.empty? && block.nil?
|
113
|
+
worksheets.last
|
114
|
+
else
|
115
|
+
TemplatedElement.new(self, :worksheet, *args, &block).add
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
# used on: worksheet
|
120
|
+
def column(*args, &block)
|
121
|
+
TemplatedElement.new(self, :column, *args, &block).add
|
122
|
+
end
|
123
|
+
|
124
|
+
# used on: worksheet
|
125
|
+
def row(*args, &block)
|
126
|
+
if args.empty? && block.nil?
|
127
|
+
rows.last
|
128
|
+
else
|
129
|
+
TemplatedElement.new(self, :row, *args, &block).add
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
# used on: row
|
134
|
+
def cell(*args, &block)
|
135
|
+
if args.empty? && block.nil?
|
136
|
+
cells.last
|
137
|
+
else
|
138
|
+
TemplatedElement.new(self, :cell, *args, &block).add
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
# style attribute API
|
143
|
+
|
144
|
+
Osheet::Style::SETTINGS.each do |setting|
|
145
|
+
define_method(setting) do |*args|
|
146
|
+
element_stack.current.send(setting, *args)
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
def border(*args)
|
151
|
+
element_stack.current.border(*args)
|
152
|
+
end
|
153
|
+
|
154
|
+
# element attribute API
|
155
|
+
|
156
|
+
def meta(*args)
|
157
|
+
element_stack.current.meta(*args)
|
158
|
+
end
|
159
|
+
|
160
|
+
# on both style_class and format attribute updates
|
161
|
+
# call the writer's style hook, passing it the current element's
|
162
|
+
# style_class and format values. Both are needed to write
|
163
|
+
# an elements style data and style_id.
|
164
|
+
|
165
|
+
# used by: column, row, cell
|
166
|
+
def style_class(value)
|
167
|
+
current_class = element_stack.current.style_class(value) # for self referencing
|
168
|
+
if self.writer # for writing
|
169
|
+
self.writer.style(current_class, element_stack.current.format)
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
# used by: cell
|
174
|
+
def format(*args)
|
175
|
+
current_format = element_stack.current.format(*args) # for self referencing
|
176
|
+
if self.writer # for writing
|
177
|
+
self.writer.style(element_stack.current.style_class, current_format)
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
# used by: workbook_element
|
182
|
+
def title(*args)
|
183
|
+
element_stack.current.title(*args)
|
184
|
+
end
|
185
|
+
|
186
|
+
[ :name, # worksheet
|
187
|
+
:width, # column
|
188
|
+
:height, # row
|
189
|
+
:autofit, # column, row
|
190
|
+
:autofit?, # column, row
|
191
|
+
:hidden, # column, row
|
192
|
+
:hidden?, # column, row
|
193
|
+
:data, # cell
|
194
|
+
:href, # cell
|
195
|
+
:formula, # cell
|
196
|
+
:index, # cell
|
197
|
+
:rowspan, # cell
|
198
|
+
:colspan, # cell
|
199
|
+
].each do |meth|
|
200
|
+
define_method(meth) do |*args|
|
201
|
+
element_stack.current.send(meth, *args) # for self referencing
|
202
|
+
if self.writer # for writing
|
203
|
+
self.writer.send(meth, *args)
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
end
|
@@ -1,17 +1,234 @@
|
|
1
|
-
|
1
|
+
require 'osheet/style'
|
2
|
+
require 'osheet/worksheet'
|
3
|
+
|
4
|
+
module Osheet
|
5
|
+
|
6
|
+
|
7
|
+
class WorkbookElement
|
8
|
+
|
9
|
+
# This 'WorkbookElement' class handles all workbook state. It is setup
|
10
|
+
# and referenced by the 'Workbook' class when it runs builds
|
11
|
+
|
12
|
+
class PartialSet < ::Hash; end
|
13
|
+
class TemplateSet < PartialSet; end
|
14
|
+
class StyleSet < ::Array; end
|
15
|
+
class WorksheetSet < ::Array; end
|
16
|
+
|
17
|
+
attr_reader :title
|
18
|
+
attr_reader :templates, :partials, :styles, :worksheets
|
19
|
+
|
20
|
+
def initialize
|
21
|
+
@title = nil
|
22
|
+
|
23
|
+
@templates = TemplateSet.new
|
24
|
+
@partials = PartialSet.new
|
25
|
+
@styles = StyleSet.new
|
26
|
+
@worksheets = WorksheetSet.new
|
27
|
+
end
|
28
|
+
|
29
|
+
def title(value=nil)
|
30
|
+
value.nil? ? @title : @title = value.to_s
|
31
|
+
end
|
32
|
+
|
33
|
+
def template(template)
|
34
|
+
@templates << template
|
35
|
+
end
|
36
|
+
|
37
|
+
def partial(partial)
|
38
|
+
@partials << partial
|
39
|
+
end
|
40
|
+
|
41
|
+
def style(style)
|
42
|
+
@styles << style
|
43
|
+
end
|
44
|
+
|
45
|
+
def worksheet(worksheet)
|
46
|
+
@worksheets << worksheet
|
47
|
+
end
|
48
|
+
|
49
|
+
def styles(*args)
|
50
|
+
@styles.for(*args)
|
51
|
+
end
|
52
|
+
|
53
|
+
def ==(other)
|
54
|
+
title == other.title &&
|
55
|
+
templates == other.templates &&
|
56
|
+
partials == other.partials &&
|
57
|
+
styles == other.styles &&
|
58
|
+
worksheets == other.worksheets
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
class WorkbookElement::PartialSet
|
66
|
+
|
67
|
+
# this class is a Hash that behaves kinda like a set. I want to
|
68
|
+
# push partials into the set using the '<<' operator, only allow
|
69
|
+
# Osheet::Partial objs to be pushed, and then be able to reference
|
70
|
+
# a particular partial using its name
|
71
|
+
|
72
|
+
def initialize
|
73
|
+
super
|
74
|
+
end
|
75
|
+
|
76
|
+
def <<(partial)
|
77
|
+
if (key = verify(partial))
|
78
|
+
push(key, partial)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# return the named partial
|
83
|
+
def get(name)
|
84
|
+
lookup(key(name.to_s))
|
85
|
+
end
|
86
|
+
|
87
|
+
private
|
88
|
+
|
89
|
+
def lookup(key)
|
90
|
+
self[key]
|
91
|
+
end
|
92
|
+
|
93
|
+
# push the partial onto the key
|
94
|
+
def push(key, partial)
|
95
|
+
self[key] = partial
|
96
|
+
end
|
97
|
+
|
98
|
+
# verify the partial, init and return the key
|
99
|
+
# otherwise ArgumentError it up
|
100
|
+
def verify(partial)
|
101
|
+
unless partial.kind_of?(Partial)
|
102
|
+
raise ArgumentError, 'you can only push Osheet::Partial objs to the partial set'
|
103
|
+
end
|
104
|
+
pkey = partial_key(partial)
|
105
|
+
self[pkey] ||= nil
|
106
|
+
pkey
|
107
|
+
end
|
108
|
+
|
109
|
+
def partial_key(partial)
|
110
|
+
key(partial.instance_variable_get("@name"))
|
111
|
+
end
|
112
|
+
|
113
|
+
def key(name)
|
114
|
+
name.to_s
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
|
120
|
+
|
121
|
+
class WorkbookElement::TemplateSet < WorkbookElement::PartialSet
|
122
|
+
|
123
|
+
# this class is a PartialSet that keys off of the template element
|
124
|
+
# and name. Only Osheet::Template objs can be pushed, and you reference
|
125
|
+
# a particular template by its element and name
|
126
|
+
|
127
|
+
def initialize
|
128
|
+
super
|
129
|
+
end
|
130
|
+
|
131
|
+
# return the template set for the named element
|
132
|
+
def get(element, name)
|
133
|
+
lookup(key(element.to_s, name.to_s))
|
134
|
+
end
|
135
|
+
|
136
|
+
private
|
137
|
+
|
138
|
+
def lookup(key)
|
139
|
+
self[key.first][key.last] if self[key.first]
|
140
|
+
end
|
141
|
+
|
142
|
+
# push the template onto the key
|
143
|
+
def push(key, template)
|
144
|
+
self[key.first][key.last] = template
|
145
|
+
end
|
146
|
+
|
147
|
+
# verify the template, init the key set, and return the key string
|
148
|
+
# otherwise ArgumentError it up
|
149
|
+
def verify(template)
|
150
|
+
unless template.kind_of?(Template)
|
151
|
+
raise ArgumentError, 'you can only push Osheet::Template objs to the template set'
|
152
|
+
end
|
153
|
+
key = template_key(template)
|
154
|
+
self[key.first] ||= {}
|
155
|
+
self[key.first][key.last] ||= nil
|
156
|
+
key
|
157
|
+
end
|
158
|
+
|
159
|
+
def template_key(template)
|
160
|
+
key(template.instance_variable_get("@element"), template.instance_variable_get("@name"))
|
161
|
+
end
|
162
|
+
|
163
|
+
def key(element, name)
|
164
|
+
[element.to_s, name.to_s]
|
165
|
+
end
|
2
166
|
|
3
|
-
def workbook
|
4
|
-
get_ivar(:workbook)
|
5
167
|
end
|
6
168
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
169
|
+
|
170
|
+
|
171
|
+
class WorkbookElement::StyleSet < ::Array
|
172
|
+
|
173
|
+
# this class is an Array with some helper methods. I want to
|
174
|
+
# push styles into the set using the '<<' operator, only allow
|
175
|
+
# Osheet::Style objs to be pushed, and then be able to reference
|
176
|
+
# a particular set of styles using a style class.
|
177
|
+
|
178
|
+
def initialize
|
179
|
+
super
|
180
|
+
end
|
181
|
+
|
182
|
+
def <<(value)
|
183
|
+
super if verify(value)
|
184
|
+
end
|
185
|
+
|
186
|
+
# return the style set for the style class
|
187
|
+
def for(style_class=nil)
|
188
|
+
style_class.nil? ? self : self.select{|s| s.match?(style_class)}
|
189
|
+
end
|
190
|
+
|
191
|
+
private
|
192
|
+
|
193
|
+
# verify the style, otherwise ArgumentError it up
|
194
|
+
def verify(style)
|
195
|
+
if style.kind_of?(Style)
|
196
|
+
true
|
197
|
+
else
|
198
|
+
raise ArgumentError, 'you can only push Osheet::Style objs to the style set'
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
end
|
203
|
+
|
204
|
+
|
205
|
+
|
206
|
+
class WorkbookElement::WorksheetSet < ::Array
|
207
|
+
|
208
|
+
# this class is just a wrapper to Array. I want to push worksheets
|
209
|
+
# into the set using the '<<' operator, but only allow Worksheet objs
|
210
|
+
# to be pushed.
|
211
|
+
|
212
|
+
def initialize
|
213
|
+
super
|
214
|
+
end
|
215
|
+
|
216
|
+
def <<(value)
|
217
|
+
super if verify(value)
|
218
|
+
end
|
219
|
+
|
220
|
+
private
|
221
|
+
|
222
|
+
# verify the worksheet, otherwise ArgumentError it up
|
223
|
+
def verify(worksheet)
|
224
|
+
if worksheet.kind_of?(Worksheet)
|
225
|
+
true
|
11
226
|
else
|
12
|
-
|
227
|
+
raise ArgumentError, 'can only push Osheet::Worksheet to the set'
|
13
228
|
end
|
14
229
|
end
|
230
|
+
|
15
231
|
end
|
16
232
|
|
233
|
+
|
17
234
|
end
|
data/lib/osheet/worksheet.rb
CHANGED
@@ -1,44 +1,38 @@
|
|
1
|
+
require 'osheet/meta_element'
|
1
2
|
require 'osheet/column'
|
2
3
|
require 'osheet/row'
|
3
4
|
|
5
|
+
# this class is collects and validates worksheet meta-data. It allows
|
6
|
+
# for storing a set of columns for referencing when building rows. It is
|
7
|
+
# up to the writer to take this data and use it as needed.
|
8
|
+
|
4
9
|
module Osheet
|
5
10
|
class Worksheet
|
6
|
-
|
7
|
-
include Associations
|
8
|
-
include WorkbookElement
|
11
|
+
|
9
12
|
include MetaElement
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
set_ivar(:name, nil)
|
18
|
-
if block_given?
|
19
|
-
set_binding_ivars(block.binding)
|
20
|
-
instance_exec(*args, &block)
|
21
|
-
end
|
13
|
+
|
14
|
+
attr_reader :columns, :rows
|
15
|
+
|
16
|
+
def initialize(name=nil, *args)
|
17
|
+
@name = name
|
18
|
+
@columns = []
|
19
|
+
@rows = []
|
22
20
|
end
|
23
21
|
|
24
22
|
def name(value=nil)
|
25
|
-
|
23
|
+
value.nil? ? @name : @name = value.to_s
|
26
24
|
end
|
27
25
|
|
28
|
-
def
|
29
|
-
|
26
|
+
def column(column_obj)
|
27
|
+
@columns << column_obj
|
30
28
|
end
|
31
29
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
if name_value.to_s.length > 31
|
39
|
-
raise ArgumentError, "worksheet names must be less than 32 characters long"
|
40
|
-
end
|
41
|
-
name_value.to_s
|
30
|
+
# Osheet only stores the latest row in memory for reference
|
31
|
+
# memory bloat would be unmanageable in large spreadsheets if
|
32
|
+
# all rows were stored
|
33
|
+
def row(row_obj)
|
34
|
+
@rows.pop
|
35
|
+
@rows << row_obj
|
42
36
|
end
|
43
37
|
|
44
38
|
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'osheet/style'
|
2
|
+
require 'osheet/xmlss_writer'
|
3
|
+
require 'osheet/xmlss_writer/style_settings'
|
4
|
+
|
5
|
+
class Osheet::XmlssWriter
|
6
|
+
class StyleCache
|
7
|
+
|
8
|
+
attr_reader :styles
|
9
|
+
|
10
|
+
def initialize(osheet_workbook, xmlss_workbook)
|
11
|
+
@osheet_workbook = osheet_workbook
|
12
|
+
@xmlss_workbook = xmlss_workbook
|
13
|
+
@styles = {}
|
14
|
+
end
|
15
|
+
|
16
|
+
def [](key); @styles[key]; end
|
17
|
+
def empty?; @styles.empty?; end
|
18
|
+
def size; @styles.keys.size; end
|
19
|
+
|
20
|
+
def keys
|
21
|
+
@styles.keys
|
22
|
+
end
|
23
|
+
|
24
|
+
def get(style_class, format)
|
25
|
+
# generate the style key and get the get the cached style or
|
26
|
+
# build and cache and return a style for the key
|
27
|
+
return nil if (key = self.key(style_class, format.key)).empty?
|
28
|
+
@styles[key] ||
|
29
|
+
build_and_cache(key, @osheet_workbook.styles.for(style_class), format)
|
30
|
+
end
|
31
|
+
|
32
|
+
protected
|
33
|
+
|
34
|
+
# build a unique key for styling based off the style and format keys
|
35
|
+
def key(class_value, format_key)
|
36
|
+
(class_value || '').strip.split(/\s+/).collect do |c|
|
37
|
+
".#{c}"
|
38
|
+
end.join('') + (format_key.nil? || format_key.empty? ? '' : "..#{format_key}")
|
39
|
+
end
|
40
|
+
|
41
|
+
# build and cache an xmlss style
|
42
|
+
def build_and_cache(key, styles, format)
|
43
|
+
settings = StyleSettings.new(styles)
|
44
|
+
@styles[key] = @xmlss_workbook.style(key) {
|
45
|
+
settings.setting(:align) { @xmlss_workbook.alignment(settings[:align]) }
|
46
|
+
settings.setting(:font) { @xmlss_workbook.font(settings[:font]) }
|
47
|
+
settings.setting(:bg) { @xmlss_workbook.interior(settings[:bg]) }
|
48
|
+
|
49
|
+
border_set = ::Osheet::Style::BORDERS.inject([]) do |set, bp|
|
50
|
+
settings.setting(bp) { set << settings[bp] }
|
51
|
+
set
|
52
|
+
end
|
53
|
+
if !border_set.empty?
|
54
|
+
@xmlss_workbook.borders {
|
55
|
+
border_set.each { |setting| @xmlss_workbook.border(setting) }
|
56
|
+
}
|
57
|
+
end
|
58
|
+
|
59
|
+
@xmlss_workbook.number_format(format.style)
|
60
|
+
}
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|