sheets 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,6 +1,9 @@
1
1
  .DS_Store
2
2
  *.gem
3
3
  .bundle
4
+ .vagrant
4
5
  Gemfile.lock
5
6
  pkg/*
6
- doc/*
7
+ doc/*
8
+ log/*
9
+ *.rbc
@@ -0,0 +1,6 @@
1
+ rvm:
2
+ - 1.8.7
3
+ - 1.9.2
4
+ - 1.9.3
5
+ - ree
6
+ - rbx
data/README.md CHANGED
@@ -14,7 +14,7 @@ Your application only needs to care about the layout of the spreadsheet, and the
14
14
  Usage
15
15
  ----------
16
16
 
17
- Install via Rubygems: (This will also install Roo its dependencies, including Spreadsheet).
17
+ Install via Rubygems:
18
18
 
19
19
  gem install sheets
20
20
 
@@ -80,6 +80,13 @@ Renderers subclass Sheets::Renderers::Base, live in the Sheets::Renderers namesp
80
80
 
81
81
  Renderers are given access to the results of Sheets::Base#to_array as @data. See lib/sheets/renderers/* for examples.
82
82
 
83
+ Test Suite Results
84
+ -----
85
+
86
+ Sheets uses Travis-CI for Continuous Integration.
87
+
88
+ [![Build Status](http://travis-ci.org/bspaulding/Sheets.png)](http://travis-ci.org/bspaulding/Sheets)
89
+
83
90
  License
84
91
  ----------
85
92
 
@@ -90,7 +97,8 @@ Please note that Sheets is dependent upon the Spreadsheet gem, which is licensed
90
97
  Credits
91
98
  ----------
92
99
 
93
- Sheets takes full advantage of the great work done in these gems:
100
+ Sheets takes advantage of the work done in these gems:
94
101
 
95
- * [Spreadsheet](http://spreadsheet.rubyforge.org/) - mhatakeyama@ywesee.com, zdavatz@ywesee.com
96
- * [Roo](http://roo.rubyforge.org/) - [Thomas Preymesser](mailto:thopre@gmail.com)
102
+ * [spreadsheet](http://rubygems.org/gems/spreadsheet)
103
+ * [rubyzip](http://rubygems.org/gems/rubyzip)
104
+ * [nokogiri](http://rubygems.org/gems/nokogiri)
data/Rakefile CHANGED
@@ -1,7 +1,55 @@
1
+ # require 'rubygems'
1
2
  require 'bundler'
2
3
  Bundler::GemHelper.install_tasks
3
4
 
4
- task :test do
5
- require File.join(File.expand_path(File.dirname(__FILE__)), 'test', 'test_helper.rb')
6
- Dir[ File.join(File.expand_path(File.dirname(__FILE__)), 'test', '**', '*_test.rb') ].each {|file| require file }
5
+ testing_rubies = %w[1.8.7 1.9.2 ree ree-1.8.7-2010.01 jruby rbx]
6
+
7
+ task :default => :test
8
+
9
+ namespace :test do
10
+ task :current do
11
+ require File.join(File.expand_path(File.dirname(__FILE__)), 'test', 'test_helper.rb')
12
+ Dir[ File.join(File.expand_path(File.dirname(__FILE__)), 'test', '**', '*_test.rb') ].each {|file| require file }
13
+ end
14
+
15
+ task :all do
16
+ File.delete('test/results.json') if File.exists?('test/results.json')
17
+ system "rvm --json #{testing_rubies.join(',')} rake test > test/results.json"
18
+ end
19
+ end
20
+
21
+ task :test => ['test:current']
22
+
23
+ namespace :install do
24
+ def ruby_installed?(ruby)
25
+ !%x[rvm use #{ruby}].include?('not installed')
26
+ end
27
+
28
+ task :rubies do
29
+ testing_rubies.each do |ruby|
30
+ puts ruby
31
+ puts "----------"
32
+
33
+ ruby_installed?(ruby) ? puts('- Installed.') : system("rvm install #{ruby}")
34
+ end
35
+ end
36
+
37
+ task :bundles => :rubies do
38
+ testing_rubies.each do |ruby|
39
+ puts ruby
40
+ puts "----------"
41
+
42
+ puts '- Installing bundler...'
43
+ system "rvm #{ruby} gem install --no-rdoc --no-ri bundler"
44
+
45
+ puts '- Installing bundle...'
46
+ system "rvm #{ruby} exec bundle install"
47
+ end
48
+ end
49
+ end
50
+
51
+ namespace :clean do
52
+ task :rbx do
53
+ Dir[ File.join(File.expand_path(File.dirname(__FILE__)), '**', '*.rbc') ].each {|file| File.delete(file) }
54
+ end
7
55
  end
@@ -0,0 +1,16 @@
1
+ require 'spreadsheet'
2
+
3
+ class Sheets::Parsers::ExcelParser < Sheets::Parsers::Base
4
+ parses :xls
5
+
6
+ def to_array
7
+ workbook = Spreadsheet.open(@file_path)
8
+ worksheet = workbook.worksheet(0)
9
+ # worksheet.collect {|row| row.collect {|cell| cell } }
10
+ worksheet.collect do |row|
11
+ cells = []
12
+ row.count.times {|cell_index| cells << row[cell_index].to_s }
13
+ cells
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,47 @@
1
+ require 'nokogiri'
2
+ require 'zip/zip'
3
+
4
+ class Sheets::Parsers::NokogiriOdsParser < Sheets::Parsers::Base
5
+ parses :ods
6
+
7
+ def to_array
8
+ rows.collect do |row|
9
+ table_cells = []
10
+ row.xpath('table:table-cell').each do |cell|
11
+ repeat = cell.attributes["number-columns-repeated"].text.to_i if cell.attributes["number-columns-repeated"]
12
+ repeat ||= 1
13
+ repeat.times { table_cells << cell }
14
+ end
15
+
16
+ table_cells.collect {|cell| value_for_cell(cell) }
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ # returns the zipfile object for the document
23
+ def zipfile
24
+ @zipfile ||= Zip::ZipFile.open( @file_path )
25
+ end
26
+
27
+ def content_doc
28
+ @content_doc ||= Nokogiri::XML( zipfile.read('content.xml') )
29
+ end
30
+
31
+ def rows
32
+ @rows ||= content_doc.xpath('//table:table/table:table-row')
33
+ end
34
+
35
+ def value_for_cell(cell_element)
36
+ value_type = cell_element.attributes["value-type"]
37
+ send("#{value_type}_value_for_cell", cell_element)
38
+ end
39
+
40
+ def string_value_for_cell(cell_element)
41
+ cell_element.xpath('text:p').text
42
+ end
43
+
44
+ def float_value_for_cell(cell_element)
45
+ cell_element.xpath('text:p').text.to_f.to_s
46
+ end
47
+ end
@@ -0,0 +1,79 @@
1
+ require 'nokogiri'
2
+ require 'zip/zip'
3
+
4
+ class Sheets::Parsers::NokogiriXlsxParser < Sheets::Parsers::Base
5
+ parses :xlsx
6
+
7
+ def to_array
8
+ # Create Matrices
9
+ matrices = worksheets.collect do |worksheet|
10
+ worksheet.css('sheetData>row').collect do |row|
11
+ row.css('c').collect do |cell|
12
+ cell_value = cell.css('v').text
13
+
14
+ if cell.attribute('t')
15
+ celltype = cell.attribute('t').value
16
+ if celltype == 's'
17
+ # Load Shared String Value
18
+ cell_value = shared_strings[cell_value.to_i]
19
+ elsif celltype == 'b'
20
+ cell_value = (cell_value == "1") ? "TRUE" : "FALSE"
21
+ end
22
+ end
23
+
24
+ if cell.attribute('s') && cell.attribute('s').value == "1"
25
+ cell_value = (base_date + cell_value.to_f).strftime('%Y-%m-%d') # Date conversion
26
+ end
27
+
28
+ if cell_value.match(/\A[0-9]+\.?[0-9]*\Z/)
29
+ cell_value = cell_value.to_f.to_s
30
+ end
31
+
32
+ cell_value
33
+ end
34
+ end
35
+ end
36
+
37
+ matrices.first
38
+ end
39
+
40
+ private
41
+
42
+ # returns the zipfile object for the document
43
+ def zipfile
44
+ @zipfile ||= Zip::ZipFile.open( @file_path )
45
+ end
46
+
47
+ # returns a nokogiri document for the workbook
48
+ def workbook
49
+ @workbook ||= Nokogiri::XML( zipfile.read("xl/workbook.xml") )
50
+ end
51
+
52
+ # returns an array of strings for the sharedStrings.
53
+ def shared_strings
54
+ @shared_strings ||= Nokogiri::XML( zipfile.read("xl/sharedStrings.xml") ).css('si>t').collect(&:text)
55
+ end
56
+
57
+ # returns an array of strings containing the worksheet ids from the workbook
58
+ def worksheet_ids
59
+ @sheet_ids ||= workbook.css('sheets>sheet').collect {|sheet| sheet.attribute('sheetId').value }
60
+ end
61
+
62
+ # returns an array of nokogiri documents for each worksheet
63
+ def worksheets
64
+ @worksheets ||= worksheet_ids.collect {|sheet_id| Nokogiri::XML( zipfile.read("xl/worksheets/sheet#{sheet_id}.xml") ) }
65
+ end
66
+
67
+ # returns a date object representing the start of the serial date system for this sheet
68
+ # Either 1900-01-01 or 1904-01-01
69
+ def base_date
70
+ @base_date ||= lambda do
71
+ date_base_element = workbook.search('workbookPr').attribute('date1904')
72
+ if date_base_element && date_base_element.value.to_i == 1
73
+ Date.parse('1904-01-01')
74
+ else
75
+ Date.parse('1900-01-01')
76
+ end
77
+ end.call
78
+ end
79
+ end
@@ -1,3 +1,3 @@
1
1
  module Sheets
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -15,12 +15,10 @@ Gem::Specification.new do |s|
15
15
  s.rubyforge_project = "sheets"
16
16
 
17
17
  s.add_dependency('spreadsheet', '>= 0.6.5.2')
18
- s.add_dependency('roo', '= 1.9.3')
19
- # These are the dependencies roo forgot:
20
- s.add_dependency('builder', '>= 3.0.0')
21
18
  s.add_dependency('rubyzip', '>= 0.9.4')
22
19
  s.add_dependency('nokogiri', '>= 1.4.3.1')
23
- s.add_dependency('google-spreadsheet-ruby', '>= 0.1.1')
20
+
21
+ s.add_development_dependency('rake', '0.9.2')
24
22
 
25
23
  s.files = `git ls-files`.split("\n")
26
24
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -1,11 +1,11 @@
1
1
  Date,Impressions,Clicks,Actions
2
- 2011-01-01,10,10,10
3
- 2011-01-02,10,10,10
4
- 2011-01-03,10,10,10
5
- 2011-01-04,10,10,10
6
- 2011-01-05,10,10,10
7
- 2011-01-06,10,10,10
8
- 2011-01-07,10,10,10
9
- 2011-01-08,10,10,10
10
- 2011-01-09,10,10,10
11
- 2011-01-10,10,10,10
2
+ 2011-01-01,10.0,10.0,10.0
3
+ 2011-01-02,10.0,10.0,10.0
4
+ 2011-01-03,10.0,10.0,10.0
5
+ 2011-01-04,10.0,10.0,10.0
6
+ 2011-01-05,10.0,10.0,10.0
7
+ 2011-01-06,10.0,10.0,10.0
8
+ 2011-01-07,10.0,10.0,10.0
9
+ 2011-01-08,10.0,10.0,10.0
10
+ 2011-01-09,10.0,10.0,10.0
11
+ 2011-01-10,10.0,10.0,10.0
@@ -1,4 +1,4 @@
1
- parser_classes = (Sheets::Parsers.constants - ["Base"]).map {|constant_name| Sheets::Parsers.const_get(constant_name) }
1
+ parser_classes = (Sheets::Parsers.constants.map(&:to_s) - ["Base"]).map {|constant_name| Sheets::Parsers.const_get(constant_name) }
2
2
 
3
3
  test_classes_for_collection parser_classes do |parser_class|
4
4
  define_method :test_provides_formats do
@@ -10,9 +10,34 @@ test_classes_for_collection parser_classes do |parser_class|
10
10
  end
11
11
 
12
12
  parser_class.formats.each do |format|
13
- define_method "test_#{format}_to_array" do
13
+ define_method "test_#{format}_responds_to_to_array" do
14
14
  parser = parser_class.new([], format, nil)
15
15
  assert parser.respond_to?("to_array"), "#{parser.inspect} doesn't respond to to_array"
16
16
  end
17
+
18
+ define_method "test_#{format}_to_array_matches_sample_data" do
19
+ example_data = [
20
+ [ "Date", "Impressions", "Clicks", "Actions" ],
21
+ [ "2011-01-01", "10.0", "10.0", "10.0" ],
22
+ [ "2011-01-02", "10.0", "10.0", "10.0" ],
23
+ [ "2011-01-03", "10.0", "10.0", "10.0" ],
24
+ [ "2011-01-04", "10.0", "10.0", "10.0" ],
25
+ [ "2011-01-05", "10.0", "10.0", "10.0" ],
26
+ [ "2011-01-06", "10.0", "10.0", "10.0" ],
27
+ [ "2011-01-07", "10.0", "10.0", "10.0" ],
28
+ [ "2011-01-08", "10.0", "10.0", "10.0" ],
29
+ [ "2011-01-09", "10.0", "10.0", "10.0" ],
30
+ [ "2011-01-10", "10.0", "10.0", "10.0" ]
31
+ ]
32
+
33
+ file_path = File.expand_path( File.join('test', 'data', "simple.#{format}") )
34
+ parser = parser_class.new( File.read(file_path), format, file_path )
35
+ result = parser.to_array
36
+
37
+ # Normalize to parsed dates to avoid Date type conflict 'failures'
38
+ result[1..-1].collect {|row| row[0] = Date.parse(row[0]).strftime('%Y-%m-%d') }
39
+
40
+ assert_equal example_data, result, "#{parser_class}#to_array for format #{format} doesn't match example data."
41
+ end
17
42
  end
18
43
  end
@@ -1,4 +1,4 @@
1
- renderer_classes = (Sheets::Renderers.constants - ["Base"]).map {|constant_name| Sheets::Renderers.const_get(constant_name) }
1
+ renderer_classes = (Sheets::Renderers.constants.map(&:to_s) - ["Base"]).map {|constant_name| Sheets::Renderers.const_get(constant_name) }
2
2
 
3
3
  test_classes_for_collection renderer_classes do |renderer_class|
4
4
  define_method :test_provides_formats do
@@ -0,0 +1,13 @@
1
+ {
2
+ "totals": { "rubies": 6, "successes": 6, "errors": 0 },
3
+ "successful": ["ruby-1.8.7-p334", "ruby-1.9.2-p180", "ree-1.8.7-2011.03", "ree-1.8.7-2010.01", "jruby-1.6.1", "rbx-head"],
4
+ "errors": [],
5
+ "rubies": {
6
+ {"ruby-1.8.7-p334": 0},
7
+ {"ruby-1.9.2-p180": 0},
8
+ {"ree-1.8.7-2011.03": 0},
9
+ {"ree-1.8.7-2010.01": 0},
10
+ {"jruby-1.6.1": 0},
11
+ {"rbx-head": 0}
12
+ }
13
+ }
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sheets
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
5
- prerelease:
4
+ prerelease: false
6
5
  segments:
7
6
  - 1
7
+ - 1
8
8
  - 0
9
- - 0
10
- version: 1.0.0
9
+ version: 1.1.0
11
10
  platform: ruby
12
11
  authors:
13
12
  - Bradley J. Spaulding
@@ -15,107 +14,67 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2011-04-11 00:00:00 -04:00
17
+ date: 2011-11-29 00:00:00 -05:00
19
18
  default_executable:
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
22
- name: spreadsheet
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
25
- none: false
21
+ version_requirements: &id001 !ruby/object:Gem::Requirement
26
22
  requirements:
27
23
  - - ">="
28
24
  - !ruby/object:Gem::Version
29
- hash: 111
30
25
  segments:
31
26
  - 0
32
27
  - 6
33
28
  - 5
34
29
  - 2
35
30
  version: 0.6.5.2
36
- type: :runtime
37
- version_requirements: *id001
38
- - !ruby/object:Gem::Dependency
39
- name: roo
40
- prerelease: false
41
- requirement: &id002 !ruby/object:Gem::Requirement
42
- none: false
43
- requirements:
44
- - - "="
45
- - !ruby/object:Gem::Version
46
- hash: 53
47
- segments:
48
- - 1
49
- - 9
50
- - 3
51
- version: 1.9.3
52
- type: :runtime
53
- version_requirements: *id002
54
- - !ruby/object:Gem::Dependency
55
- name: builder
31
+ requirement: *id001
32
+ name: spreadsheet
56
33
  prerelease: false
57
- requirement: &id003 !ruby/object:Gem::Requirement
58
- none: false
59
- requirements:
60
- - - ">="
61
- - !ruby/object:Gem::Version
62
- hash: 7
63
- segments:
64
- - 3
65
- - 0
66
- - 0
67
- version: 3.0.0
68
34
  type: :runtime
69
- version_requirements: *id003
70
35
  - !ruby/object:Gem::Dependency
71
- name: rubyzip
72
- prerelease: false
73
- requirement: &id004 !ruby/object:Gem::Requirement
74
- none: false
36
+ version_requirements: &id002 !ruby/object:Gem::Requirement
75
37
  requirements:
76
38
  - - ">="
77
39
  - !ruby/object:Gem::Version
78
- hash: 51
79
40
  segments:
80
41
  - 0
81
42
  - 9
82
43
  - 4
83
44
  version: 0.9.4
45
+ requirement: *id002
46
+ name: rubyzip
47
+ prerelease: false
84
48
  type: :runtime
85
- version_requirements: *id004
86
49
  - !ruby/object:Gem::Dependency
87
- name: nokogiri
88
- prerelease: false
89
- requirement: &id005 !ruby/object:Gem::Requirement
90
- none: false
50
+ version_requirements: &id003 !ruby/object:Gem::Requirement
91
51
  requirements:
92
52
  - - ">="
93
53
  - !ruby/object:Gem::Version
94
- hash: 113
95
54
  segments:
96
55
  - 1
97
56
  - 4
98
57
  - 3
99
58
  - 1
100
59
  version: 1.4.3.1
60
+ requirement: *id003
61
+ name: nokogiri
62
+ prerelease: false
101
63
  type: :runtime
102
- version_requirements: *id005
103
64
  - !ruby/object:Gem::Dependency
104
- name: google-spreadsheet-ruby
105
- prerelease: false
106
- requirement: &id006 !ruby/object:Gem::Requirement
107
- none: false
65
+ version_requirements: &id004 !ruby/object:Gem::Requirement
108
66
  requirements:
109
- - - ">="
67
+ - - "="
110
68
  - !ruby/object:Gem::Version
111
- hash: 25
112
69
  segments:
113
70
  - 0
114
- - 1
115
- - 1
116
- version: 0.1.1
117
- type: :runtime
118
- version_requirements: *id006
71
+ - 9
72
+ - 2
73
+ version: 0.9.2
74
+ requirement: *id004
75
+ name: rake
76
+ prerelease: false
77
+ type: :development
119
78
  description: Work with spreadsheets easily in a native ruby format.
120
79
  email:
121
80
  - brad.spaulding@gmail.com
@@ -127,6 +86,7 @@ extra_rdoc_files: []
127
86
 
128
87
  files:
129
88
  - .gitignore
89
+ - .travis.yml
130
90
  - Gemfile
131
91
  - LICENSE.txt
132
92
  - README.md
@@ -136,10 +96,9 @@ files:
136
96
  - lib/sheets/parseable.rb
137
97
  - lib/sheets/parsers/base.rb
138
98
  - lib/sheets/parsers/csv_parser.rb
139
- - lib/sheets/parsers/roo_parser.rb
140
- - lib/sheets/parsers/roo_patches.rb
141
- - lib/sheets/parsers/roo_patches/roo_patch_28885.rb
142
- - lib/sheets/parsers/roo_patches/roo_patch_29045.rb
99
+ - lib/sheets/parsers/excel_parser.rb
100
+ - lib/sheets/parsers/nokogiri_ods_parser.rb
101
+ - lib/sheets/parsers/nokogiri_xlsx_parser.rb
143
102
  - lib/sheets/renderable.rb
144
103
  - lib/sheets/renderers/base.rb
145
104
  - lib/sheets/renderers/csv_renderer.rb
@@ -156,11 +115,11 @@ files:
156
115
  - test/parseable_test.rb
157
116
  - test/parsers/basic_parsers_test.rb
158
117
  - test/parsers/csv_parser_test.rb
159
- - test/parsers/roo_parser_test.rb
160
118
  - test/renderable_test.rb
161
119
  - test/renderers/basic_renderers_test.rb
162
120
  - test/renderers/csv_renderer_test.rb
163
121
  - test/renderers/excel_renderer_test.rb
122
+ - test/results.json
164
123
  - test/test_helper.rb
165
124
  has_rdoc: true
166
125
  homepage: https://github.com/bspaulding/Sheets
@@ -172,27 +131,23 @@ rdoc_options: []
172
131
  require_paths:
173
132
  - lib
174
133
  required_ruby_version: !ruby/object:Gem::Requirement
175
- none: false
176
134
  requirements:
177
135
  - - ">="
178
136
  - !ruby/object:Gem::Version
179
- hash: 3
180
137
  segments:
181
138
  - 0
182
139
  version: "0"
183
140
  required_rubygems_version: !ruby/object:Gem::Requirement
184
- none: false
185
141
  requirements:
186
142
  - - ">="
187
143
  - !ruby/object:Gem::Version
188
- hash: 3
189
144
  segments:
190
145
  - 0
191
146
  version: "0"
192
147
  requirements: []
193
148
 
194
149
  rubyforge_project: sheets
195
- rubygems_version: 1.5.0
150
+ rubygems_version: 1.3.6
196
151
  signing_key:
197
152
  specification_version: 3
198
153
  summary: Sheets provides a Facade for importing spreadsheets that gives the application control. Any Spreadsheet can be represented as either (1) a two dimensional array, or (2) an array of hashes. Sheets' goal is to convert any spreadsheet format to one of these native Ruby data structures.
@@ -207,9 +162,9 @@ test_files:
207
162
  - test/parseable_test.rb
208
163
  - test/parsers/basic_parsers_test.rb
209
164
  - test/parsers/csv_parser_test.rb
210
- - test/parsers/roo_parser_test.rb
211
165
  - test/renderable_test.rb
212
166
  - test/renderers/basic_renderers_test.rb
213
167
  - test/renderers/csv_renderer_test.rb
214
168
  - test/renderers/excel_renderer_test.rb
169
+ - test/results.json
215
170
  - test/test_helper.rb
@@ -1,29 +0,0 @@
1
- require 'roo'
2
- require File.join( File.expand_path(File.dirname(__FILE__)), 'roo_patches.rb' )
3
-
4
- class Sheets::Parsers::RooParser < Sheets::Parsers::Base
5
- parses :xls, :xlsx, :ods
6
-
7
- ROO_CLASS = {
8
- :xls => Excel,
9
- :xlsx => Excelx,
10
- :ods => Openoffice
11
- }
12
-
13
- def to_array
14
- array = []
15
- (spreadsheet.first_row..spreadsheet.last_row).each do |row_num|
16
- row = []
17
- (spreadsheet.first_column..spreadsheet.last_column).each do |column_num|
18
- row << spreadsheet.cell(row_num, column_num).to_s
19
- end
20
- array << row
21
- end
22
- array
23
- end
24
-
25
- private
26
- def spreadsheet
27
- ROO_CLASS[@format.to_sym].new(@file_path)
28
- end
29
- end
@@ -1,5 +0,0 @@
1
- puts "Loading Roo Patches"
2
- Dir[ File.join( File.expand_path(File.dirname(__FILE__)), 'roo_patches', '*.rb' ) ].each do |file|
3
- puts "- #{File.basename(file)}"
4
- require file
5
- end
@@ -1,116 +0,0 @@
1
- # RubyForge Patch: 28885 - Fixes to Honor XLSX Base Date Format
2
- # NOTE: This fix is *highly* brittle. If roo updates, this may break roo.
3
-
4
- class Excelx
5
-
6
- def initialize(filename, packed=nil, file_warning = :error) #, create = false)
7
- super()
8
- @file_warning = file_warning
9
- @tmpdir = "oo_"+$$.to_s
10
- @tmpdir = File.join(ENV['ROO_TMP'], @tmpdir) if ENV['ROO_TMP']
11
- unless File.exists?(@tmpdir)
12
- FileUtils::mkdir(@tmpdir)
13
- end
14
- filename = open_from_uri(filename) if filename[0,7] == "http://"
15
- filename = unzip(filename) if packed and packed == :zip
16
- begin
17
- file_type_check(filename,'.xlsx','an Excel-xlsx')
18
- @cells_read = Hash.new
19
- @filename = filename
20
- unless File.file?(@filename)
21
- raise IOError, "file #{@filename} does not exist"
22
- end
23
- @@nr += 1
24
- @file_nr = @@nr
25
- extract_content(@filename)
26
- file = File.new(File.join(@tmpdir, @file_nr.to_s+"_roo_workbook.xml"))
27
- # TODO: @workbook_doc = XML::Parser.io(file).parse
28
- @workbook_doc = Nokogiri::XML(file)
29
-
30
- # Set the base date, could be 1900 or 1904 depending on the system of origin.
31
- date_base_element = @workbook_doc.search('workbookPr').attribute('date1904')
32
- if date_base_element && date_base_element.value.to_i == 1
33
- @base_date = Date.parse('1904-01-01')
34
- else
35
- @base_date = Date.parse('1900-01-01')
36
- end
37
- @base_datetime = DateTime.parse( @base_date.strftime("%Y-%m-%d") )
38
-
39
- file.close
40
- @shared_table = []
41
- if File.exist?(File.join(@tmpdir, @file_nr.to_s+'_roo_sharedStrings.xml'))
42
- file = File.new(File.join(@tmpdir, @file_nr.to_s+'_roo_sharedStrings.xml'))
43
- #TODO: @sharedstring_doc = XML::Parser.io(file).parse
44
- @sharedstring_doc = Nokogiri::XML(file)
45
- file.close
46
- read_shared_strings(@sharedstring_doc)
47
- end
48
- @styles_table = []
49
- @style_definitions = Array.new # TODO: ??? { |h,k| h[k] = {} }
50
- if File.exist?(File.join(@tmpdir, @file_nr.to_s+'_roo_styles.xml'))
51
- file = File.new(File.join(@tmpdir, @file_nr.to_s+'_roo_styles.xml'))
52
- #TODO: @styles_doc = XML::Parser.io(file).parse
53
- @styles_doc = Nokogiri::XML(file)
54
- file.close
55
- read_styles(@styles_doc)
56
- end
57
- @sheet_doc = []
58
- @sheet_files.each_with_index do |item, i|
59
- file = File.new(item)
60
- #TODO: @sheet_doc[i] = XML::Parser.io(file).parse
61
- @sheet_doc[i] = Nokogiri::XML(file)
62
- file.close
63
- end
64
- ensure
65
- #if ENV["roo_local"] != "thomas-p"
66
- FileUtils::rm_r(@tmpdir)
67
- #end
68
- end
69
- @default_sheet = self.sheets.first
70
- @cell = Hash.new
71
- @cell_type = Hash.new
72
- @formula = Hash.new
73
- @first_row = Hash.new
74
- @last_row = Hash.new
75
- @first_column = Hash.new
76
- @last_column = Hash.new
77
- @header_line = 1
78
- @excelx_type = Hash.new
79
- @excelx_value = Hash.new
80
- @s_attribute = Hash.new # TODO: ggf. wieder entfernen nur lokal benoetigt
81
- end
82
-
83
- def set_cell_values(sheet,x,y,i,v,vt,formula,tr,str_v,
84
- excelx_type=nil,
85
- excelx_value=nil,
86
- s_attribute=nil)
87
- key = [y,x+i]
88
- @cell_type[sheet] = {} unless @cell_type[sheet]
89
- @cell_type[sheet][key] = vt
90
- @formula[sheet] = {} unless @formula[sheet]
91
- @formula[sheet][key] = formula if formula
92
- @cell[sheet] = {} unless @cell[sheet]
93
- case @cell_type[sheet][key]
94
- when :float
95
- @cell[sheet][key] = v.to_f
96
- when :string
97
- @cell[sheet][key] = str_v
98
- when :date
99
- @cell[sheet][key] = (@base_date+v.to_i).strftime("%Y-%m-%d")
100
- when :datetime
101
- @cell[sheet][key] = (@base_datetime+v.to_f).strftime("%Y-%m-%d %H:%M:%S")
102
- when :percentage
103
- @cell[sheet][key] = v.to_f
104
- when :time
105
- @cell[sheet][key] = v.to_f*(24*60*60)
106
- else
107
- @cell[sheet][key] = v
108
- end
109
- @excelx_type[sheet] = {} unless @excelx_type[sheet]
110
- @excelx_type[sheet][key] = excelx_type
111
- @excelx_value[sheet] = {} unless @excelx_value[sheet]
112
- @excelx_value[sheet][key] = excelx_value
113
- @s_attribute[sheet] = {} unless @s_attribute[sheet]
114
- @s_attribute[sheet][key] = s_attribute
115
- end
116
- end
@@ -1,2 +0,0 @@
1
- # RubyForge Patch: 29045 - Fixes missing date format "January 10, 2011"
2
- Excelx::FORMATS["mmm\\ d\\,\\ yyyy"] = :date
@@ -1,8 +0,0 @@
1
- class TestRooParser < Test::Unit::TestCase
2
-
3
- def test_roo_date_format_issue
4
- sheet = Sheets::Base.new( 'test/data/roo_issue_28885_test.xlsx' )
5
-
6
- assert_equal "2011-01-10", sheet.to_array[1][0]
7
- end
8
- end