workbook 0.4.2 → 0.4.3
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/.gitignore +2 -1
- data/.yardoc/checksums +22 -21
- data/.yardoc/object_types +0 -0
- data/.yardoc/objects/root.dat +0 -0
- data/Gemfile.lock +2 -2
- data/doc/RubyXL.html +1 -1
- data/doc/RubyXL/Cell.html +1 -1
- data/doc/RubyXL/Workbook.html +31 -31
- data/doc/Workbook.html +4 -4
- data/doc/Workbook/Book.html +5 -5
- data/doc/Workbook/Cell.html +202 -62
- data/doc/Workbook/Format.html +32 -32
- data/doc/Workbook/Modules.html +1 -1
- data/doc/Workbook/Modules/RawObjectsStorage.html +5 -5
- data/doc/Workbook/Modules/TableDiffSort.html +14 -14
- data/doc/Workbook/Modules/TypeParser.html +7 -7
- data/doc/Workbook/NilValue.html +434 -0
- data/doc/Workbook/Readers.html +3 -3
- data/doc/Workbook/Readers/CsvReader.html +6 -6
- data/doc/Workbook/Readers/OdsReader.html +562 -60
- data/doc/Workbook/Readers/TxtReader.html +2 -2
- data/doc/Workbook/Readers/XlsReader.html +14 -14
- data/doc/Workbook/Readers/XlsShared.html +67 -67
- data/doc/Workbook/Readers/XlsxReader.html +7 -7
- data/doc/Workbook/Row.html +243 -5
- data/doc/Workbook/Sheet.html +2 -2
- data/doc/Workbook/Table.html +669 -58
- data/doc/Workbook/Template.html +5 -5
- data/doc/Workbook/Writers.html +1 -1
- data/doc/Workbook/Writers/CsvTableWriter.html +1 -1
- data/doc/Workbook/Writers/HtmlWriter.html +27 -13
- data/doc/Workbook/Writers/XlsWriter.html +2 -2
- data/doc/_index.html +23 -8
- data/doc/class_list.html +1 -1
- data/doc/file.README.html +16 -12
- data/doc/index.html +16 -12
- data/doc/method_list.html +232 -72
- data/doc/top-level-namespace.html +1 -1
- data/lib/workbook/book.rb +25 -25
- data/lib/workbook/cell.rb +33 -33
- data/lib/workbook/format.rb +10 -10
- data/lib/workbook/modules/raw_objects_storage.rb +19 -19
- data/lib/workbook/modules/table_diff_sort.rb +22 -22
- data/lib/workbook/modules/type_parser.rb +18 -18
- data/lib/workbook/nil_value.rb +6 -6
- data/lib/workbook/readers/csv_reader.rb +8 -8
- data/lib/workbook/readers/ods_reader.rb +92 -46
- data/lib/workbook/readers/txt_reader.rb +2 -2
- data/lib/workbook/readers/xls_reader.rb +19 -19
- data/lib/workbook/readers/xls_shared.rb +70 -70
- data/lib/workbook/readers/xlsx_reader.rb +42 -42
- data/lib/workbook/row.rb +59 -29
- data/lib/workbook/sheet.rb +8 -8
- data/lib/workbook/table.rb +52 -19
- data/lib/workbook/template.rb +10 -10
- data/lib/workbook/version.rb +1 -1
- data/lib/workbook/writers/csv_table_writer.rb +1 -1
- data/lib/workbook/writers/html_writer.rb +6 -6
- data/lib/workbook/writers/xls_writer.rb +12 -12
- data/rbeautify.rb +232 -0
- data/test/artifacts/book_with_colspans.ods +0 -0
- data/test/artifacts/book_with_tabs_and_colours.ods +0 -0
- data/test/test_book.rb +10 -10
- data/test/test_cell.rb +14 -14
- data/test/test_format.rb +11 -11
- data/test/test_functional.rb +3 -3
- data/test/test_modules_table_diff_sort.rb +24 -24
- data/test/test_modules_type_parser.rb +27 -27
- data/test/test_readers_csv_reader.rb +11 -11
- data/test/test_readers_ods_reader.rb +22 -15
- data/test/test_readers_txt_reader.rb +13 -13
- data/test/test_readers_xls_reader.rb +11 -11
- data/test/test_readers_xlsx_reader.rb +5 -5
- data/test/test_row.rb +96 -26
- data/test/test_sheet.rb +9 -9
- data/test/test_table.rb +42 -26
- data/test/test_template.rb +3 -3
- data/test/test_writers_html_writer.rb +6 -4
- data/test/test_writers_xls_writer.rb +7 -7
- metadata +5 -1
@@ -103,7 +103,7 @@
|
|
103
103
|
</div>
|
104
104
|
|
105
105
|
<div id="footer">
|
106
|
-
Generated on Sun May
|
106
|
+
Generated on Sun May 19 23:16:28 2013 by
|
107
107
|
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
108
108
|
0.8.5.2 (ruby-1.9.3).
|
109
109
|
</div>
|
data/lib/workbook/book.rb
CHANGED
@@ -9,9 +9,9 @@ require 'workbook/readers/csv_reader'
|
|
9
9
|
require 'workbook/readers/txt_reader'
|
10
10
|
|
11
11
|
module Workbook
|
12
|
-
# The Book class is the container of sheets. It can be inialized by either the standard initalizer or the open method. The
|
12
|
+
# The Book class is the container of sheets. It can be inialized by either the standard initalizer or the open method. The
|
13
13
|
# Book class can also keep a reference to a template class, storing shared formatting options.
|
14
|
-
#
|
14
|
+
#
|
15
15
|
class Book < Array
|
16
16
|
include Workbook::Readers::XlsShared
|
17
17
|
include Workbook::Writers::XlsWriter
|
@@ -21,12 +21,12 @@ module Workbook
|
|
21
21
|
include Workbook::Readers::XlsxReader
|
22
22
|
include Workbook::Readers::CsvReader
|
23
23
|
include Workbook::Readers::TxtReader
|
24
|
-
|
24
|
+
|
25
25
|
attr_accessor :title
|
26
26
|
attr_accessor :template
|
27
|
-
|
27
|
+
|
28
28
|
# @param [Workbook::Sheet, Array] sheet create a new workbook based on an existing sheet, or initialize a sheet based on the array
|
29
|
-
# @return [Workbook::Book]
|
29
|
+
# @return [Workbook::Book]
|
30
30
|
def initialize sheet=Workbook::Sheet.new([], self, options={})
|
31
31
|
if sheet.is_a? Workbook::Sheet
|
32
32
|
push sheet
|
@@ -34,32 +34,32 @@ module Workbook
|
|
34
34
|
push Workbook::Sheet.new(sheet, self, options)
|
35
35
|
end
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
# @return [Workbook::Format] returns the template describing how the document should be/is formatted
|
39
39
|
def template
|
40
40
|
@template ||= Workbook::Template.new
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
# @param [Workbook::Format] template a template describing how the document should be/is formatted
|
44
44
|
def template= template
|
45
45
|
raise ArgumentError, "format should be a Workboot::Format" unless template.is_a? Workbook::Template
|
46
46
|
@template = template
|
47
47
|
end
|
48
|
-
|
48
|
+
|
49
49
|
# The title of the workbook
|
50
50
|
#
|
51
51
|
# @return [String] the title of the workbook
|
52
52
|
def title
|
53
53
|
@title ? @title : "untitled document"
|
54
54
|
end
|
55
|
-
|
55
|
+
|
56
56
|
# Push (like in array) a sheet to the workbook (parameter is optional, default is a new sheet)
|
57
57
|
#
|
58
58
|
# @param [Workbook::Sheet] sheet
|
59
|
-
|
59
|
+
def push sheet=Workbook::Sheet.new
|
60
60
|
super(sheet)
|
61
61
|
end
|
62
|
-
|
62
|
+
|
63
63
|
# Sheet returns the first sheet of a workbook, or an empty one.
|
64
64
|
#
|
65
65
|
# @return [Workbook::Sheet] The first sheet, and creates an empty one if one doesn't exists
|
@@ -67,14 +67,14 @@ module Workbook
|
|
67
67
|
push Workbook::Sheet.new unless first
|
68
68
|
first
|
69
69
|
end
|
70
|
-
|
70
|
+
|
71
71
|
# If the first sheet has any contents
|
72
72
|
#
|
73
73
|
# @return [Boolean] returns true if the first sheet has contents
|
74
74
|
def has_contents?
|
75
75
|
sheet.has_contents?
|
76
76
|
end
|
77
|
-
|
77
|
+
|
78
78
|
# Loads an external file into an existing worbook
|
79
79
|
#
|
80
80
|
# @param [String] filename a string with a reference to the file to be opened
|
@@ -88,7 +88,7 @@ module Workbook
|
|
88
88
|
open_binary filename, extension
|
89
89
|
end
|
90
90
|
end
|
91
|
-
|
91
|
+
|
92
92
|
# Open the file in binary, read-only mode, do not read it, but pas it throug to the extension determined loaded
|
93
93
|
#
|
94
94
|
# @param [String] filename a string with a reference to the file to be opened
|
@@ -99,7 +99,7 @@ module Workbook
|
|
99
99
|
f = File.open(filename,'rb')
|
100
100
|
send("load_#{extension}".to_sym,f)
|
101
101
|
end
|
102
|
-
|
102
|
+
|
103
103
|
# Open the file in non-binary, read-only mode, read it and parse it to UTF-8
|
104
104
|
#
|
105
105
|
# @param [String] filename a string with a reference to the file to be opened
|
@@ -111,14 +111,14 @@ module Workbook
|
|
111
111
|
t = text_to_utf8(t)
|
112
112
|
send("load_#{extension}".to_sym,t)
|
113
113
|
end
|
114
|
-
|
115
|
-
|
114
|
+
|
115
|
+
|
116
116
|
# Helper method to convert text in a file to UTF-8
|
117
|
-
#
|
117
|
+
#
|
118
118
|
# @param [String] text a string to convert
|
119
119
|
def text_to_utf8 text
|
120
120
|
if RUBY_VERSION < '1.9'
|
121
|
-
require 'rchardet'
|
121
|
+
require 'rchardet'
|
122
122
|
require 'iconv'
|
123
123
|
detected_encoding = CharDet.detect(text)
|
124
124
|
detected_encoding = detected_encoding['encoding']
|
@@ -134,14 +134,14 @@ module Workbook
|
|
134
134
|
end
|
135
135
|
return text
|
136
136
|
end
|
137
|
-
|
137
|
+
|
138
138
|
# @param [String] filename The full filename, or path
|
139
139
|
#
|
140
140
|
# @return [String] The file extension
|
141
141
|
def file_extension(filename)
|
142
142
|
File.extname(filename).gsub('.','').downcase if filename
|
143
143
|
end
|
144
|
-
|
144
|
+
|
145
145
|
# Create an instance from a file, using open.
|
146
146
|
#
|
147
147
|
# @param [String] filename of the document
|
@@ -163,7 +163,7 @@ module Workbook
|
|
163
163
|
wb.read(stringio_or_string, filetype)
|
164
164
|
wb
|
165
165
|
end
|
166
|
-
|
166
|
+
|
167
167
|
# Load the CSV data contained in the given StringIO or String object
|
168
168
|
#
|
169
169
|
# @param [StringIO] stringio_or_string StringIO stream or String object, with data in CSV format
|
@@ -176,14 +176,14 @@ module Workbook
|
|
176
176
|
end
|
177
177
|
|
178
178
|
# Create or open the existing sheet at an index value
|
179
|
-
#
|
179
|
+
#
|
180
180
|
# @param [Integer] index the index of the sheet
|
181
181
|
def create_or_open_sheet_at index
|
182
182
|
s = self[index]
|
183
183
|
s = self[index] = Workbook::Sheet.new if s == nil
|
184
184
|
s.book = self
|
185
|
-
s
|
185
|
+
s
|
186
186
|
end
|
187
|
-
|
187
|
+
|
188
188
|
end
|
189
189
|
end
|
data/lib/workbook/cell.rb
CHANGED
@@ -5,37 +5,37 @@ require 'workbook/modules/type_parser'
|
|
5
5
|
module Workbook
|
6
6
|
class Cell
|
7
7
|
include Workbook::Modules::TypeParser
|
8
|
-
|
8
|
+
|
9
9
|
attr_accessor :value
|
10
10
|
attr_accessor :format
|
11
11
|
attr_accessor :formula
|
12
12
|
attr_accessor :colspan
|
13
13
|
attr_accessor :rowspan
|
14
|
-
|
14
|
+
|
15
15
|
# Note that these types are sorted by 'importance'
|
16
16
|
VALID_TYPES = [Numeric,String,Time,Date,TrueClass,FalseClass,NilClass,Workbook::NilValue]
|
17
|
-
|
17
|
+
|
18
18
|
# Evaluates a value for class-validity
|
19
19
|
#
|
20
20
|
# @param [Numeric,String,Time,Date,TrueClass,FalseClass,NilClass,Object] value the value to evaluate
|
21
21
|
# @return [Boolean] returns true when the value is a valid cell value
|
22
22
|
def valid_value? value
|
23
|
-
valid_type = false
|
24
|
-
VALID_TYPES.each {|t| return true if value.is_a? t}
|
23
|
+
valid_type = false
|
24
|
+
VALID_TYPES.each {|t| return true if value.is_a? t}
|
25
25
|
valid_type
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
# @param [Numeric,String,Time,Date,TrueClass,FalseClass,NilClass] value a valid value
|
29
29
|
# @param [Hash] options a reference to :format (Workbook::Format) can be specified
|
30
30
|
def initialize value=nil, options={}
|
31
31
|
if valid_value? value
|
32
|
-
format = options[:format]
|
32
|
+
format = options[:format]
|
33
33
|
@value = value
|
34
34
|
else
|
35
35
|
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])"
|
36
36
|
end
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
# @param [Workbook::Format, Hash] f set the formatting properties of this Cell
|
40
40
|
def format= f
|
41
41
|
if f.is_a? Workbook::Format
|
@@ -46,7 +46,7 @@ module Workbook
|
|
46
46
|
@format = Workbook::Format.new
|
47
47
|
end
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
def format
|
51
51
|
@format ||= Workbook::Format.new
|
52
52
|
end
|
@@ -60,16 +60,16 @@ module Workbook
|
|
60
60
|
other == self.value
|
61
61
|
end
|
62
62
|
end
|
63
|
-
|
63
|
+
|
64
64
|
# returns true when the value of the cell is nil.
|
65
65
|
# @return [Boolean]
|
66
66
|
def nil?
|
67
67
|
return value.nil?
|
68
68
|
end
|
69
|
-
|
69
|
+
|
70
70
|
# returns a symbol representation of the cell's value
|
71
71
|
# @return [Symbol] a symbol representation
|
72
|
-
# @example
|
72
|
+
# @example
|
73
73
|
#
|
74
74
|
# <Workbook::Cell value="yet another value">.to_sym # returns :yet_another_value
|
75
75
|
def to_sym
|
@@ -79,19 +79,19 @@ module Workbook
|
|
79
79
|
v = value.to_s.downcase
|
80
80
|
v = v.gsub(' (j/?/leeg)','').gsub(/dd-mm-(.*)/,'').gsub(/\ja\/nee/,'').gsub(/\(\)/,'').gsub(/[\(\)]+/, '')
|
81
81
|
v = v.strip.gsub(/(\.|\?|,|\=)/,'').
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
accents = {
|
82
|
+
gsub('$','').
|
83
|
+
gsub(/\&/,'en').
|
84
|
+
gsub(/\+/,'_plus_').
|
85
|
+
gsub(/\s/, "_").
|
86
|
+
gsub('–_','').
|
87
|
+
gsub('-_','').
|
88
|
+
gsub('+_','').
|
89
|
+
gsub('/_','_').
|
90
|
+
gsub('/','_').
|
91
|
+
gsub('__','_').
|
92
|
+
gsub('-','')
|
93
|
+
|
94
|
+
accents = {
|
95
95
|
['á','à','â','ä','ã'] => 'a',
|
96
96
|
['Ã','Ä','Â','À','�?'] => 'A',
|
97
97
|
['é','è','ê','ë'] => 'e',
|
@@ -121,7 +121,7 @@ module Workbook
|
|
121
121
|
end
|
122
122
|
v
|
123
123
|
end
|
124
|
-
|
124
|
+
|
125
125
|
# @param [Workbook::Cell] other cell to compare against, can compare different value-types using #compare_on_class
|
126
126
|
def <=> other
|
127
127
|
rv = nil
|
@@ -130,13 +130,13 @@ module Workbook
|
|
130
130
|
rescue NoMethodError => e
|
131
131
|
rv = compare_on_class other
|
132
132
|
end
|
133
|
-
if rv == nil
|
133
|
+
if rv == nil
|
134
134
|
rv = compare_on_class other
|
135
135
|
end
|
136
136
|
return rv
|
137
137
|
|
138
138
|
end
|
139
|
-
|
139
|
+
|
140
140
|
# Compare on class level
|
141
141
|
#
|
142
142
|
# @param [Workbook::Cell] other cell to compare against
|
@@ -147,21 +147,21 @@ module Workbook
|
|
147
147
|
other_value = importance_of_class other_value
|
148
148
|
self_value <=> other_value
|
149
149
|
end
|
150
|
-
|
150
|
+
|
151
151
|
# Returns the importance of a value's class
|
152
152
|
#
|
153
153
|
# @param value a potential value for a cell
|
154
154
|
def importance_of_class value
|
155
|
-
VALID_TYPES.each_with_index do |c,i|
|
155
|
+
VALID_TYPES.each_with_index do |c,i|
|
156
156
|
return i if value.is_a? c
|
157
157
|
end
|
158
158
|
return nil
|
159
159
|
end
|
160
|
-
|
160
|
+
|
161
161
|
def inspect
|
162
162
|
"<Workbook::Cell @value=#{value}>"
|
163
163
|
end
|
164
|
-
|
164
|
+
|
165
165
|
# convert value to string, and in case of a Date or Time value, apply formatting
|
166
166
|
# @return [String]
|
167
167
|
def to_s
|
@@ -171,7 +171,7 @@ module Workbook
|
|
171
171
|
value.to_s
|
172
172
|
end
|
173
173
|
end
|
174
|
-
|
174
|
+
|
175
175
|
def colspan
|
176
176
|
@colspan.to_i if @colspan.to_i > 1
|
177
177
|
end
|
data/lib/workbook/format.rb
CHANGED
@@ -8,14 +8,14 @@ module Workbook
|
|
8
8
|
alias_method :merge_hash, :merge
|
9
9
|
alias_method :merge_hash!, :merge!
|
10
10
|
attr_accessor :name, :parent
|
11
|
-
|
11
|
+
|
12
12
|
# Initialize
|
13
13
|
# @param [Workbook::Format, Hash] options (e.g. :background, :color
|
14
14
|
def initialize options={}, name=nil
|
15
15
|
options.each {|k,v| self[k]=v}
|
16
16
|
self.name = name
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
# Does the current format feature a background *color*? (not black or white or transparant).
|
20
20
|
def has_background_color? color=:any
|
21
21
|
if flattened[:background_color]
|
@@ -24,7 +24,7 @@ module Workbook
|
|
24
24
|
return false
|
25
25
|
end
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
# Returns a string that can be used as inline cell styling (e.g. `<td style="<%=cell.format.to_css%>"><%=cell%></td>`)
|
29
29
|
# @return String very basic CSS styling string
|
30
30
|
def to_css
|
@@ -34,7 +34,7 @@ module Workbook
|
|
34
34
|
css_parts.push("color: #{flattened[:color].to_s}") if flattened[:color]
|
35
35
|
css_parts.join("; ")
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
# Combines the formatting options of one with another, removes as a consequence the reference to the raw object's equivalent.
|
39
39
|
# @param [Workbook::Format] other_format
|
40
40
|
# @return [Workbook::Format] a new resulting Workbook::Format
|
@@ -42,15 +42,15 @@ module Workbook
|
|
42
42
|
self.remove_all_raws!
|
43
43
|
self.merge_hash(other_format)
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
# Applies the formatting options of self with another, removes as a consequence the reference to the raw object's equivalent.
|
47
|
-
# @param [Workbook::Format] other_format
|
47
|
+
# @param [Workbook::Format] other_format
|
48
48
|
# @return [Workbook::Format] self
|
49
49
|
def merge!(other_format)
|
50
50
|
self.remove_all_raws!
|
51
51
|
self.merge_hash!(other_format)
|
52
52
|
end
|
53
|
-
|
53
|
+
|
54
54
|
# returns an array of all formats this style is inheriting from (including itself)
|
55
55
|
# @return [Array<Workbook::Format>] an array of Workbook::Formats
|
56
56
|
def formats
|
@@ -63,13 +63,13 @@ module Workbook
|
|
63
63
|
end
|
64
64
|
formats.reverse
|
65
65
|
end
|
66
|
-
|
66
|
+
|
67
67
|
# returns an array of all format-names this style is inheriting from (and this style)
|
68
68
|
# @return [Array<String>] an array of Workbook::Formats
|
69
|
-
def all_names
|
69
|
+
def all_names
|
70
70
|
formats.collect{|a| a.name}
|
71
71
|
end
|
72
|
-
|
72
|
+
|
73
73
|
# Applies the formatting options of self with its parents until no parent can be found
|
74
74
|
# @return [Workbook::Format] new Workbook::Format that is the result of merging current style with all its parent's styles.
|
75
75
|
def flattened
|
@@ -1,37 +1,37 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
module Workbook
|
3
|
-
|
3
|
+
module Modules
|
4
4
|
# Adds support for storing raw objects, used in e.g. Format and Template
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
module RawObjectsStorage
|
6
|
+
|
7
|
+
# A raw is a 'raw' object, representing a workbook, or cell, or whatever... in a particular format (defined by its class)
|
8
8
|
def add_raw raw_object
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
raws[raw_object.class]=raw_object
|
10
|
+
end
|
11
|
+
|
12
12
|
# Returns true if there is a template for a certain class, otherwise false
|
13
|
-
|
14
|
-
|
13
|
+
def has_raw_for? raw_object_class
|
14
|
+
raws.each { |tc,t| return true if tc == raw_object_class}
|
15
15
|
return false
|
16
|
-
|
17
|
-
|
16
|
+
end
|
17
|
+
|
18
18
|
# Returns raw data stored for a type of raw object (if available)
|
19
19
|
# @param [Class] raw_object_class (e.g. Spreadsheet::Format for the Spreadsheet-gem)
|
20
20
|
def return_raw_for raw_object_class
|
21
|
-
|
21
|
+
raws.each { |tc,t| return t if tc == raw_object_class}
|
22
22
|
return nil
|
23
|
-
end
|
24
|
-
|
23
|
+
end
|
24
|
+
|
25
25
|
# Remove all raw data references
|
26
26
|
def remove_all_raws!
|
27
27
|
@raws = {}
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
# Return all raw data references
|
31
|
-
|
31
|
+
def raws
|
32
32
|
@raws = {} unless defined? @raws
|
33
33
|
@raws
|
34
|
-
|
35
|
-
|
36
|
-
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
37
|
end
|