workbook 0.4.9 → 0.4.10
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/.travis.yml +1 -1
- data/README.md +4 -5
- data/lib/workbook.rb +2 -0
- data/lib/workbook/cell.rb +2 -211
- data/lib/workbook/column.rb +31 -1
- data/lib/workbook/modules/cell.rb +279 -0
- data/lib/workbook/modules/raw_objects_storage.rb +3 -2
- data/lib/workbook/readers/xlsx_reader.rb +12 -45
- data/lib/workbook/row.rb +13 -5
- data/lib/workbook/sheet.rb +3 -0
- data/lib/workbook/table.rb +14 -0
- data/lib/workbook/template.rb +5 -0
- data/lib/workbook/types/Date.rb +14 -2
- data/lib/workbook/types/FalseClass.rb +1 -3
- data/lib/workbook/version.rb +1 -1
- data/lib/workbook/writers/xlsx_writer.rb +60 -30
- data/test/test_column.rb +30 -0
- data/test/{test_cell.rb → test_modules_cell.rb} +8 -1
- data/test/test_readers_xlsx_reader.rb +1 -7
- data/test/test_row.rb +1 -1
- data/test/test_sheet.rb +1 -0
- data/test/test_table.rb +14 -3
- data/test/test_template.rb +5 -0
- data/test/test_types_date.rb +11 -0
- data/test/test_writers_xlsx_writer.rb +40 -85
- data/workbook.gemspec +5 -2
- metadata +24 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ca5f6da9acf713dbf71a56c795e93c951d0838d3
|
4
|
+
data.tar.gz: a2252dd8e37faaae531689cb2d7de383d3771994
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: be613dc8479a2a1d4106b214004cf1274fa9784b4a43cca0ee3fd0e942211a12662abc2b7acf56346ce517fefcabecd51a942db2d48159de2bb7b3e540d8589e
|
7
|
+
data.tar.gz: d331c6f871214606845fdb3377db3b65265794154b5b9ad66f1a242ee74cc97f119aee2a8e6f558a1e34fb65697f291039486ff56bfef2038d2b2ca03e840a8c
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -144,7 +144,7 @@ The [ruby toolbox lists plenty of alternatives](https://www.ruby-toolbox.com/sea
|
|
144
144
|
|
145
145
|
## License
|
146
146
|
|
147
|
-
This code MIT (but see below)
|
147
|
+
This code MIT (but see below) © murb / Maarten Brouwers, 2011-2015
|
148
148
|
|
149
149
|
Workbook uses the following gems:
|
150
150
|
|
@@ -152,7 +152,6 @@ Workbook uses the following gems:
|
|
152
152
|
* [ruby-ole](http://code.google.com/p/ruby-ole/) Used in the Spreadsheet Gem (Copyright © 2007-2010 Charles Lowe; MIT)
|
153
153
|
* [FasterCSV](http://fastercsv.rubyforge.org/) Used for reading CSV (comma separated text) and TXT (tab separated text) files (Copyright © James Edward Gray II; GPL2 & Ruby License)
|
154
154
|
* [rchardet](http://rubyforge.org/projects/rchardet) Used for detecting encoding in CSV and TXT importers (Copyright © JMHodges; LGPL)
|
155
|
-
* [
|
156
|
-
* [
|
157
|
-
|
158
|
-
|
155
|
+
* [roo](https://github.com/roo-rb/roo) Temporarily used for reading the newer .xlsx files (without formatting) (Copyright © 2008-2014 Thomas Preymesser, Ben Woosley, MIT License)
|
156
|
+
* [axslx](https://github.com/randym/axlsx) Used for writing the newer .xlsx files (with formatting) (Copyright © 2011, 2012 Randy Morgan, MIT License)
|
157
|
+
* [Nokogiri](http://nokogiri.org/) Used for reading ODS documents (Copyright © 2008 - 2012 Aaron Patterson, Mike Dalessio, Charles Nutter, Sergio Arbeo, Patrick Mahoney, Yoko Harada; MIT Licensed)
|
data/lib/workbook.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
$KCODE="u" if RUBY_VERSION < "1.9"
|
3
3
|
require_relative 'workbook/modules/cache'
|
4
|
+
require_relative 'workbook/modules/cell'
|
5
|
+
require_relative 'workbook/types/date'
|
4
6
|
require_relative 'workbook/book'
|
5
7
|
require_relative 'workbook/sheet'
|
6
8
|
require_relative 'workbook/table'
|
data/lib/workbook/cell.rb
CHANGED
@@ -1,218 +1,9 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
|
3
|
-
require 'workbook/modules/
|
3
|
+
require 'workbook/modules/cell'
|
4
4
|
|
5
5
|
module Workbook
|
6
6
|
class Cell
|
7
|
-
|
8
|
-
|
9
|
-
attr_accessor :formula
|
10
|
-
|
11
|
-
# Note that these types are sorted by 'importance'
|
12
|
-
VALID_TYPES = [Numeric,String,Time,Date,TrueClass,FalseClass,NilClass,Workbook::NilValue,Symbol]
|
13
|
-
|
14
|
-
# Evaluates a value for class-validity
|
15
|
-
#
|
16
|
-
# @param [Numeric,String,Time,Date,TrueClass,FalseClass,NilClass,Object] value the value to evaluate
|
17
|
-
# @return [Boolean] returns true when the value is a valid cell value
|
18
|
-
def valid_value? value
|
19
|
-
valid_type = false
|
20
|
-
VALID_TYPES.each {|t| return true if value.is_a? t}
|
21
|
-
valid_type
|
22
|
-
end
|
23
|
-
|
24
|
-
# @param [Numeric,String,Time,Date,TrueClass,FalseClass,NilClass] value a valid value
|
25
|
-
# @param [Hash] options a reference to :format (Workbook::Format) can be specified
|
26
|
-
def initialize value=nil, options={}
|
27
|
-
self.format = options[:format]
|
28
|
-
self.value = value
|
29
|
-
@to_sym = nil
|
30
|
-
end
|
31
|
-
|
32
|
-
# Change the current value
|
33
|
-
#
|
34
|
-
# @param [Numeric,String,Time,Date,TrueClass,FalseClass,NilClass,Symbol] value a valid value
|
35
|
-
def value= value
|
36
|
-
if valid_value? value
|
37
|
-
@value = value
|
38
|
-
@to_sym = nil
|
39
|
-
else
|
40
|
-
raise ArgumentError, "value should be of a primitive type, e.g. a string, or an integer, not a #{value.class} (is_a? [TrueClass,FalseClass,Date,Time,Numeric,String, NilClass, Symbol])"
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
# Returns the current value
|
45
|
-
#
|
46
|
-
# @return [Numeric,String,Time,Date,TrueClass,FalseClass,NilClass] a valid value
|
47
|
-
def value
|
48
|
-
@value
|
49
|
-
end
|
50
|
-
|
51
|
-
# Change the current format
|
52
|
-
#
|
53
|
-
# @param [Workbook::Format, Hash] f set the formatting properties of this Cell
|
54
|
-
def format= f
|
55
|
-
if f.is_a? Workbook::Format
|
56
|
-
@format = f
|
57
|
-
elsif f.is_a? Hash
|
58
|
-
@format = Workbook::Format.new(f)
|
59
|
-
elsif f.class == NilClass
|
60
|
-
@format = Workbook::Format.new
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
# Returns current format
|
65
|
-
#
|
66
|
-
# @returns [Workbook::Format] the current format
|
67
|
-
def format
|
68
|
-
@format ||= Workbook::Format.new
|
69
|
-
end
|
70
|
-
|
71
|
-
# Tests for equality based on its value (formatting is irrelevant)
|
72
|
-
#
|
73
|
-
# @param [Workbook::Cell] other cell to compare against
|
74
|
-
# @return [Boolean]
|
75
|
-
def ==(other)
|
76
|
-
if other.is_a? Cell
|
77
|
-
other.value == self.value
|
78
|
-
else
|
79
|
-
other == self.value
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
# returns true when the value of the cell is nil.
|
84
|
-
# @return [Boolean]
|
85
|
-
def nil?
|
86
|
-
return value.nil?
|
87
|
-
end
|
88
|
-
|
89
|
-
# returns a symbol representation of the cell's value
|
90
|
-
# @return [Symbol] a symbol representation
|
91
|
-
# @example
|
92
|
-
#
|
93
|
-
# <Workbook::Cell value="yet another value">.to_sym # returns :yet_another_value
|
94
|
-
def to_sym
|
95
|
-
return @to_sym if @to_sym
|
96
|
-
v = nil
|
97
|
-
if value
|
98
|
-
ends_with_exclamationmark = (value[-1] == '!')
|
99
|
-
ends_with_questionmark = (value[-1] == '?')
|
100
|
-
v = value.to_s.downcase
|
101
|
-
|
102
|
-
replacements = {
|
103
|
-
[/[\(\)\.\?\,\!\=\$\:]/,] => '',
|
104
|
-
[/\&/] => 'amp',
|
105
|
-
[/\+/] => '_plus_',
|
106
|
-
[/\s/,'/_','/',"\\"] => '_',
|
107
|
-
['–_','-_','+_','-'] => '',
|
108
|
-
['__']=>'_',
|
109
|
-
['>']=>'gt',
|
110
|
-
['<']=>'lt',
|
111
|
-
['á','à','â','ä','ã','å'] => 'a',
|
112
|
-
['Ã','Ä','Â','À','�?','Å'] => 'A',
|
113
|
-
['é','è','ê','ë'] => 'e',
|
114
|
-
['Ë','É','È','Ê'] => 'E',
|
115
|
-
['í','ì','î','ï'] => 'i',
|
116
|
-
['�?','Î','Ì','�?'] => 'I',
|
117
|
-
['ó','ò','ô','ö','õ'] => 'o',
|
118
|
-
['Õ','Ö','Ô','Ò','Ó'] => 'O',
|
119
|
-
['ú','ù','û','ü'] => 'u',
|
120
|
-
['Ú','Û','Ù','Ü'] => 'U',
|
121
|
-
['ç'] => 'c',
|
122
|
-
['Ç'] => 'C',
|
123
|
-
['š', 'ś'] => 's',
|
124
|
-
['Š', 'Ś'] => 'S',
|
125
|
-
['ž','ź'] => 'z',
|
126
|
-
['Ž','Ź'] => 'Z',
|
127
|
-
['ñ'] => 'n',
|
128
|
-
['Ñ'] => 'N',
|
129
|
-
['#'] => 'hash',
|
130
|
-
['*'] => 'asterisk'
|
131
|
-
}
|
132
|
-
replacements.each do |ac,rep|
|
133
|
-
ac.each do |s|
|
134
|
-
v = v.gsub(s, rep)
|
135
|
-
end
|
136
|
-
end
|
137
|
-
if RUBY_VERSION < '1.9'
|
138
|
-
v = v.gsub(/[^\x00-\x7F]/n,'')
|
139
|
-
else
|
140
|
-
# See String#encode
|
141
|
-
encoding_options = {:invalid => :replace, :undef => :replace, :replace => ''}
|
142
|
-
v = v.encode(Encoding.find('ASCII'), encoding_options)
|
143
|
-
end
|
144
|
-
v = "#{v}!" if ends_with_exclamationmark
|
145
|
-
v = "#{v}?" if ends_with_questionmark
|
146
|
-
v = v.downcase.to_sym
|
147
|
-
end
|
148
|
-
@to_sym = v
|
149
|
-
return @to_sym
|
150
|
-
end
|
151
|
-
|
152
|
-
# Compare
|
153
|
-
# @param [Workbook::Cell] other cell to compare against (based on value), can compare different value-types using #compare_on_class
|
154
|
-
# @returns [Fixnum] -1, 0, 1
|
155
|
-
def <=> other
|
156
|
-
rv = nil
|
157
|
-
begin
|
158
|
-
rv = self.value <=> other.value
|
159
|
-
rescue NoMethodError
|
160
|
-
rv = compare_on_class other
|
161
|
-
end
|
162
|
-
if rv == nil
|
163
|
-
rv = compare_on_class other
|
164
|
-
end
|
165
|
-
return rv
|
166
|
-
|
167
|
-
end
|
168
|
-
|
169
|
-
# Compare on class level
|
170
|
-
#
|
171
|
-
# @param [Workbook::Cell] other cell to compare against
|
172
|
-
def compare_on_class other
|
173
|
-
other_value = nil
|
174
|
-
other_value = other.value if other
|
175
|
-
self_value = importance_of_class self.value
|
176
|
-
other_value = importance_of_class other_value
|
177
|
-
self_value <=> other_value
|
178
|
-
end
|
179
|
-
|
180
|
-
# Returns the importance of a value's class
|
181
|
-
#
|
182
|
-
# @param value a potential value for a cell
|
183
|
-
def importance_of_class value
|
184
|
-
VALID_TYPES.each_with_index do |c,i|
|
185
|
-
return i if value.is_a? c
|
186
|
-
end
|
187
|
-
return nil
|
188
|
-
end
|
189
|
-
|
190
|
-
def inspect
|
191
|
-
"<Workbook::Cell @value=#{value}>"
|
192
|
-
end
|
193
|
-
|
194
|
-
# convert value to string, and in case of a Date or Time value, apply formatting
|
195
|
-
# @return [String]
|
196
|
-
def to_s
|
197
|
-
if (value.is_a? Date or value.is_a? Time) and format[:number_format]
|
198
|
-
value.strftime(format[:number_format])
|
199
|
-
else
|
200
|
-
value.to_s
|
201
|
-
end
|
202
|
-
end
|
203
|
-
|
204
|
-
def colspan= c
|
205
|
-
@colspan = c
|
206
|
-
end
|
207
|
-
def rowspan= r
|
208
|
-
@rowspan = r
|
209
|
-
end
|
210
|
-
|
211
|
-
def colspan
|
212
|
-
@colspan.to_i if defined?(@colspan) and @colspan.to_i > 1
|
213
|
-
end
|
214
|
-
def rowspan
|
215
|
-
@rowspan.to_i if defined?(@rowspan) and @rowspan.to_i > 1
|
216
|
-
end
|
7
|
+
include Workbook::Modules::Cell
|
217
8
|
end
|
218
9
|
end
|
data/lib/workbook/column.rb
CHANGED
@@ -12,7 +12,25 @@ module Workbook
|
|
12
12
|
|
13
13
|
# Returns column type, either :primary_key, :string, :text, :integer, :float, :decimal, :datetime, :date, :binary, :boolean
|
14
14
|
def column_type
|
15
|
-
@column_type
|
15
|
+
return @column_type if @column_type
|
16
|
+
ind = self.index
|
17
|
+
table[1..500].each do |row|
|
18
|
+
if row[ind] and row[ind].cell_type
|
19
|
+
cel_column_type = row[ind].cell_type
|
20
|
+
if cel_column_type == @column_type or @column_type.nil?
|
21
|
+
@column_type = cel_column_type
|
22
|
+
else
|
23
|
+
@column_type = :string
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
return @column_type
|
28
|
+
end
|
29
|
+
|
30
|
+
# Returns index of the column within the table's columns-set
|
31
|
+
# @return [Integer, NilClass]
|
32
|
+
def index
|
33
|
+
table.columns.index self
|
16
34
|
end
|
17
35
|
|
18
36
|
def table= t
|
@@ -29,6 +47,18 @@ module Workbook
|
|
29
47
|
end
|
30
48
|
end
|
31
49
|
|
50
|
+
def head_value
|
51
|
+
begin
|
52
|
+
table.header[index].value
|
53
|
+
rescue
|
54
|
+
return "!noheader!"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def inspect
|
59
|
+
"<Workbook::Column index=#{index}, header=#{head_value}>"
|
60
|
+
end
|
61
|
+
|
32
62
|
#default cell
|
33
63
|
def default
|
34
64
|
return @default
|
@@ -0,0 +1,279 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'workbook/modules/type_parser'
|
3
|
+
require 'workbook/nil_value'
|
4
|
+
|
5
|
+
module Workbook
|
6
|
+
module Modules
|
7
|
+
module Cell
|
8
|
+
include Workbook::Modules::TypeParser
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
# Note that these types are sorted by 'importance'
|
13
|
+
VALID_TYPES = [Numeric,String,Time,Date,TrueClass,FalseClass,NilClass,Workbook::NilValue,Symbol]
|
14
|
+
|
15
|
+
# Evaluates a value for class-validity
|
16
|
+
#
|
17
|
+
# @param [Numeric,String,Time,Date,TrueClass,FalseClass,NilClass,Object] value the value to evaluate
|
18
|
+
# @return [Boolean] returns true when the value is a valid cell value
|
19
|
+
def valid_value? value
|
20
|
+
valid_type = false
|
21
|
+
VALID_TYPES.each {|t| return true if value.is_a? t}
|
22
|
+
valid_type
|
23
|
+
end
|
24
|
+
|
25
|
+
def formula
|
26
|
+
@formula
|
27
|
+
end
|
28
|
+
|
29
|
+
def formula= f
|
30
|
+
@formula = f
|
31
|
+
end
|
32
|
+
|
33
|
+
def row
|
34
|
+
@row
|
35
|
+
end
|
36
|
+
|
37
|
+
def row= r
|
38
|
+
@row= r
|
39
|
+
end
|
40
|
+
|
41
|
+
# @param [Numeric,String,Time,Date,TrueClass,FalseClass,NilClass] value a valid value
|
42
|
+
# @param [Hash] options a reference to :format (Workbook::Format) can be specified
|
43
|
+
def initialize value=nil, options={}
|
44
|
+
self.format = options[:format] if options[:format]
|
45
|
+
self.row = options[:row]
|
46
|
+
self.value = value
|
47
|
+
@to_sym = nil
|
48
|
+
end
|
49
|
+
|
50
|
+
# Change the current value
|
51
|
+
#
|
52
|
+
# @param [Numeric,String,Time,Date,TrueClass,FalseClass,NilClass,Symbol] value a valid value
|
53
|
+
def value= value
|
54
|
+
if valid_value? value
|
55
|
+
@value = value
|
56
|
+
@to_sym = nil
|
57
|
+
else
|
58
|
+
raise ArgumentError, "value should be of a primitive type, e.g. a string, or an integer, not a #{value.class} (is_a? [TrueClass,FalseClass,Date,Time,Numeric,String, NilClass, Symbol])"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Returns column type, either :primary_key, :string, :text, :integer, :float, :decimal, :datetime, :date, :binary, :boolean
|
63
|
+
#
|
64
|
+
# @return [Symbol] the type of cell, compatible with Workbook::Column'types
|
65
|
+
def cell_type
|
66
|
+
tp = case value.class.to_s
|
67
|
+
when "String" then :string
|
68
|
+
when "FalseClass" then :boolean
|
69
|
+
when "TrueClass" then :boolean
|
70
|
+
when 'Time' then :time
|
71
|
+
when "Date" then :date
|
72
|
+
when "DateTime" then :datetime
|
73
|
+
when "Float" then :float
|
74
|
+
when "Integer" then :integer
|
75
|
+
when "Numeric" then :integer
|
76
|
+
when "Fixnum" then :integer
|
77
|
+
when "Symbol" then :string
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
# Returns the current value
|
83
|
+
#
|
84
|
+
# @return [Numeric,String,Time,Date,TrueClass,FalseClass,NilClass] a valid value
|
85
|
+
def value
|
86
|
+
@value
|
87
|
+
end
|
88
|
+
|
89
|
+
# Returns the sheet its at.
|
90
|
+
#
|
91
|
+
# @return [Workbook::Table]
|
92
|
+
def table
|
93
|
+
row.table if row
|
94
|
+
end
|
95
|
+
|
96
|
+
# Quick assessor to the book's template, if it exists
|
97
|
+
#
|
98
|
+
# @return [Workbook::Template]
|
99
|
+
def template
|
100
|
+
row.template if row
|
101
|
+
end
|
102
|
+
|
103
|
+
# Change the current format
|
104
|
+
#
|
105
|
+
# @param [Workbook::Format, Hash] f set the formatting properties of this Cell
|
106
|
+
def format= f
|
107
|
+
if f.is_a? Workbook::Format
|
108
|
+
@workbook_format = f
|
109
|
+
elsif f.is_a? Hash
|
110
|
+
@workbook_format = Workbook::Format.new(f)
|
111
|
+
elsif f.class == NilClass
|
112
|
+
@workbook_format = Workbook::Format.new
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
# Returns current format
|
117
|
+
#
|
118
|
+
# @returns [Workbook::Format] the current format
|
119
|
+
def format
|
120
|
+
# return @workbook_format if @workbook_format
|
121
|
+
if row and template and row.header? and !@workbook_format
|
122
|
+
@workbook_format = template.create_or_find_format_by(:header)
|
123
|
+
else
|
124
|
+
@workbook_format ||= Workbook::Format.new
|
125
|
+
end
|
126
|
+
@workbook_format
|
127
|
+
end
|
128
|
+
|
129
|
+
# Tests for equality based on its value (formatting is irrelevant)
|
130
|
+
#
|
131
|
+
# @param [Workbook::Cell] other cell to compare against
|
132
|
+
# @return [Boolean]
|
133
|
+
def ==(other)
|
134
|
+
if other.is_a? Cell
|
135
|
+
other.value == self.value
|
136
|
+
else
|
137
|
+
other == self.value
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
# returns true when the value of the cell is nil.
|
142
|
+
# @return [Boolean]
|
143
|
+
def nil?
|
144
|
+
return value.nil?
|
145
|
+
end
|
146
|
+
|
147
|
+
# returns a symbol representation of the cell's value
|
148
|
+
# @return [Symbol] a symbol representation
|
149
|
+
# @example
|
150
|
+
#
|
151
|
+
# <Workbook::Cell value="yet another value">.to_sym # returns :yet_another_value
|
152
|
+
def to_sym
|
153
|
+
return @to_sym if @to_sym
|
154
|
+
v = nil
|
155
|
+
if value
|
156
|
+
ends_with_exclamationmark = (value[-1] == '!')
|
157
|
+
ends_with_questionmark = (value[-1] == '?')
|
158
|
+
v = value.to_s.downcase
|
159
|
+
|
160
|
+
replacements = {
|
161
|
+
[/[\(\)\.\?\,\!\=\$\:]/,] => '',
|
162
|
+
[/\&/] => 'amp',
|
163
|
+
[/\+/] => '_plus_',
|
164
|
+
[/\s/,'/_','/',"\\"] => '_',
|
165
|
+
['–_','-_','+_','-'] => '',
|
166
|
+
['__']=>'_',
|
167
|
+
['>']=>'gt',
|
168
|
+
['<']=>'lt',
|
169
|
+
['á','à','â','ä','ã','å'] => 'a',
|
170
|
+
['Ã','Ä','Â','À','�?','Å'] => 'A',
|
171
|
+
['é','è','ê','ë'] => 'e',
|
172
|
+
['Ë','É','È','Ê'] => 'E',
|
173
|
+
['í','ì','î','ï'] => 'i',
|
174
|
+
['�?','Î','Ì','�?'] => 'I',
|
175
|
+
['ó','ò','ô','ö','õ'] => 'o',
|
176
|
+
['Õ','Ö','Ô','Ò','Ó'] => 'O',
|
177
|
+
['ú','ù','û','ü'] => 'u',
|
178
|
+
['Ú','Û','Ù','Ü'] => 'U',
|
179
|
+
['ç'] => 'c',
|
180
|
+
['Ç'] => 'C',
|
181
|
+
['š', 'ś'] => 's',
|
182
|
+
['Š', 'Ś'] => 'S',
|
183
|
+
['ž','ź'] => 'z',
|
184
|
+
['Ž','Ź'] => 'Z',
|
185
|
+
['ñ'] => 'n',
|
186
|
+
['Ñ'] => 'N',
|
187
|
+
['#'] => 'hash',
|
188
|
+
['*'] => 'asterisk'
|
189
|
+
}
|
190
|
+
replacements.each do |ac,rep|
|
191
|
+
ac.each do |s|
|
192
|
+
v = v.gsub(s, rep)
|
193
|
+
end
|
194
|
+
end
|
195
|
+
if RUBY_VERSION < '1.9'
|
196
|
+
v = v.gsub(/[^\x00-\x7F]/n,'')
|
197
|
+
else
|
198
|
+
# See String#encode
|
199
|
+
encoding_options = {:invalid => :replace, :undef => :replace, :replace => ''}
|
200
|
+
v = v.encode(Encoding.find('ASCII'), encoding_options)
|
201
|
+
end
|
202
|
+
v = "#{v}!" if ends_with_exclamationmark
|
203
|
+
v = "#{v}?" if ends_with_questionmark
|
204
|
+
v = v.downcase.to_sym
|
205
|
+
end
|
206
|
+
@to_sym = v
|
207
|
+
return @to_sym
|
208
|
+
end
|
209
|
+
|
210
|
+
# Compare
|
211
|
+
# @param [Workbook::Cell] other cell to compare against (based on value), can compare different value-types using #compare_on_class
|
212
|
+
# @returns [Fixnum] -1, 0, 1
|
213
|
+
def <=> other
|
214
|
+
rv = nil
|
215
|
+
begin
|
216
|
+
rv = self.value <=> other.value
|
217
|
+
rescue NoMethodError
|
218
|
+
rv = compare_on_class other
|
219
|
+
end
|
220
|
+
if rv == nil
|
221
|
+
rv = compare_on_class other
|
222
|
+
end
|
223
|
+
return rv
|
224
|
+
|
225
|
+
end
|
226
|
+
|
227
|
+
# Compare on class level
|
228
|
+
#
|
229
|
+
# @param [Workbook::Cell] other cell to compare against
|
230
|
+
def compare_on_class other
|
231
|
+
other_value = nil
|
232
|
+
other_value = other.value if other
|
233
|
+
self_value = importance_of_class self.value
|
234
|
+
other_value = importance_of_class other_value
|
235
|
+
self_value <=> other_value
|
236
|
+
end
|
237
|
+
|
238
|
+
# Returns the importance of a value's class
|
239
|
+
#
|
240
|
+
# @param value a potential value for a cell
|
241
|
+
def importance_of_class value
|
242
|
+
VALID_TYPES.each_with_index do |c,i|
|
243
|
+
return i if value.is_a? c
|
244
|
+
end
|
245
|
+
return nil
|
246
|
+
end
|
247
|
+
|
248
|
+
def inspect
|
249
|
+
"<Workbook::Cell @value=#{value}>"
|
250
|
+
end
|
251
|
+
|
252
|
+
# convert value to string, and in case of a Date or Time value, apply formatting
|
253
|
+
# @return [String]
|
254
|
+
def to_s
|
255
|
+
if (self.is_a? Date or self.is_a? Time) and format[:number_format]
|
256
|
+
value.strftime(format[:number_format])
|
257
|
+
elsif (self.class == Workbook::Cell)
|
258
|
+
value.to_s
|
259
|
+
else
|
260
|
+
super
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
def colspan= c
|
265
|
+
@colspan = c
|
266
|
+
end
|
267
|
+
def rowspan= r
|
268
|
+
@rowspan = r
|
269
|
+
end
|
270
|
+
|
271
|
+
def colspan
|
272
|
+
@colspan.to_i if defined?(@colspan) and @colspan.to_i > 1
|
273
|
+
end
|
274
|
+
def rowspan
|
275
|
+
@rowspan.to_i if defined?(@rowspan) and @rowspan.to_i > 1
|
276
|
+
end
|
277
|
+
end
|
278
|
+
end
|
279
|
+
end
|