workbook 0.3.1 → 0.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|