rubyXL 1.1.10 → 1.1.11
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/VERSION +1 -1
- data/lib/rubyXL/cell.rb +82 -2
- data/lib/rubyXL/parser.rb +2 -1
- data/lib/rubyXL/workbook.rb +24 -1
- data/lib/rubyXL/worksheet.rb +2 -1
- data/rubyXL.gemspec +4 -3
- data/spec/lib/cell_spec.rb +17 -0
- metadata +27 -27
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.1.
|
1
|
+
1.1.11
|
data/lib/rubyXL/cell.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module RubyXL
|
2
2
|
class Cell < PrivateClass
|
3
3
|
|
4
|
-
attr_accessor :row, :column, :datatype, :style_index, :
|
4
|
+
attr_accessor :row, :column, :datatype, :style_index, :formula, :worksheet
|
5
5
|
attr_reader :workbook,:formula_attributes
|
6
6
|
|
7
7
|
def initialize(worksheet,row,column,value=nil,formula=nil,datatype='s',style_index=0, fmla_attr={})
|
@@ -17,6 +17,83 @@ module RubyXL
|
|
17
17
|
@formula_attributes = fmla_attr
|
18
18
|
end
|
19
19
|
|
20
|
+
def value
|
21
|
+
if is_date?
|
22
|
+
return @workbook.num_to_date(@value)
|
23
|
+
else
|
24
|
+
return @value
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def is_date?
|
29
|
+
if !@value.is_a?(String)
|
30
|
+
if @workbook.num_fmts
|
31
|
+
num_fmt_id = xf_id()[:numFmtId]
|
32
|
+
num_fmt = @workbook.num_fmts[:numFmt].select { |f| f[:attributes][:numFmtId] == num_fmt_id }[0].andand[:attributes].andand[:formatCode]
|
33
|
+
if num_fmt && is_date_format?(num_fmt)
|
34
|
+
return true
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
return false
|
39
|
+
end
|
40
|
+
|
41
|
+
def is_date_format?(num_fmt)
|
42
|
+
skip_chars = ['$', '-', '+', '/', '(', ')', ':', ' ']
|
43
|
+
num_chars = ['0', '#', '?']
|
44
|
+
non_date_formats = ['0.00E+00', '##0.0E+0', 'General', 'GENERAL', 'general', '@']
|
45
|
+
date_chars = ['y','m','d','h','s']
|
46
|
+
|
47
|
+
state = 0
|
48
|
+
s = ''
|
49
|
+
num_fmt.split(//).each do |c|
|
50
|
+
if state == 0
|
51
|
+
if c == '"'
|
52
|
+
state = 1
|
53
|
+
elsif ['\\', '_', '*'].include?(c)
|
54
|
+
state = 2
|
55
|
+
elsif skip_chars.include?(c)
|
56
|
+
next
|
57
|
+
else
|
58
|
+
s << c
|
59
|
+
end
|
60
|
+
elsif state == 1
|
61
|
+
if c == '"'
|
62
|
+
state = 0
|
63
|
+
end
|
64
|
+
elsif state == 2
|
65
|
+
state = 0
|
66
|
+
end
|
67
|
+
end
|
68
|
+
s.gsub!(/\[[^\]]*\]/, '')
|
69
|
+
if non_date_formats.include?(s)
|
70
|
+
return false
|
71
|
+
end
|
72
|
+
separator = ';'
|
73
|
+
got_sep = 0
|
74
|
+
date_count = 0
|
75
|
+
num_count = 0
|
76
|
+
s.split(//).each do |c|
|
77
|
+
if date_chars.include?(c)
|
78
|
+
date_count += 1
|
79
|
+
elsif num_chars.include?(c)
|
80
|
+
num_count += 1
|
81
|
+
elsif c == separator
|
82
|
+
got_sep = 1
|
83
|
+
end
|
84
|
+
end
|
85
|
+
if date_count > 0 && num_count == 0
|
86
|
+
return true
|
87
|
+
elsif num_count > 0 && date_count == 0
|
88
|
+
return false
|
89
|
+
elsif date_count
|
90
|
+
# ambiguous result
|
91
|
+
elsif got_sep == 0
|
92
|
+
# constant result
|
93
|
+
end
|
94
|
+
return date_count > num_count
|
95
|
+
end
|
96
|
+
|
20
97
|
# changes fill color of cell
|
21
98
|
def change_fill(rgb='ffffff')
|
22
99
|
validate_worksheet
|
@@ -145,6 +222,9 @@ module RubyXL
|
|
145
222
|
def change_contents(data, formula=nil)
|
146
223
|
validate_worksheet
|
147
224
|
@datatype='str'
|
225
|
+
if data.is_a?(Date) || data.is_a?(DateTime)
|
226
|
+
data = @workbook.date_to_num(data)
|
227
|
+
end
|
148
228
|
if (data.is_a?Integer) || (data.is_a?Float)
|
149
229
|
@datatype = ''
|
150
230
|
end
|
@@ -305,7 +385,7 @@ module RubyXL
|
|
305
385
|
end
|
306
386
|
|
307
387
|
def inspect
|
308
|
-
str = "(#{@row},#{@column}): #{@value}"
|
388
|
+
str = "(#{@row},#{@column}): #{@value}"
|
309
389
|
str += " =#{@formula}" if @formula
|
310
390
|
str += ", datatype = #{@datatype}, style_index = #{@style_index}"
|
311
391
|
return str
|
data/lib/rubyXL/parser.rb
CHANGED
@@ -33,6 +33,7 @@ module RubyXL
|
|
33
33
|
|
34
34
|
|
35
35
|
# data_only allows only the sheet data to be parsed, so as to speed up parsing
|
36
|
+
# However, using this option will result in date-formatted cells being interpreted as numbers
|
36
37
|
def Parser.parse(file_path, data_only=false)
|
37
38
|
@data_only = data_only
|
38
39
|
files = Parser.decompress(file_path)
|
@@ -386,7 +387,7 @@ module RubyXL
|
|
386
387
|
|
387
388
|
wb.shared_strings_XML = files['sharedString'].to_s
|
388
389
|
wb.defined_names = files['workbook'].css('definedNames').to_s
|
389
|
-
|
390
|
+
wb.date1904 = files['workbook'].css('workbookPr').attribute('date1904').to_s == '1'
|
390
391
|
|
391
392
|
wb.worksheets = Array.new(@num_sheets) #array of Worksheet objs
|
392
393
|
wb
|
data/lib/rubyXL/workbook.rb
CHANGED
@@ -9,6 +9,7 @@ require File.expand_path(File.join(File.dirname(__FILE__),'writer','styles_write
|
|
9
9
|
require File.expand_path(File.join(File.dirname(__FILE__),'writer','shared_strings_writer'))
|
10
10
|
require File.expand_path(File.join(File.dirname(__FILE__),'writer','worksheet_writer'))
|
11
11
|
require 'rubyXL/zip'
|
12
|
+
require 'date'
|
12
13
|
|
13
14
|
module RubyXL
|
14
15
|
class Workbook
|
@@ -46,7 +47,7 @@ module RubyXL
|
|
46
47
|
@calc_chain = nil #unnecessary?
|
47
48
|
@num_strings = 0 #num strings total
|
48
49
|
@size = 0 #num strings in shared_strings array
|
49
|
-
@date1904
|
50
|
+
@date1904 = date1904
|
50
51
|
@external_links = nil
|
51
52
|
@style_corrector = nil
|
52
53
|
@drawings = nil
|
@@ -188,6 +189,28 @@ module RubyXL
|
|
188
189
|
return filepath
|
189
190
|
end
|
190
191
|
|
192
|
+
def date_to_num(date)
|
193
|
+
return nil if date.nil?
|
194
|
+
if @date1904
|
195
|
+
compare_date = DateTime.parse('December 31, 1903')
|
196
|
+
else
|
197
|
+
compare_date = DateTime.parse('December 31, 1899')
|
198
|
+
end
|
199
|
+
# add one day to compare date for erroneous 1900 leap year compatibility
|
200
|
+
date.ajd - (compare_date.ajd + 1)
|
201
|
+
end
|
202
|
+
|
203
|
+
def num_to_date(num)
|
204
|
+
return nil if num.nil?
|
205
|
+
if @date1904
|
206
|
+
compare_date = DateTime.parse('December 31, 1903')
|
207
|
+
else
|
208
|
+
compare_date = DateTime.parse('December 31, 1899')
|
209
|
+
end
|
210
|
+
# add one day to compare date for erroneous 1900 leap year compatibility
|
211
|
+
compare_date + 1 + num
|
212
|
+
end
|
213
|
+
|
191
214
|
#gets style object from style array given index
|
192
215
|
def get_style(style_index)
|
193
216
|
if !@cell_xfs[:xf].is_a?Array
|
data/lib/rubyXL/worksheet.rb
CHANGED
@@ -1370,7 +1370,8 @@ class Worksheet < PrivateClass
|
|
1370
1370
|
index = nil
|
1371
1371
|
|
1372
1372
|
@sheet_data.each_with_index do |row, index|
|
1373
|
-
|
1373
|
+
cells_content = cells_content.map { |header| header.to_s.downcase.strip }
|
1374
|
+
original_cells_content = row.map { |cell| cell.nil? ? '' : cell.value.to_s.downcase.strip }
|
1374
1375
|
if (cells_content & original_cells_content).size == cells_content.size
|
1375
1376
|
return index
|
1376
1377
|
end
|
data/rubyXL.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{rubyXL}
|
8
|
-
s.version = "1.1.
|
8
|
+
s.version = "1.1.11"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Vivek Bhagwat"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-11-23}
|
13
13
|
s.description = %q{rubyXL is a gem which allows the parsing, creation, and manipulation of Microsoft Excel (.xlsx/.xlsm) Documents}
|
14
14
|
s.email = %q{bhagwat.vivek@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -55,10 +55,11 @@ Gem::Specification.new do |s|
|
|
55
55
|
s.homepage = %q{http://github.com/gilt/rubyXL}
|
56
56
|
s.licenses = ["MIT"]
|
57
57
|
s.require_paths = ["lib"]
|
58
|
-
s.rubygems_version = %q{1.
|
58
|
+
s.rubygems_version = %q{1.3.7}
|
59
59
|
s.summary = %q{rubyXL is a gem which allows the parsing, creation, and manipulation of Microsoft Excel (.xlsx/.xlsm) Documents}
|
60
60
|
|
61
61
|
if s.respond_to? :specification_version then
|
62
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
62
63
|
s.specification_version = 3
|
63
64
|
|
64
65
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
data/spec/lib/cell_spec.rb
CHANGED
@@ -192,6 +192,15 @@ describe RubyXL::Cell do
|
|
192
192
|
end
|
193
193
|
end
|
194
194
|
|
195
|
+
describe '.value' do
|
196
|
+
it 'should return the value of a date' do
|
197
|
+
date = Date.parse('January 1, 2011')
|
198
|
+
@cell.change_contents(date)
|
199
|
+
@cell.should_receive(:is_date?).once.and_return(true)
|
200
|
+
@cell.value.should == date
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
195
204
|
describe '.change_contents' do
|
196
205
|
it 'should cause cell value to match string or number that is passed in' do
|
197
206
|
@cell.change_contents('TEST')
|
@@ -199,6 +208,14 @@ describe RubyXL::Cell do
|
|
199
208
|
@cell.formula.should == nil
|
200
209
|
end
|
201
210
|
|
211
|
+
it 'should cause cell value to match a date that is passed in' do
|
212
|
+
date = Date.parse('January 1, 2011')
|
213
|
+
@cell.change_contents(date)
|
214
|
+
@cell.should_receive(:is_date?).once.and_return(true)
|
215
|
+
@cell.value.should == date
|
216
|
+
@cell.formula.should == nil
|
217
|
+
end
|
218
|
+
|
202
219
|
it 'should cause cell value and formula to match what is passed in' do
|
203
220
|
@cell.change_contents(nil, 'SUM(A2:A4)')
|
204
221
|
@cell.value.should == nil
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubyXL
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 5
|
5
|
+
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 1.1.
|
9
|
+
- 11
|
10
|
+
version: 1.1.11
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Vivek Bhagwat
|
@@ -15,11 +15,11 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-11-23 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
|
-
|
22
|
+
prerelease: false
|
23
23
|
version_requirements: &id001 !ruby/object:Gem::Requirement
|
24
24
|
none: false
|
25
25
|
requirements:
|
@@ -29,11 +29,11 @@ dependencies:
|
|
29
29
|
segments:
|
30
30
|
- 0
|
31
31
|
version: "0"
|
32
|
-
requirement: *id001
|
33
|
-
prerelease: false
|
34
32
|
name: shoulda
|
35
|
-
|
33
|
+
requirement: *id001
|
36
34
|
type: :development
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
prerelease: false
|
37
37
|
version_requirements: &id002 !ruby/object:Gem::Requirement
|
38
38
|
none: false
|
39
39
|
requirements:
|
@@ -45,11 +45,11 @@ dependencies:
|
|
45
45
|
- 0
|
46
46
|
- 0
|
47
47
|
version: 1.0.0
|
48
|
-
requirement: *id002
|
49
|
-
prerelease: false
|
50
48
|
name: bundler
|
51
|
-
|
49
|
+
requirement: *id002
|
52
50
|
type: :development
|
51
|
+
- !ruby/object:Gem::Dependency
|
52
|
+
prerelease: false
|
53
53
|
version_requirements: &id003 !ruby/object:Gem::Requirement
|
54
54
|
none: false
|
55
55
|
requirements:
|
@@ -61,11 +61,11 @@ dependencies:
|
|
61
61
|
- 6
|
62
62
|
- 0
|
63
63
|
version: 1.6.0
|
64
|
-
requirement: *id003
|
65
|
-
prerelease: false
|
66
64
|
name: jeweler
|
67
|
-
|
65
|
+
requirement: *id003
|
68
66
|
type: :development
|
67
|
+
- !ruby/object:Gem::Dependency
|
68
|
+
prerelease: false
|
69
69
|
version_requirements: &id004 !ruby/object:Gem::Requirement
|
70
70
|
none: false
|
71
71
|
requirements:
|
@@ -75,11 +75,11 @@ dependencies:
|
|
75
75
|
segments:
|
76
76
|
- 0
|
77
77
|
version: "0"
|
78
|
-
requirement: *id004
|
79
|
-
prerelease: false
|
80
78
|
name: rcov
|
81
|
-
|
79
|
+
requirement: *id004
|
82
80
|
type: :development
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
prerelease: false
|
83
83
|
version_requirements: &id005 !ruby/object:Gem::Requirement
|
84
84
|
none: false
|
85
85
|
requirements:
|
@@ -91,11 +91,11 @@ dependencies:
|
|
91
91
|
- 4
|
92
92
|
- 4
|
93
93
|
version: 1.4.4
|
94
|
-
requirement: *id005
|
95
|
-
prerelease: false
|
96
94
|
name: nokogiri
|
97
|
-
|
95
|
+
requirement: *id005
|
98
96
|
type: :development
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
prerelease: false
|
99
99
|
version_requirements: &id006 !ruby/object:Gem::Requirement
|
100
100
|
none: false
|
101
101
|
requirements:
|
@@ -107,11 +107,11 @@ dependencies:
|
|
107
107
|
- 9
|
108
108
|
- 4
|
109
109
|
version: 0.9.4
|
110
|
-
requirement: *id006
|
111
|
-
prerelease: false
|
112
110
|
name: rubyzip
|
113
|
-
|
111
|
+
requirement: *id006
|
114
112
|
type: :development
|
113
|
+
- !ruby/object:Gem::Dependency
|
114
|
+
prerelease: false
|
115
115
|
version_requirements: &id007 !ruby/object:Gem::Requirement
|
116
116
|
none: false
|
117
117
|
requirements:
|
@@ -123,9 +123,9 @@ dependencies:
|
|
123
123
|
- 3
|
124
124
|
- 4
|
125
125
|
version: 1.3.4
|
126
|
-
requirement: *id007
|
127
|
-
prerelease: false
|
128
126
|
name: rspec
|
127
|
+
requirement: *id007
|
128
|
+
type: :development
|
129
129
|
description: rubyXL is a gem which allows the parsing, creation, and manipulation of Microsoft Excel (.xlsx/.xlsm) Documents
|
130
130
|
email: bhagwat.vivek@gmail.com
|
131
131
|
executables: []
|
@@ -200,7 +200,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
200
200
|
requirements: []
|
201
201
|
|
202
202
|
rubyforge_project:
|
203
|
-
rubygems_version: 1.
|
203
|
+
rubygems_version: 1.3.7
|
204
204
|
signing_key:
|
205
205
|
specification_version: 3
|
206
206
|
summary: rubyXL is a gem which allows the parsing, creation, and manipulation of Microsoft Excel (.xlsx/.xlsm) Documents
|