workbook 0.3.1 → 0.4
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/.yardoc/checksums +21 -18
- data/.yardoc/object_types +0 -0
- data/.yardoc/objects/root.dat +0 -0
- data/Gemfile.lock +4 -4
- data/README.md +8 -5
- data/doc/RubyXL/Cell.html +18 -19
- data/doc/RubyXL/Workbook.html +116 -114
- data/doc/RubyXL.html +3 -3
- data/doc/Workbook/Book.html +513 -145
- data/doc/Workbook/Cell.html +181 -170
- data/doc/Workbook/Format.html +591 -77
- data/doc/Workbook/Modules/RawObjectsStorage.html +39 -45
- data/doc/Workbook/Modules/TableDiffSort.html +225 -87
- data/doc/Workbook/Modules/TypeParser.html +182 -131
- data/doc/Workbook/Modules.html +3 -3
- data/doc/Workbook/Readers/CsvReader.html +101 -39
- data/doc/Workbook/Readers/OdsReader.html +564 -0
- data/doc/Workbook/Readers/TxtReader.html +12 -14
- data/doc/Workbook/Readers/XlsReader.html +154 -138
- data/doc/Workbook/Readers/XlsShared.html +71 -72
- data/doc/Workbook/Readers/XlsxReader.html +89 -82
- data/doc/Workbook/Readers.html +6 -6
- data/doc/Workbook/Row.html +421 -206
- data/doc/Workbook/Sheet.html +379 -32
- data/doc/Workbook/Table.html +328 -90
- data/doc/Workbook/Template.html +55 -60
- data/doc/Workbook/Writers/CsvTableWriter.html +33 -8
- data/doc/Workbook/Writers/HtmlWriter.html +393 -0
- data/doc/Workbook/Writers/XlsWriter.html +132 -92
- data/doc/Workbook/Writers.html +5 -5
- data/doc/Workbook.html +16 -4
- data/doc/_index.html +45 -15
- data/doc/class_list.html +1 -1
- data/doc/css/style.css +10 -0
- data/doc/file.README.html +53 -48
- data/doc/frames.html +1 -1
- data/doc/index.html +53 -48
- data/doc/method_list.html +232 -56
- data/doc/top-level-namespace.html +3 -3
- data/lib/workbook/book.rb +27 -1
- data/lib/workbook/format.rb +46 -7
- data/lib/workbook/modules/type_parser.rb +8 -1
- data/lib/workbook/readers/ods_reader.rb +93 -0
- data/lib/workbook/row.rb +7 -0
- data/lib/workbook/sheet.rb +10 -0
- data/lib/workbook/version.rb +1 -1
- data/lib/workbook/writers/html_writer.rb +56 -0
- data/test/artifacts/book_with_tabs_and_colours.ods +0 -0
- data/test/artifacts/complex_types.ods +0 -0
- data/test/artifacts/excel_different_types.ods +0 -0
- data/test/artifacts/simple_sheet.ods +0 -0
- data/test/test_book.rb +6 -0
- data/test/test_format.rb +39 -0
- data/test/test_modules_type_parser.rb +2 -0
- data/test/test_readers_csv_reader.rb +44 -0
- data/test/test_readers_ods_reader.rb +51 -0
- data/test/test_readers_txt_reader.rb +53 -0
- data/test/test_row.rb +12 -0
- data/test/test_sheet.rb +12 -0
- data/test/test_writers_html_writer.rb +37 -0
- data/workbook.gemspec +2 -2
- metadata +21 -4
@@ -6,7 +6,7 @@
|
|
6
6
|
<title>
|
7
7
|
Top Level Namespace
|
8
8
|
|
9
|
-
— Documentation by YARD 0.8.
|
9
|
+
— Documentation by YARD 0.8.5.2
|
10
10
|
|
11
11
|
</title>
|
12
12
|
|
@@ -103,9 +103,9 @@
|
|
103
103
|
</div>
|
104
104
|
|
105
105
|
<div id="footer">
|
106
|
-
Generated on
|
106
|
+
Generated on Sun May 5 14:58:04 2013 by
|
107
107
|
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
108
|
-
0.8.
|
108
|
+
0.8.5.2 (ruby-1.9.3).
|
109
109
|
</div>
|
110
110
|
|
111
111
|
</body>
|
data/lib/workbook/book.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
require 'workbook/writers/xls_writer'
|
3
|
+
require 'workbook/writers/html_writer'
|
3
4
|
require 'workbook/readers/xls_reader'
|
4
5
|
require 'workbook/readers/xls_shared'
|
5
6
|
require 'workbook/readers/xlsx_reader'
|
7
|
+
require 'workbook/readers/ods_reader'
|
6
8
|
require 'workbook/readers/csv_reader'
|
7
9
|
require 'workbook/readers/txt_reader'
|
8
10
|
|
@@ -13,10 +15,12 @@ module Workbook
|
|
13
15
|
class Book < Array
|
14
16
|
include Workbook::Readers::XlsShared
|
15
17
|
include Workbook::Writers::XlsWriter
|
18
|
+
include Workbook::Writers::HtmlWriter
|
16
19
|
include Workbook::Readers::XlsReader
|
20
|
+
include Workbook::Readers::OdsReader
|
17
21
|
include Workbook::Readers::XlsxReader
|
18
22
|
include Workbook::Readers::CsvReader
|
19
|
-
include Workbook::Readers::TxtReader
|
23
|
+
include Workbook::Readers::TxtReader
|
20
24
|
|
21
25
|
attr_accessor :title
|
22
26
|
attr_accessor :template
|
@@ -149,6 +153,28 @@ module Workbook
|
|
149
153
|
return wb
|
150
154
|
end
|
151
155
|
|
156
|
+
# Create an instance from the given stream or string, which should be in CSV or TXT format
|
157
|
+
#
|
158
|
+
# @param [StringIO] stringio_or_string StringIO stream or String object, with data in CSV or TXT format
|
159
|
+
# @param [Symbol] filetype (currently only :csv or :txt), indicating the format of the first parameter
|
160
|
+
# @return [Workbook::Book] A new instance
|
161
|
+
def self.read(stringio_or_string, filetype)
|
162
|
+
wb = self.new
|
163
|
+
wb.read(stringio_or_string, filetype)
|
164
|
+
wb
|
165
|
+
end
|
166
|
+
|
167
|
+
# Load the CSV data contained in the given StringIO or String object
|
168
|
+
#
|
169
|
+
# @param [StringIO] stringio_or_string StringIO stream or String object, with data in CSV format
|
170
|
+
# @param [Symbol] filetype (currently only :csv or :txt), indicating the format of the first parameter
|
171
|
+
def read(stringio_or_string, filetype)
|
172
|
+
raise ArgumentError.new("The filetype parameter should be either :csv or :txt") unless [:csv, :txt].include?(filetype)
|
173
|
+
t = stringio_or_string.respond_to?(:read) ? stringio_or_string.read : stringio_or_string.to_s
|
174
|
+
t = text_to_utf8(t)
|
175
|
+
send(:"parse_#{filetype}", t)
|
176
|
+
end
|
177
|
+
|
152
178
|
# Create or open the existing sheet at an index value
|
153
179
|
#
|
154
180
|
# @param [Integer] index the index of the sheet
|
data/lib/workbook/format.rb
CHANGED
@@ -6,38 +6,77 @@ module Workbook
|
|
6
6
|
class Format < Hash
|
7
7
|
include Workbook::Modules::RawObjectsStorage
|
8
8
|
alias_method :merge_hash, :merge
|
9
|
+
alias_method :merge_hash!, :merge!
|
9
10
|
|
10
|
-
attr_accessor :name
|
11
|
+
attr_accessor :name, :parent
|
11
12
|
|
12
13
|
# Initialize
|
13
14
|
# @param [Workbook::Format, Hash] options (e.g. :background, :color
|
14
|
-
def initialize options={}
|
15
|
+
def initialize options={}, name=nil
|
15
16
|
options.each {|k,v| self[k]=v}
|
17
|
+
self.name = name
|
16
18
|
end
|
17
19
|
|
18
20
|
# Does the current format feature a background *color*? (not black or white or transparant).
|
19
21
|
def has_background_color? color=:any
|
20
|
-
if
|
21
|
-
return (
|
22
|
+
if flattened[:background_color]
|
23
|
+
return (flattened[:background_color].downcase==color.to_s.downcase or (!(flattened[:background_color]==nil or (flattened[:background_color].is_a? String and (flattened[:background_color].downcase=='#ffffff' or flattened[:background_color]=='#000000'))) and color==:any))
|
22
24
|
else
|
23
25
|
return false
|
24
26
|
end
|
25
27
|
end
|
26
28
|
|
27
29
|
# Returns a string that can be used as inline cell styling (e.g. `<td style="<%=cell.format.to_css%>"><%=cell%></td>`)
|
28
|
-
# @return
|
30
|
+
# @return String very basic CSS styling string
|
29
31
|
def to_css
|
30
32
|
css_parts = []
|
31
|
-
|
32
|
-
css_parts.push("
|
33
|
+
background = [flattened[:background_color].to_s,flattened[:background].to_s].join(" ").strip
|
34
|
+
css_parts.push("background: #{background}") if background and background != ""
|
35
|
+
css_parts.push("color: #{flattened[:color].to_s}") if flattened[:color]
|
33
36
|
css_parts.join("; ")
|
34
37
|
end
|
35
38
|
|
36
39
|
# Combines the formatting options of one with another, removes as a consequence the reference to the raw object's equivalent.
|
37
40
|
# @param [Workbook::Format] other_format
|
41
|
+
# @return [Workbook::Format] a new resulting Workbook::Format
|
38
42
|
def merge(other_format)
|
39
43
|
self.remove_all_raws!
|
40
44
|
self.merge_hash(other_format)
|
41
45
|
end
|
46
|
+
|
47
|
+
# Applies the formatting options of self with another, removes as a consequence the reference to the raw object's equivalent.
|
48
|
+
# @param [Workbook::Format] other_format
|
49
|
+
# @return [Workbook::Format] self
|
50
|
+
def merge!(other_format)
|
51
|
+
self.remove_all_raws!
|
52
|
+
self.merge_hash!(other_format)
|
53
|
+
end
|
54
|
+
|
55
|
+
# returns an array of all formats this style is inheriting from (including itself)
|
56
|
+
# @return [Array<Workbook::Format>] an array of Workbook::Formats
|
57
|
+
def formats
|
58
|
+
formats=[]
|
59
|
+
f = self
|
60
|
+
formats << f
|
61
|
+
while f.parent
|
62
|
+
formats << f.parent
|
63
|
+
f = f.parent
|
64
|
+
end
|
65
|
+
formats.reverse
|
66
|
+
end
|
67
|
+
|
68
|
+
# returns an array of all format-names this style is inheriting from (and this style)
|
69
|
+
# @return [Array<String>] an array of Workbook::Formats
|
70
|
+
def all_names
|
71
|
+
formats.collect{|a| a.name}
|
72
|
+
end
|
73
|
+
|
74
|
+
# Applies the formatting options of self with its parents until no parent can be found
|
75
|
+
# @return [Workbook::Format] new Workbook::Format that is the result of merging current style with all its parent's styles.
|
76
|
+
def flattened
|
77
|
+
ff=Workbook::Format.new()
|
78
|
+
formats.each{|a| ff.merge!(a) }
|
79
|
+
return ff
|
80
|
+
end
|
42
81
|
end
|
43
82
|
end
|
@@ -90,9 +90,16 @@ module Workbook
|
|
90
90
|
rv = v
|
91
91
|
end
|
92
92
|
begin
|
93
|
-
rv = Date.parse(v.to_i.to_s) == rv ? v : rv # disqualify
|
93
|
+
rv = Date.parse(v.to_i.to_s) == rv ? v : rv # disqualify if it is only based on the first number
|
94
94
|
rescue ArgumentError
|
95
95
|
end
|
96
|
+
# try strptime with format 'mm/dd/yyyy'
|
97
|
+
if rv == v && /^\d{1,2}[\/-]\d{1,2}[\/-]\d{4}/ =~ v
|
98
|
+
begin
|
99
|
+
rv = Date.strptime(v, "%m/%d/%Y")
|
100
|
+
rescue ArgumentError
|
101
|
+
end
|
102
|
+
end
|
96
103
|
end
|
97
104
|
rv
|
98
105
|
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
module Workbook
|
4
|
+
module Readers
|
5
|
+
module OdsReader
|
6
|
+
|
7
|
+
# reads self with and ods-type content.xml
|
8
|
+
# @param [String,File] file_obj a file or file reference
|
9
|
+
# @return [Workbook::Book] self
|
10
|
+
def load_ods file_obj
|
11
|
+
file_obj = file_obj.path if file_obj.is_a? File
|
12
|
+
content = ""
|
13
|
+
styles = ""
|
14
|
+
Zip::ZipFile.open(file_obj) do |zipfile|
|
15
|
+
zipfile.entries.each do |file|
|
16
|
+
styles = zipfile.read(file.name) if file.name == "styles.xml"
|
17
|
+
|
18
|
+
content = zipfile.read(file.name) if file.name == "content.xml"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
content = Nokogiri.XML(content)
|
22
|
+
styles = Nokogiri.XML(styles)
|
23
|
+
template.add_raw content
|
24
|
+
parse_ods_style styles
|
25
|
+
parse_ods content
|
26
|
+
return self
|
27
|
+
end
|
28
|
+
|
29
|
+
def set_format_property format, property, value
|
30
|
+
value.strip!
|
31
|
+
format[property] = value if value and value != ""
|
32
|
+
end
|
33
|
+
|
34
|
+
def parse_ods_style parse_ods_style
|
35
|
+
parse_ods_style.xpath("//style:style").each do |style|
|
36
|
+
style_family = style.xpath("@style:family").to_s
|
37
|
+
if style_family == "table-cell"
|
38
|
+
format = Workbook::Format.new
|
39
|
+
format.name = style.xpath("@style:name").to_s
|
40
|
+
format.parent = self.template.formats[style.xpath("@style:parent-style-name").to_s]
|
41
|
+
set_format_property format, :border, style.xpath("style:table-cell-properties/@fo:border").to_s
|
42
|
+
set_format_property format, :vertical_align, style.xpath("style:table-cell-properties/@style:vertical-align").to_s.gsub("automatic","auto")
|
43
|
+
set_format_property format, :padding, style.xpath("style:table-cell-properties/@fo:padding").to_s.gsub("automatic","auto")
|
44
|
+
set_format_property format, :font, style.xpath("style:text-properties/style:font-name").to_s + " " + style.xpath("style:text-properties/fo:font-size").to_s + " " + style.xpath("style:text-properties/fo:font-weight").to_s
|
45
|
+
set_format_property format, :color, style.xpath("style:text-properties/@fo:color").to_s
|
46
|
+
set_format_property format, :background_color, style.xpath("style:table-cell-properties/@fo:background-color").to_s
|
47
|
+
self.template.add_format(format)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# updates self with and ods-type content.xml
|
53
|
+
# @param [Nokogiri::XML::Document] ods_spreadsheet nokogirified content.xml
|
54
|
+
# @return [Workbook::Book] self
|
55
|
+
def parse_ods ods_spreadsheet=template.raws[Nokogiri::XML::Document], options={}
|
56
|
+
options = {:additional_type_parsing=>false}.merge options
|
57
|
+
# styles
|
58
|
+
#puts ods_spreadsheet
|
59
|
+
parse_ods_style ods_spreadsheet
|
60
|
+
|
61
|
+
# data
|
62
|
+
ods_spreadsheet.xpath("//office:body/office:spreadsheet").each_with_index do |sheet,sheetindex|
|
63
|
+
s = self.create_or_open_sheet_at(sheetindex)
|
64
|
+
sheet.xpath("table:table").each_with_index do |table,tableindex|
|
65
|
+
t = s.create_or_open_table_at(tableindex)
|
66
|
+
table.xpath("table:table-row").each_with_index do |row,rowindex|
|
67
|
+
row = row.xpath("table:table-cell").collect do |cell|
|
68
|
+
c = Workbook::Cell.new()
|
69
|
+
cell_style_name = cell.xpath('@table:style-name').to_s
|
70
|
+
c.format = self.template.formats[cell_style_name]
|
71
|
+
valuetype = cell.xpath('@office:value-type').to_s
|
72
|
+
value = cell.xpath("text:p//text()").to_s
|
73
|
+
value = value == "" ? nil : value
|
74
|
+
case valuetype
|
75
|
+
when 'float'
|
76
|
+
value = cell.xpath("@office:value").to_s.to_f
|
77
|
+
when 'integer'
|
78
|
+
value = cell.xpath("@office:value").to_s.to_i
|
79
|
+
when 'date'
|
80
|
+
value = DateTime.parse(cell.xpath("@office:date-value").to_s)
|
81
|
+
end
|
82
|
+
c.value = value
|
83
|
+
c
|
84
|
+
end
|
85
|
+
t << Workbook::Row.new(row)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
return self
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
data/lib/workbook/row.rb
CHANGED
@@ -134,6 +134,13 @@ module Workbook
|
|
134
134
|
table != nil and self.object_id == table.first.object_id
|
135
135
|
end
|
136
136
|
|
137
|
+
# Returns true when all the cells in the row have values whose to_s value equals an empty string
|
138
|
+
#
|
139
|
+
# @return [Boolean]
|
140
|
+
def no_values?
|
141
|
+
all? {|c| c.value.to_s == ''}
|
142
|
+
end
|
143
|
+
|
137
144
|
# Converts a row to an array of symbol representations of the row content, see also: Workbook::Cell#to_sym
|
138
145
|
# @return [Array<Symbol>] returns row as an array of symbols
|
139
146
|
def to_symbols
|
data/lib/workbook/sheet.rb
CHANGED
@@ -64,5 +64,15 @@ module Workbook
|
|
64
64
|
s.each{|t| c << t.clone}
|
65
65
|
return c
|
66
66
|
end
|
67
|
+
|
68
|
+
# Create or open the existing table at an index value
|
69
|
+
#
|
70
|
+
# @param [Integer] index the index of the table
|
71
|
+
def create_or_open_table_at index
|
72
|
+
t = self[index]
|
73
|
+
t = self[index] = Workbook::Table.new if t == nil
|
74
|
+
t.sheet = self
|
75
|
+
t
|
76
|
+
end
|
67
77
|
end
|
68
78
|
end
|
data/lib/workbook/version.rb
CHANGED
@@ -0,0 +1,56 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'spreadsheet'
|
3
|
+
|
4
|
+
module Workbook
|
5
|
+
module Writers
|
6
|
+
module HtmlWriter
|
7
|
+
|
8
|
+
# Generates an Spreadsheet (from the spreadsheet gem) in order to build an XlS
|
9
|
+
#
|
10
|
+
# @param [Hash] options A hash with options
|
11
|
+
# @return [Spreadsheet] A Spreadsheet object, ready for writing or more lower level operations
|
12
|
+
def to_html options={}
|
13
|
+
options = {:style_with_inline_css=>false}.merge(options)
|
14
|
+
builder = Nokogiri::HTML::Builder.new do |doc|
|
15
|
+
doc.html {
|
16
|
+
doc.body {
|
17
|
+
self.each{|sheet|
|
18
|
+
doc.h1 {
|
19
|
+
doc.text sheet.name
|
20
|
+
}
|
21
|
+
sheet.each{|table|
|
22
|
+
doc.table {
|
23
|
+
table.each{|row|
|
24
|
+
doc.tr {
|
25
|
+
row.each {|cell|
|
26
|
+
classnames = cell.format.all_names.join(" ").strip
|
27
|
+
td_options = classnames != "" ? {:class=>classnames} : {}
|
28
|
+
td_options = td_options.merge({:style=>cell.format.to_css}) if options[:style_with_inline_css] and cell.format.to_css != ""
|
29
|
+
doc.td(td_options) {
|
30
|
+
doc.text cell.value
|
31
|
+
}
|
32
|
+
}
|
33
|
+
}
|
34
|
+
}
|
35
|
+
}
|
36
|
+
}
|
37
|
+
}
|
38
|
+
}
|
39
|
+
}
|
40
|
+
end
|
41
|
+
return builder.to_html
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
|
46
|
+
# Write the current workbook to Microsoft Excel format (using the spreadsheet gem)
|
47
|
+
#
|
48
|
+
# @param [String] filename
|
49
|
+
# @param [Hash] options see #to_xls
|
50
|
+
def write_to_html filename="#{title}.html", options={}
|
51
|
+
File.open(filename, 'w') {|f| f.write(to_html(options)) }
|
52
|
+
return filename
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/test/test_book.rb
CHANGED
@@ -61,4 +61,10 @@ class TestWorkbook < Test::Unit::TestCase
|
|
61
61
|
t = w.text_to_utf8(t)
|
62
62
|
assert_equal("a\tb\tc\td", t.split(/(\n|\r)/).first)
|
63
63
|
end
|
64
|
+
|
65
|
+
def test_read_bad_filetype
|
66
|
+
assert_raises(ArgumentError) { Workbook::Book.read("test string here", :xls) }
|
67
|
+
assert_raises(ArgumentError) { Workbook::Book.read("test string here", :ods) }
|
68
|
+
assert_raises(ArgumentError) { Workbook::Book.read("test string here", :xlsx) }
|
69
|
+
end
|
64
70
|
end
|
data/test/test_format.rb
CHANGED
@@ -57,4 +57,43 @@ class TestFormat < Test::Unit::TestCase
|
|
57
57
|
|
58
58
|
end
|
59
59
|
|
60
|
+
def test_parent_style
|
61
|
+
a = Workbook::Format.new({:background_color=>'#ffffff'})
|
62
|
+
b = Workbook::Format.new({:color=>'#000'})
|
63
|
+
a.parent = b
|
64
|
+
assert_equal(b, a.parent)
|
65
|
+
end
|
66
|
+
def test_parent_style_flattened_properties
|
67
|
+
a = Workbook::Format.new({:background_color=>'#ffffff'})
|
68
|
+
b = Workbook::Format.new({:color=>'#000'})
|
69
|
+
a.parent = b
|
70
|
+
assert_equal(Workbook::Format.new({:color=>'#000',:background_color=>'#ffffff'}), a.flattened)
|
71
|
+
c = Workbook::Format.new({:color=>'#f00'})
|
72
|
+
c.parent = a
|
73
|
+
assert_equal(Workbook::Format.new({:color=>'#f00',:background_color=>'#ffffff'}), c.flattened)
|
74
|
+
end
|
75
|
+
def test_formats
|
76
|
+
a = Workbook::Format.new({:background_color=>'#ffffff'})
|
77
|
+
b = Workbook::Format.new({:color=>'#000'})
|
78
|
+
c = Workbook::Format.new({:color=>'#f00'})
|
79
|
+
a.parent = b
|
80
|
+
c.parent = a
|
81
|
+
assert_equal([b,a,c], c.formats)
|
82
|
+
end
|
83
|
+
def test_parent_style_to_css
|
84
|
+
a = Workbook::Format.new({:background_color=>'#ffffff'})
|
85
|
+
b = Workbook::Format.new({:color=>'#000'})
|
86
|
+
c = Workbook::Format.new({:color=>'#f00'})
|
87
|
+
a.parent = b
|
88
|
+
c.parent = a
|
89
|
+
assert_equal("background: #ffffff; color: #f00", c.to_css)
|
90
|
+
end
|
91
|
+
def test_all_names
|
92
|
+
a = Workbook::Format.new({:background_color=>'#ffffff'}, "a")
|
93
|
+
b = Workbook::Format.new({:color=>'#000'},"b")
|
94
|
+
c = Workbook::Format.new({:color=>'#f00'},"c")
|
95
|
+
a.parent = b
|
96
|
+
c.parent = a
|
97
|
+
assert_equal(["b","a","c"],c.all_names)
|
98
|
+
end
|
60
99
|
end
|
@@ -10,6 +10,8 @@ module Modules
|
|
10
10
|
"2011-05-19T15_37_49 - 52349.xml"=>"2011-05-19T15_37_49 - 52349.xml",
|
11
11
|
"20-2-2012 20:52"=>DateTime.new(2012,2,20,20,52),
|
12
12
|
"1-11-2011"=>Date.new(2011,11,1),
|
13
|
+
"12/12/2012"=>Date.new(2012,12,12),
|
14
|
+
"12/23/1980"=>Date.new(1980,12,23), #TODO: should probably depend on locale, see: http://bugs.ruby-lang.org/issues/634#note-10
|
13
15
|
"jA"=>"jA",
|
14
16
|
"n"=>"n",
|
15
17
|
"12 bomen"=>"12 bomen",
|
@@ -51,5 +51,49 @@ module Readers
|
|
51
51
|
assert_equal(42000,w.sheet.table[3][:b].value)
|
52
52
|
assert_equal(nil,w.sheet.table[2][:c].value)
|
53
53
|
end
|
54
|
+
def test_class_read_string
|
55
|
+
s = File.read 'test/artifacts/simple_csv.csv'
|
56
|
+
w = Workbook::Book.read( s, :csv )
|
57
|
+
# reads
|
58
|
+
# a,b,c,d
|
59
|
+
# 1,2,3,4
|
60
|
+
# 5,3,2,1
|
61
|
+
# "asdf",123,12,2001-02-02
|
62
|
+
#
|
63
|
+
assert_equal([:a,:b,:c,:d],w.sheet.table.header.to_symbols)
|
64
|
+
assert_equal(3,w.sheet.table[2][:b].value)
|
65
|
+
assert_equal("asdf",w.sheet.table[3][:a].value)
|
66
|
+
assert_equal(Date.new(2001,2,2),w.sheet.table[3][:d].value)
|
67
|
+
end
|
68
|
+
def test_instance_read_string
|
69
|
+
w = Workbook::Book.new
|
70
|
+
s = File.read 'test/artifacts/simple_csv.csv'
|
71
|
+
w.read( s, :csv )
|
72
|
+
# reads
|
73
|
+
# a,b,c,d
|
74
|
+
# 1,2,3,4
|
75
|
+
# 5,3,2,1
|
76
|
+
# "asdf",123,12,2001-02-02
|
77
|
+
#
|
78
|
+
assert_equal([:a,:b,:c,:d],w.sheet.table.header.to_symbols)
|
79
|
+
assert_equal(3,w.sheet.table[2][:b].value)
|
80
|
+
assert_equal("asdf",w.sheet.table[3][:a].value)
|
81
|
+
assert_equal(Date.new(2001,2,2),w.sheet.table[3][:d].value)
|
82
|
+
end
|
83
|
+
def test_instance_read_stringio
|
84
|
+
w = Workbook::Book.new
|
85
|
+
sio = StringIO.new(File.read 'test/artifacts/simple_csv.csv')
|
86
|
+
w.read( sio, :csv )
|
87
|
+
# reads
|
88
|
+
# a,b,c,d
|
89
|
+
# 1,2,3,4
|
90
|
+
# 5,3,2,1
|
91
|
+
# "asdf",123,12,2001-02-02
|
92
|
+
#
|
93
|
+
assert_equal([:a,:b,:c,:d],w.sheet.table.header.to_symbols)
|
94
|
+
assert_equal(3,w.sheet.table[2][:b].value)
|
95
|
+
assert_equal("asdf",w.sheet.table[3][:a].value)
|
96
|
+
assert_equal(Date.new(2001,2,2),w.sheet.table[3][:d].value)
|
97
|
+
end
|
54
98
|
end
|
55
99
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require File.join(File.dirname(__FILE__), 'helper')
|
3
|
+
module Readers
|
4
|
+
class TestXlsWriter < Test::Unit::TestCase
|
5
|
+
def test_open
|
6
|
+
|
7
|
+
w = Workbook::Book.new
|
8
|
+
w.open 'test/artifacts/book_with_tabs_and_colours.ods'
|
9
|
+
assert_equal([:a, :b, :c, :d, :e],w.sheet.table.header.to_symbols[0..4])
|
10
|
+
assert_equal(90588,w.sheet.table[2][:b].value)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_styling
|
14
|
+
w = Workbook::Book.new
|
15
|
+
w.open 'test/artifacts/book_with_tabs_and_colours.ods'
|
16
|
+
assert_equal("#ffff99",w.sheet.table[3][:c].format[:background_color])
|
17
|
+
assert_equal(true,w.sheet.table[0][:e].format.all_names.include?("Heading1"))
|
18
|
+
# TODO: column styles
|
19
|
+
# assert_equal(8.13671875,w.sheet.table.first[:b].format[:width])
|
20
|
+
# assert_equal(3.85546875,w.sheet.table.first[:a].format[:width])
|
21
|
+
# assert_equal(25.14453125,w.sheet.table.first[:c].format[:width])
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_complex_types
|
25
|
+
w = Workbook::Book.new
|
26
|
+
w.open 'test/artifacts/complex_types.ods'
|
27
|
+
assert_equal(Date.new(2011,11,15), w.sheet.table[2][3].value)
|
28
|
+
assert_equal("http://murb.nl", w.sheet.table[3][2].value)
|
29
|
+
assert_equal("sadfasdfsd", w.sheet.table[4][2].value)
|
30
|
+
assert_equal(1.2, w.sheet.table[3][1].value)
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_excel_standardized_open
|
34
|
+
w = Workbook::Book.new
|
35
|
+
w.open("test/artifacts/excel_different_types.ods")
|
36
|
+
# reads
|
37
|
+
# a,b,c,d
|
38
|
+
# 2012-02-22,2014-12-27,2012-11-23,2012-11-12T04:20:00+00:00
|
39
|
+
# c,222.0,,0027-12-14T05:21:00+00:00
|
40
|
+
# 2012-01-22T11:00:00+00:00,42000.0,"goh, idd",ls
|
41
|
+
#
|
42
|
+
assert_equal([:a,:b,:c, :d],w.sheet.table.header.to_symbols[0..3])
|
43
|
+
assert_equal(Date.new(2012,2,22),w.sheet.table[1][:a].value)
|
44
|
+
assert_equal("c",w.sheet.table[2][:a].value)
|
45
|
+
assert_equal(DateTime.new(2012,1,22,11),w.sheet.table[3][:a].value)
|
46
|
+
assert_equal(42000,w.sheet.table[3][:b].value)
|
47
|
+
assert_equal(nil,w.sheet.table[2][:c].value)
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
@@ -26,5 +26,58 @@ module Readers
|
|
26
26
|
assert_equal(nil,w.sheet.table[2][:c].value)
|
27
27
|
end
|
28
28
|
|
29
|
+
def test_excel_class_read_string
|
30
|
+
s = File.read("test/artifacts/excel_different_types.txt")
|
31
|
+
w = Workbook::Book.read(s, :txt)
|
32
|
+
# reads
|
33
|
+
# a,b,c,d
|
34
|
+
# 2012-02-22,2014-12-27,2012-11-23,2012-11-12T04:20:00+00:00
|
35
|
+
# c,222.0,,0027-12-14T05:21:00+00:00
|
36
|
+
# 2012-01-22T11:00:00+00:00,42000.0,"goh, idd",ls
|
37
|
+
|
38
|
+
assert_equal([:a,:b,:c, :d],w.sheet.table.header.to_symbols)
|
39
|
+
assert_equal(Date.new(2012,2,22),w.sheet.table[1][:a].value)
|
40
|
+
assert_equal("c",w.sheet.table[2][:a].value)
|
41
|
+
assert_equal(DateTime.new(2012,1,22,11),w.sheet.table[3][:a].value)
|
42
|
+
assert_equal(42000,w.sheet.table[3][:b].value)
|
43
|
+
assert_equal(nil,w.sheet.table[2][:c].value)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_excel_instance_read_string
|
47
|
+
s = File.read("test/artifacts/excel_different_types.txt")
|
48
|
+
w = Workbook::Book.new
|
49
|
+
w.read(s, :txt)
|
50
|
+
# reads
|
51
|
+
# a,b,c,d
|
52
|
+
# 2012-02-22,2014-12-27,2012-11-23,2012-11-12T04:20:00+00:00
|
53
|
+
# c,222.0,,0027-12-14T05:21:00+00:00
|
54
|
+
# 2012-01-22T11:00:00+00:00,42000.0,"goh, idd",ls
|
55
|
+
|
56
|
+
assert_equal([:a,:b,:c, :d],w.sheet.table.header.to_symbols)
|
57
|
+
assert_equal(Date.new(2012,2,22),w.sheet.table[1][:a].value)
|
58
|
+
assert_equal("c",w.sheet.table[2][:a].value)
|
59
|
+
assert_equal(DateTime.new(2012,1,22,11),w.sheet.table[3][:a].value)
|
60
|
+
assert_equal(42000,w.sheet.table[3][:b].value)
|
61
|
+
assert_equal(nil,w.sheet.table[2][:c].value)
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_excel_instance_read_stringio
|
65
|
+
sio = StringIO.new(File.read("test/artifacts/excel_different_types.txt"))
|
66
|
+
w = Workbook::Book.new
|
67
|
+
w.read(sio, :txt)
|
68
|
+
# reads
|
69
|
+
# a,b,c,d
|
70
|
+
# 2012-02-22,2014-12-27,2012-11-23,2012-11-12T04:20:00+00:00
|
71
|
+
# c,222.0,,0027-12-14T05:21:00+00:00
|
72
|
+
# 2012-01-22T11:00:00+00:00,42000.0,"goh, idd",ls
|
73
|
+
|
74
|
+
assert_equal([:a,:b,:c, :d],w.sheet.table.header.to_symbols)
|
75
|
+
assert_equal(Date.new(2012,2,22),w.sheet.table[1][:a].value)
|
76
|
+
assert_equal("c",w.sheet.table[2][:a].value)
|
77
|
+
assert_equal(DateTime.new(2012,1,22,11),w.sheet.table[3][:a].value)
|
78
|
+
assert_equal(42000,w.sheet.table[3][:b].value)
|
79
|
+
assert_equal(nil,w.sheet.table[2][:c].value)
|
80
|
+
end
|
81
|
+
|
29
82
|
end
|
30
83
|
end
|
data/test/test_row.rb
CHANGED
@@ -67,6 +67,18 @@ class TestRow < Test::Unit::TestCase
|
|
67
67
|
assert_equal(r1, t.first)
|
68
68
|
end
|
69
69
|
|
70
|
+
def test_no_values?
|
71
|
+
t = Workbook::Table.new
|
72
|
+
r1 = Workbook::Row.new
|
73
|
+
r1.table = t
|
74
|
+
assert_equal(true, r1.no_values?)
|
75
|
+
r1 << Workbook::Cell.new('abcd')
|
76
|
+
assert_equal(false, r1.no_values?)
|
77
|
+
r2 = Workbook::Row.new [nil, '', nil, '', '']
|
78
|
+
r2.table = t
|
79
|
+
assert_equal(true, r2.no_values?)
|
80
|
+
end
|
81
|
+
|
70
82
|
def test_to_symbols
|
71
83
|
r1 = Workbook::Row.new ["test", "asdf-asd", "asdf - asdf", "asdf2"]
|
72
84
|
assert_equal([:test, :asdfasd, :asdf_asdf, :asdf2], r1.to_symbols)
|
data/test/test_sheet.rb
CHANGED
@@ -42,4 +42,16 @@ class TestWorkbook < Test::Unit::TestCase
|
|
42
42
|
assert_equal(5,s2.table[2][:a])
|
43
43
|
end
|
44
44
|
|
45
|
+
def test_create_or_open_table_at
|
46
|
+
s = Workbook::Sheet.new
|
47
|
+
table0=s.create_or_open_table_at(0)
|
48
|
+
assert_equal(Workbook::Table, table0.class)
|
49
|
+
assert_equal(s, table0.sheet)
|
50
|
+
table1=s.create_or_open_table_at(1)
|
51
|
+
assert_equal(Workbook::Table, table1.class)
|
52
|
+
assert_equal(s, table1.sheet)
|
53
|
+
table1<<Workbook::Row.new([1,2,3,4])
|
54
|
+
assert_equal(false, table1 == table0)
|
55
|
+
|
56
|
+
end
|
45
57
|
end
|