osheet 0.1.0 → 0.2.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.
- data/.bundle/config +2 -0
- data/.gitignore +6 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +33 -0
- data/README.rdoc +103 -61
- data/Rakefile +5 -56
- data/examples/basic.rb +73 -0
- data/examples/formats.rb +366 -0
- data/examples/trivial.rb +21 -0
- data/lib/osheet/associations.rb +62 -0
- data/lib/osheet/cell.rb +44 -10
- data/lib/osheet/column.rb +34 -7
- data/lib/osheet/format/accounting.rb +21 -0
- data/lib/osheet/format/currency.rb +23 -0
- data/lib/osheet/format/custom.rb +13 -0
- data/lib/osheet/format/datetime.rb +13 -0
- data/lib/osheet/format/fraction.rb +33 -0
- data/lib/osheet/format/general.rb +9 -0
- data/lib/osheet/format/number.rb +13 -0
- data/lib/osheet/format/numeric.rb +113 -0
- data/lib/osheet/format/percentage.rb +25 -0
- data/lib/osheet/format/scientific.rb +25 -0
- data/lib/osheet/format/special.rb +28 -0
- data/lib/osheet/format/text.rb +11 -0
- data/lib/osheet/format.rb +30 -0
- data/lib/osheet/row.rb +32 -7
- data/lib/osheet/style.rb +65 -0
- data/lib/osheet/style_set.rb +39 -0
- data/lib/osheet/styled_element.rb +18 -0
- data/lib/osheet/template.rb +32 -0
- data/lib/osheet/template_set.rb +57 -0
- data/lib/osheet/version.rb +1 -11
- data/lib/osheet/workbook.rb +32 -16
- data/lib/osheet/workbook_element.rb +21 -0
- data/lib/osheet/worksheet.rb +18 -20
- data/lib/osheet/worksheet_element.rb +15 -0
- data/lib/osheet/xmlss_writer/base.rb +42 -0
- data/lib/osheet/xmlss_writer/elements.rb +68 -0
- data/lib/osheet/xmlss_writer/styles.rb +176 -0
- data/lib/osheet/xmlss_writer.rb +1 -0
- data/lib/osheet.rb +7 -27
- data/osheet.gemspec +26 -0
- data/test/cell_test.rb +83 -0
- data/test/column_test.rb +81 -0
- data/test/env.rb +9 -0
- data/test/format/accounting_test.rb +158 -0
- data/test/format/currency_test.rb +158 -0
- data/test/format/custom_test.rb +22 -0
- data/test/format/datetime_test.rb +22 -0
- data/test/format/fraction_test.rb +84 -0
- data/test/format/general_test.rb +21 -0
- data/test/format/number_test.rb +93 -0
- data/test/format/percentage_test.rb +116 -0
- data/test/format/scientific_test.rb +116 -0
- data/test/format/special_test.rb +51 -0
- data/test/format/text_test.rb +18 -0
- data/test/format_test.rb +35 -0
- data/test/helper.rb +101 -0
- data/test/osheet_test.rb +14 -0
- data/test/row_test.rb +78 -0
- data/test/style_set_test.rb +50 -0
- data/test/style_test.rb +92 -0
- data/test/template_set_test.rb +76 -0
- data/test/template_test.rb +63 -0
- data/test/workbook_test.rb +142 -0
- data/test/worksheet_test.rb +77 -0
- data/test/xmlss_writer/base_test.rb +92 -0
- data/test/xmlss_writer/elements_test.rb +168 -0
- data/test/xmlss_writer/styles_test.rb +253 -0
- metadata +141 -30
- data/lib/osheet/base.rb +0 -95
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'enumeration'
|
2
|
+
|
3
|
+
module Osheet::Format
|
4
|
+
|
5
|
+
class Numeric
|
6
|
+
include Enumeration
|
7
|
+
|
8
|
+
attr_accessor :decimal_places, :comma_separator
|
9
|
+
enum :symbol, [:none, :dollar, :euro]
|
10
|
+
enum :negative_numbers, [:black, :black_parenth, :red, :red_parenth]
|
11
|
+
|
12
|
+
def initialize(opts={})
|
13
|
+
self.symbol = opts[:symbol] || :none
|
14
|
+
self.decimal_places = opts[:decimal_places] || 0
|
15
|
+
self.comma_separator = opts.has_key?(:comma_separator) ? opts[:comma_separator] : false
|
16
|
+
self.negative_numbers = opts[:negative_numbers] || :black
|
17
|
+
end
|
18
|
+
|
19
|
+
def decimal_places=(value)
|
20
|
+
if !value.kind_of?(::Fixnum) || value < 0 || value > 30
|
21
|
+
raise ArgumentError, ":decimal_places must be a Fixnum between 0 and 30."
|
22
|
+
end
|
23
|
+
@decimal_places = value
|
24
|
+
end
|
25
|
+
|
26
|
+
def comma_separator=(value)
|
27
|
+
@comma_separator = !!value
|
28
|
+
end
|
29
|
+
|
30
|
+
def style
|
31
|
+
negative_numbers_style
|
32
|
+
end
|
33
|
+
|
34
|
+
def key
|
35
|
+
"#{key_prefix}_#{symbol_key}_#{decimal_places_key}_#{comma_separator_key}_#{negative_numbers_key}"
|
36
|
+
end
|
37
|
+
|
38
|
+
protected
|
39
|
+
|
40
|
+
# used by 'key' in Numeric base class, override as necessary
|
41
|
+
def key_prefix
|
42
|
+
"number"
|
43
|
+
end
|
44
|
+
|
45
|
+
# used by 'symbol_style' in Numeric base class, override as necessary
|
46
|
+
def symbol_suffix
|
47
|
+
""
|
48
|
+
end
|
49
|
+
|
50
|
+
# used by 'decimal_places_style' in Numeric base class, override as necessary
|
51
|
+
def decimal_places_suffix
|
52
|
+
""
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
|
58
|
+
def numeric_style
|
59
|
+
symbol_style +
|
60
|
+
comma_separator_style +
|
61
|
+
decimal_places_style
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
def negative_numbers_style
|
66
|
+
case @negative_numbers
|
67
|
+
when :black
|
68
|
+
numeric_style
|
69
|
+
when :red
|
70
|
+
"#{numeric_style};[Red]#{numeric_style}"
|
71
|
+
when :black_parenth
|
72
|
+
"#{numeric_style}_);\(#{numeric_style}\)"
|
73
|
+
when :red_parenth
|
74
|
+
"#{numeric_style}_);[Red]\(#{numeric_style}\)"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
def negative_numbers_key
|
78
|
+
@negative_numbers.to_s.gsub('_', '')
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
def decimal_places_style
|
83
|
+
"0#{'.'+'0'*@decimal_places if @decimal_places > 0}#{decimal_places_suffix}"
|
84
|
+
end
|
85
|
+
def decimal_places_key
|
86
|
+
@decimal_places.to_s
|
87
|
+
end
|
88
|
+
|
89
|
+
|
90
|
+
def comma_separator_style
|
91
|
+
@comma_separator == true ? '#,##' : ''
|
92
|
+
end
|
93
|
+
def comma_separator_key
|
94
|
+
@comma_separator == true ? 'comma' : 'nocomma'
|
95
|
+
end
|
96
|
+
|
97
|
+
|
98
|
+
def symbol_style
|
99
|
+
case @symbol
|
100
|
+
when :dollar
|
101
|
+
"\"$\"#{symbol_suffix}"
|
102
|
+
when :euro
|
103
|
+
"[$€-2]\ #{symbol_suffix}"
|
104
|
+
when :none
|
105
|
+
''
|
106
|
+
end
|
107
|
+
end
|
108
|
+
def symbol_key
|
109
|
+
@symbol.to_s.gsub('_', '')
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'enumeration'
|
2
|
+
require 'osheet/format/numeric'
|
3
|
+
|
4
|
+
module Osheet::Format
|
5
|
+
|
6
|
+
class Percentage < Osheet::Format::Numeric
|
7
|
+
def initialize(opts={})
|
8
|
+
super({
|
9
|
+
:decimal_places => 2
|
10
|
+
}.merge(opts))
|
11
|
+
end
|
12
|
+
|
13
|
+
protected
|
14
|
+
|
15
|
+
# used by 'key' in Numeric base class
|
16
|
+
def key_prefix
|
17
|
+
"percentage"
|
18
|
+
end
|
19
|
+
|
20
|
+
# used by 'decimal_places_style' in Numeric base class
|
21
|
+
def decimal_places_suffix
|
22
|
+
"%"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'enumeration'
|
2
|
+
require 'osheet/format/numeric'
|
3
|
+
|
4
|
+
module Osheet::Format
|
5
|
+
|
6
|
+
class Scientific < Osheet::Format::Numeric
|
7
|
+
def initialize(opts={})
|
8
|
+
super({
|
9
|
+
:decimal_places => 2
|
10
|
+
}.merge(opts))
|
11
|
+
end
|
12
|
+
|
13
|
+
protected
|
14
|
+
|
15
|
+
# used by 'key' in Numeric base class
|
16
|
+
def key_prefix
|
17
|
+
"scientific"
|
18
|
+
end
|
19
|
+
|
20
|
+
# used by 'decimal_places_style' in Numeric base class
|
21
|
+
def decimal_places_suffix
|
22
|
+
"E+00"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'enumeration'
|
2
|
+
|
3
|
+
module Osheet::Format
|
4
|
+
|
5
|
+
class Special
|
6
|
+
include Enumeration
|
7
|
+
|
8
|
+
enum(:type, {
|
9
|
+
:zip_code => '00000',
|
10
|
+
:zip_code_plus_4 => '00000-0000',
|
11
|
+
:phone_number => '[<=9999999]###-####;(###) ###-####',
|
12
|
+
:social_security_number => '000-00-0000'
|
13
|
+
})
|
14
|
+
|
15
|
+
def initialize(opts={})
|
16
|
+
self.type = opts[:type]
|
17
|
+
end
|
18
|
+
|
19
|
+
def style
|
20
|
+
type
|
21
|
+
end
|
22
|
+
|
23
|
+
def key
|
24
|
+
"special_#{type_key.to_s.gsub('_', '')}"
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'osheet/format/general'
|
2
|
+
require 'osheet/format/number'
|
3
|
+
require 'osheet/format/currency'
|
4
|
+
require 'osheet/format/accounting'
|
5
|
+
require 'osheet/format/datetime'
|
6
|
+
require 'osheet/format/percentage'
|
7
|
+
require 'osheet/format/fraction'
|
8
|
+
require 'osheet/format/scientific'
|
9
|
+
require 'osheet/format/text'
|
10
|
+
require 'osheet/format/special'
|
11
|
+
require 'osheet/format/custom'
|
12
|
+
|
13
|
+
module Osheet::Format
|
14
|
+
|
15
|
+
VALUES = [
|
16
|
+
:general,:number, :currency, :accounting,
|
17
|
+
:datetime, :percentage, :fraction, :scientific,
|
18
|
+
:text, :special, :custom
|
19
|
+
]
|
20
|
+
|
21
|
+
class << self
|
22
|
+
def new(type, opts={})
|
23
|
+
unless VALUES.include?(type)
|
24
|
+
raise ArgumentError, "'#{type.inspect}' is not a valid format type"
|
25
|
+
end
|
26
|
+
self.const_get(type.to_s.capitalize).new(opts)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
data/lib/osheet/row.rb
CHANGED
@@ -1,14 +1,39 @@
|
|
1
|
-
require 'osheet/base'
|
2
1
|
require 'osheet/cell'
|
3
2
|
|
4
3
|
module Osheet
|
5
|
-
class Row
|
6
|
-
|
7
|
-
|
4
|
+
class Row
|
5
|
+
include Associations
|
6
|
+
include WorkbookElement
|
7
|
+
include WorksheetElement
|
8
|
+
include StyledElement
|
8
9
|
|
9
|
-
|
10
|
-
|
10
|
+
hm :cells
|
11
|
+
|
12
|
+
def initialize(workbook=nil, worksheet=nil, *args, &block)
|
13
|
+
@workbook = workbook
|
14
|
+
@worksheet = worksheet
|
15
|
+
@height = nil
|
16
|
+
@autofit = false
|
17
|
+
@hidden = false
|
18
|
+
instance_exec(*args, &block) if block_given?
|
19
|
+
end
|
20
|
+
|
21
|
+
def height(value=nil)
|
22
|
+
!value.nil? ? @height = value : @height
|
11
23
|
end
|
12
|
-
|
24
|
+
def autofit(value); @autofit = !!value; end
|
25
|
+
def autofit?; @autofit; end
|
26
|
+
def hidden(value); @hidden = !!value; end
|
27
|
+
def hidden?; @hidden; end
|
28
|
+
|
29
|
+
def attributes
|
30
|
+
{
|
31
|
+
:style_class => @style_class,
|
32
|
+
:height => @height,
|
33
|
+
:autofit => @autofit,
|
34
|
+
:hidden => @hidden
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
13
38
|
end
|
14
39
|
end
|
data/lib/osheet/style.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
module Osheet
|
2
|
+
class Style
|
3
|
+
|
4
|
+
# this class is essentially a set of collectors for style settings
|
5
|
+
# each setting collects any arguments passed to it and
|
6
|
+
# it is up to the drivers to determine how to use the settings
|
7
|
+
|
8
|
+
BORDER_POSITIONS = [:top, :right, :bottom, :left]
|
9
|
+
BORDERS = BORDER_POSITIONS.collect{|p| "border_#{p}".to_sym}
|
10
|
+
SETTINGS = [:align, :font, :bg] + BORDERS
|
11
|
+
|
12
|
+
attr_reader :selectors
|
13
|
+
|
14
|
+
def initialize(*selectors, &block)
|
15
|
+
@selectors = verify(selectors)
|
16
|
+
SETTINGS.each do |setting|
|
17
|
+
instance_variable_set("@#{setting}", [])
|
18
|
+
end
|
19
|
+
instance_eval(&block) if block_given?
|
20
|
+
end
|
21
|
+
|
22
|
+
SETTINGS.each do |setting|
|
23
|
+
define_method(setting) do |*args|
|
24
|
+
instance_variable_set("@#{setting}", instance_variable_get("@#{setting}") + args)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def border(*args)
|
29
|
+
BORDERS.each do |border|
|
30
|
+
send(border, *args)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def attributes
|
35
|
+
SETTINGS.inject({}) do |attrs, s|
|
36
|
+
attrs[s] = instance_variable_get("@#{s}")
|
37
|
+
attrs
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def match?(style_class)
|
42
|
+
selectors.inject(false) do |match, s|
|
43
|
+
match ||= s.split('.').inject(true) do |result, part|
|
44
|
+
result && (part.empty? || style_class.include?(part))
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def verify(selectors)
|
52
|
+
selectors.each do |selector|
|
53
|
+
if !selector.kind_of?(::String) || invalid?(selector)
|
54
|
+
raise ArgumentError, "invalid selector: '#{selector}', selectors must be strings that begin with '.' and con't have spaces or '>'."
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def invalid?(selector)
|
60
|
+
selector =~ /\s+/ ||
|
61
|
+
selector =~ /^[^.]/ ||
|
62
|
+
selector =~ />+/
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'osheet/style'
|
2
|
+
|
3
|
+
module Osheet
|
4
|
+
class StyleSet < ::Array
|
5
|
+
|
6
|
+
# this class is an Array has some helper methods. I want to
|
7
|
+
# push styles into the set using the '<<' operator, only allow
|
8
|
+
# Osheet::Style objs to be pushed, and then be able to reference
|
9
|
+
# a particular set of styles using a style class.
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
super
|
13
|
+
end
|
14
|
+
|
15
|
+
def <<(value)
|
16
|
+
super if verify(value)
|
17
|
+
end
|
18
|
+
|
19
|
+
# return the style set for the style class
|
20
|
+
def for(style_class)
|
21
|
+
self.select{|s| s.match?(style_class)}
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def styles(class_str)
|
27
|
+
end
|
28
|
+
|
29
|
+
# verify the style, otherwise ArgumentError it up
|
30
|
+
def verify(style)
|
31
|
+
if style.kind_of?(Style)
|
32
|
+
true
|
33
|
+
else
|
34
|
+
raise ArgumentError, 'you can only push Osheet::Style objs to the style set'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Osheet::StyledElement
|
2
|
+
def style_class(value); @style_class = verify_style_class(value); end
|
3
|
+
|
4
|
+
private
|
5
|
+
|
6
|
+
def verify_style_class(style_class)
|
7
|
+
if !style_class.kind_of?(::String) || invalid_style_class?(style_class)
|
8
|
+
raise ArgumentError, "invalid style_class: '#{style_class}', cannot contain '.' or '>'"
|
9
|
+
else
|
10
|
+
style_class
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def invalid_style_class?(style_class)
|
15
|
+
style_class =~ /\.+/ ||
|
16
|
+
style_class =~ />+/
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Osheet
|
2
|
+
class Template < ::Proc
|
3
|
+
|
4
|
+
# this class is essentially a way to define a named initializer
|
5
|
+
# block and associate that with an osheet element
|
6
|
+
# if an element is initialized from a template, the template
|
7
|
+
# block will be instance_eval'd for the element being initialized
|
8
|
+
|
9
|
+
ELEMENTS = ['worksheet', 'column', 'row', 'cell']
|
10
|
+
|
11
|
+
attr_accessor :element, :name
|
12
|
+
|
13
|
+
def initialize(element, name)
|
14
|
+
verify(element, name)
|
15
|
+
@element = element.to_s
|
16
|
+
@name = name.to_s
|
17
|
+
super()
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def verify(element, name)
|
23
|
+
unless element.respond_to?(:to_s) && ELEMENTS.include?(element.to_s)
|
24
|
+
raise ArgumentError, "you can only define a template for #{ELEMENTS.join(', ')} elements."
|
25
|
+
end
|
26
|
+
unless name.kind_of?(::String) || name.kind_of?(::Symbol)
|
27
|
+
raise ArgumentError, "please use a string or symbol for the template name."
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'osheet/template'
|
2
|
+
|
3
|
+
module Osheet
|
4
|
+
class TemplateSet < ::Hash
|
5
|
+
|
6
|
+
# this class is a Hash that behaves kinda like a set. I want to
|
7
|
+
# push templates into the set using the '<<' operator, only allow
|
8
|
+
# Osheet::Template objs to be pushed, and then be able to reference
|
9
|
+
# a particular set of templates using a key
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
super
|
13
|
+
end
|
14
|
+
|
15
|
+
def <<(template)
|
16
|
+
if (key = verify(template))
|
17
|
+
push(key, template)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# return the template set for the named element
|
22
|
+
def get(element, name)
|
23
|
+
lookup(key(element.to_s, name.to_s))
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def lookup(key)
|
29
|
+
self[key.first][key.last] if self[key.first]
|
30
|
+
end
|
31
|
+
|
32
|
+
# push the template onto the key
|
33
|
+
def push(key, template)
|
34
|
+
self[key.first][key.last] = template
|
35
|
+
end
|
36
|
+
|
37
|
+
# verify the template, init the key set, and return the key string
|
38
|
+
# otherwise ArgumentError it up
|
39
|
+
def verify(template)
|
40
|
+
unless template.kind_of?(Template)
|
41
|
+
raise ArgumentError, 'you can only push Osheet::Template objs to the template set'
|
42
|
+
end
|
43
|
+
key = template_key(template)
|
44
|
+
self[key.first] ||= {}
|
45
|
+
self[key.first][key.last] ||= nil
|
46
|
+
key
|
47
|
+
end
|
48
|
+
|
49
|
+
def template_key(template)
|
50
|
+
key(template.element, template.name)
|
51
|
+
end
|
52
|
+
|
53
|
+
def key(element, name)
|
54
|
+
[element, name]
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
data/lib/osheet/version.rb
CHANGED
data/lib/osheet/workbook.rb
CHANGED
@@ -1,23 +1,39 @@
|
|
1
|
-
require 'osheet/
|
1
|
+
require 'osheet/style_set'
|
2
|
+
require 'osheet/template_set'
|
2
3
|
require 'osheet/worksheet'
|
3
|
-
|
4
|
-
# === Usage
|
5
|
-
#
|
6
|
-
# require 'osheet'
|
7
|
-
#
|
8
|
-
# Osheet::Workbook.configure do |book|
|
9
|
-
# book.worksheet ...
|
10
|
-
# book.worksheet ...
|
11
|
-
# end
|
4
|
+
require 'osheet/xmlss_writer'
|
12
5
|
|
13
6
|
module Osheet
|
14
|
-
class Workbook
|
15
|
-
|
16
|
-
|
7
|
+
class Workbook
|
8
|
+
include Associations
|
9
|
+
|
10
|
+
hm :worksheets
|
11
|
+
attr_reader :styles, :templates
|
12
|
+
|
13
|
+
def initialize(&block)
|
14
|
+
@title = nil
|
15
|
+
@styles = StyleSet.new
|
16
|
+
@templates = TemplateSet.new
|
17
|
+
instance_eval(&block) if block_given?
|
18
|
+
end
|
19
|
+
|
20
|
+
def title(value=nil)
|
21
|
+
!value.nil? ? @title = value : @title
|
22
|
+
end
|
23
|
+
def style(*selectors, &block); @styles << Style.new(*selectors, &block); end
|
24
|
+
def template(element, name, &block); @templates << Template.new(element, name, &block); end
|
17
25
|
|
18
|
-
def
|
19
|
-
|
26
|
+
def attributes
|
27
|
+
{ :title => @title }
|
20
28
|
end
|
21
|
-
|
29
|
+
|
30
|
+
def writer
|
31
|
+
XmlssWriter::Base.new(:workbook => self)
|
32
|
+
end
|
33
|
+
|
34
|
+
[:to_data, :to_file].each do |meth|
|
35
|
+
define_method(meth) {|*args| writer.send(meth, *args) }
|
36
|
+
end
|
37
|
+
|
22
38
|
end
|
23
39
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Osheet::WorkbookElement
|
2
|
+
class << self
|
3
|
+
|
4
|
+
def included(receiver)
|
5
|
+
|
6
|
+
receiver.send(:attr_reader, :workbook)
|
7
|
+
|
8
|
+
[:styles, :templates].each do |thing|
|
9
|
+
receiver.send(:define_method, thing) do
|
10
|
+
if workbook && workbook.respond_to?(thing)
|
11
|
+
workbook.send(thing)
|
12
|
+
else
|
13
|
+
nil
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
data/lib/osheet/worksheet.rb
CHANGED
@@ -1,29 +1,27 @@
|
|
1
|
-
require 'osheet/base'
|
2
1
|
require 'osheet/column'
|
3
2
|
require 'osheet/row'
|
4
3
|
|
5
|
-
# === Usage
|
6
|
-
#
|
7
|
-
# require 'osheet'
|
8
|
-
#
|
9
|
-
# Osheet::Workbook.configure do |book|
|
10
|
-
# book.worksheet ...
|
11
|
-
# book.worksheet ...
|
12
|
-
# end
|
13
|
-
|
14
4
|
module Osheet
|
15
|
-
class Worksheet
|
16
|
-
|
17
|
-
|
5
|
+
class Worksheet
|
6
|
+
include Associations
|
7
|
+
include WorkbookElement
|
8
|
+
|
9
|
+
hm :columns
|
10
|
+
hm :rows
|
11
|
+
|
12
|
+
def initialize(workbook=nil, *args, &block)
|
13
|
+
@workbook = workbook
|
14
|
+
@name = nil
|
15
|
+
instance_exec(*args, &block) if block_given?
|
16
|
+
end
|
18
17
|
|
19
|
-
|
20
|
-
|
21
|
-
|
18
|
+
def name(value=nil)
|
19
|
+
!value.nil? ? @name = value : @name
|
20
|
+
end
|
22
21
|
|
23
|
-
def
|
24
|
-
|
25
|
-
super(args)
|
22
|
+
def attributes
|
23
|
+
{ :name => @name }
|
26
24
|
end
|
27
|
-
|
25
|
+
|
28
26
|
end
|
29
27
|
end
|