rubyXL 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/Gemfile +16 -0
- data/Gemfile.lock +34 -0
- data/LICENSE.txt +20 -0
- data/README +0 -0
- data/README.rdoc +19 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/lib/.DS_Store +0 -0
- data/lib/Hash.rb +60 -0
- data/lib/cell.rb +360 -0
- data/lib/color.rb +14 -0
- data/lib/parser.rb +413 -0
- data/lib/private_class.rb +182 -0
- data/lib/rubyXL.rb +9 -0
- data/lib/test.html +1 -0
- data/lib/tests/test.rb +110 -0
- data/lib/tests/test10.rb +16 -0
- data/lib/tests/test2.rb +118 -0
- data/lib/tests/test3.rb +76 -0
- data/lib/tests/test4.rb +92 -0
- data/lib/tests/test5.rb +90 -0
- data/lib/tests/test6.rb +50 -0
- data/lib/tests/test7.rb +48 -0
- data/lib/tests/test8.rb +12 -0
- data/lib/tests/test9.rb +60 -0
- data/lib/workbook.rb +336 -0
- data/lib/worksheet.rb +1245 -0
- data/lib/writer/app_writer.rb +62 -0
- data/lib/writer/calc_chain_writer.rb +33 -0
- data/lib/writer/content_types_writer.rb +77 -0
- data/lib/writer/core_writer.rb +51 -0
- data/lib/writer/root_rels_writer.rb +25 -0
- data/lib/writer/shared_strings_writer.rb +44 -0
- data/lib/writer/styles_writer.rb +376 -0
- data/lib/writer/theme_writer.rb +346 -0
- data/lib/writer/workbook_rels_writer.rb +59 -0
- data/lib/writer/workbook_writer.rb +77 -0
- data/lib/writer/worksheet_writer.rb +208 -0
- data/lib/zip.rb +20 -0
- data/pkg/rubyXL-1.0.4.gem +0 -0
- data/rubyXL.gemspec +106 -0
- data/spec/lib/cell_spec.rb +359 -0
- data/spec/lib/color_spec.rb +14 -0
- data/spec/lib/hash_spec.rb +28 -0
- data/spec/lib/parser_spec.rb +49 -0
- data/spec/lib/workbook_spec.rb +51 -0
- data/spec/lib/worksheet_spec.rb +1650 -0
- metadata +222 -0
@@ -0,0 +1,208 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'nokogiri'
|
3
|
+
|
4
|
+
module RubyXL
|
5
|
+
module Writer
|
6
|
+
class WorksheetWriter
|
7
|
+
attr_accessor :dirpath, :filepath, :sheet_num, :workbook, :worksheet
|
8
|
+
|
9
|
+
def initialize(dirpath, wb, sheet_num=1)
|
10
|
+
@dirpath = dirpath
|
11
|
+
@workbook = wb
|
12
|
+
@sheet_num = sheet_num
|
13
|
+
@worksheet = @workbook.worksheets[@sheet_num]
|
14
|
+
@filepath = dirpath + '/xl/worksheets/sheet'+(sheet_num+1).to_s()+'.xml'
|
15
|
+
end
|
16
|
+
|
17
|
+
def write()
|
18
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
19
|
+
xml.worksheet('xmlns'=>"http://schemas.openxmlformats.org/spreadsheetml/2006/main",
|
20
|
+
'xmlns:r'=>"http://schemas.openxmlformats.org/officeDocument/2006/relationships",
|
21
|
+
'xmlns:mc'=>"http://schemas.openxmlformats.org/markup-compatibility/2006",
|
22
|
+
'xmlns:mv'=>"urn:schemas-microsoft-com:mac:vml",
|
23
|
+
'mc:Ignorable'=>'mv',
|
24
|
+
'mc:PreserveAttributes'=>'mv:*') {
|
25
|
+
col = 0
|
26
|
+
@worksheet.sheet_data.each do |row|
|
27
|
+
if row.size > col
|
28
|
+
col = row.size
|
29
|
+
end
|
30
|
+
end
|
31
|
+
row = Integer(@worksheet.sheet_data.size)
|
32
|
+
dimension = 'A1:'
|
33
|
+
dimension += Cell.convert_to_cell(row-1,col-1)
|
34
|
+
xml.dimension('ref'=>dimension)
|
35
|
+
xml.sheetViews {
|
36
|
+
view = @worksheet.sheet_view
|
37
|
+
if view.nil? || view[:attributes].nil?
|
38
|
+
xml.sheetView('tabSelected'=>1,'view'=>'normalLayout','workbookViewId'=>0)
|
39
|
+
raise 'end test' #TODO remove
|
40
|
+
else
|
41
|
+
view = view[:attributes]
|
42
|
+
if view[:view].nil?
|
43
|
+
view[:view] = 'normalLayout'
|
44
|
+
end
|
45
|
+
|
46
|
+
if view[:workbookViewId].nil?
|
47
|
+
view[:workbookViewId] = 0
|
48
|
+
end
|
49
|
+
|
50
|
+
if view[:zoomScale].nil? || view[:zoomScaleNormal].nil?
|
51
|
+
view[:zoomScale] = 100
|
52
|
+
view[:zoomScaleNormal] = 100
|
53
|
+
end
|
54
|
+
|
55
|
+
if view[:tabSelected].nil?
|
56
|
+
view[:tabSelected] = 1
|
57
|
+
end
|
58
|
+
|
59
|
+
xml.sheetView('tabSelected'=>view[:tabSelected],
|
60
|
+
'view'=>view[:view],
|
61
|
+
'workbookViewId'=>view[:workbookViewId],
|
62
|
+
'zoomScale'=>view[:zoomScale],
|
63
|
+
'zoomScaleNormal'=>view[:zoomScaleNormal]) {
|
64
|
+
#TODO
|
65
|
+
#can't be done unless I figure out a way to programmatically add attributes.
|
66
|
+
#(can't put xSplit with an invalid value)
|
67
|
+
# unless @worksheet.pane.nil?
|
68
|
+
# xml.pane('state'=>@worksheet.pane[:state])
|
69
|
+
# end
|
70
|
+
# unless view[:selection].nil?
|
71
|
+
# xml.
|
72
|
+
# end
|
73
|
+
}
|
74
|
+
end
|
75
|
+
}
|
76
|
+
xml.sheetFormatPr('baseColWidth'=>'10','defaultRowHeight'=>'13')
|
77
|
+
|
78
|
+
unless @worksheet.cols.nil? || @worksheet.cols.size==0
|
79
|
+
xml.cols {
|
80
|
+
@worksheet.cols.each do |col|
|
81
|
+
if col[:attributes][:customWidth].nil?
|
82
|
+
col[:attributes][:customWidth] = '0'
|
83
|
+
end
|
84
|
+
if col[:attributes][:width].nil?
|
85
|
+
col[:attributes][:width] = '10'
|
86
|
+
col[:attributes][:customWidth] = '0'
|
87
|
+
end
|
88
|
+
# unless col[:attributes] == {}
|
89
|
+
xml.col('style'=>@workbook.style_corrector[col[:attributes][:style].to_s].to_s,
|
90
|
+
'min'=>col[:attributes][:min].to_s,
|
91
|
+
'max'=>col[:attributes][:max].to_s,
|
92
|
+
'width'=>col[:attributes][:width].to_s,
|
93
|
+
'customWidth'=>col[:attributes][:customWidth].to_s)
|
94
|
+
# end
|
95
|
+
end
|
96
|
+
}
|
97
|
+
end
|
98
|
+
|
99
|
+
xml.sheetData {
|
100
|
+
i=0
|
101
|
+
@worksheet.sheet_data.each_with_index do |row,i|
|
102
|
+
#TODO fix this spans thing. could be 2:3 (not necessary)
|
103
|
+
if @worksheet.row_styles[(i+1).to_s].nil?
|
104
|
+
@worksheet.row_styles[(i+1).to_s] = {}
|
105
|
+
@worksheet.row_styles[(i+1).to_s][:style] = '0'
|
106
|
+
end
|
107
|
+
custom_format = '1'
|
108
|
+
if @worksheet.row_styles[(i+1).to_s][:style] == '0'
|
109
|
+
custom_format = '0'
|
110
|
+
end
|
111
|
+
|
112
|
+
xml.row('r'=>(i+1).to_s, 'spans'=>'1:'+row.size.to_s,
|
113
|
+
's'=>@workbook.style_corrector[@worksheet.row_styles[(i+1).to_s][:style].to_s].to_s,
|
114
|
+
'customFormat'=>custom_format,
|
115
|
+
'ht'=>@worksheet.row_styles[(i+1).to_s][:height].to_s,
|
116
|
+
'customHeight'=>@worksheet.row_styles[(i+1).to_s][:customHeight].to_s) {
|
117
|
+
row.each_with_index do |dat, j|
|
118
|
+
unless dat.nil?
|
119
|
+
#TODO un-hardcode t value, needs to be other values too
|
120
|
+
#TODO recalculate based on formula....?
|
121
|
+
#TODO do xml.c for all cases, inside specific.
|
122
|
+
# if dat.formula.nil?
|
123
|
+
xml.c('r'=>Cell.convert_to_cell(i,j),
|
124
|
+
's'=>@workbook.style_corrector[dat.style_index.to_s].to_s, 't'=>dat.datatype) {
|
125
|
+
unless dat.formula.nil?
|
126
|
+
xml.f dat.formula.to_s
|
127
|
+
end
|
128
|
+
if(dat.datatype == 's')
|
129
|
+
unless dat.value.nil? #empty cell, but has a style
|
130
|
+
xml.v @workbook.shared_strings[dat.value].to_s
|
131
|
+
end
|
132
|
+
elsif(dat.datatype == 'str')
|
133
|
+
xml.v dat.value.to_s
|
134
|
+
elsif(dat.datatype == '') #number
|
135
|
+
xml.v dat.value.to_s
|
136
|
+
end
|
137
|
+
}
|
138
|
+
#
|
139
|
+
# else
|
140
|
+
# xml.c('r'=>Cell.convert_to_cell(i,j)) {
|
141
|
+
# xml.v dat.value.to_s
|
142
|
+
# }
|
143
|
+
# end #data.formula.nil?
|
144
|
+
end #unless dat.nil?
|
145
|
+
end #row.each_with_index
|
146
|
+
}
|
147
|
+
end
|
148
|
+
}
|
149
|
+
|
150
|
+
|
151
|
+
xml.sheetCalcPr('fullCalcOnLoad'=>'1')
|
152
|
+
|
153
|
+
unless @worksheet.merged_cells.nil? || @worksheet.merged_cells.size==0
|
154
|
+
xml.mergeCells {
|
155
|
+
@worksheet.merged_cells.each do |merged_cell|
|
156
|
+
xml.mergeCell('ref'=>merged_cell[:attributes][:ref].to_s)
|
157
|
+
end
|
158
|
+
}
|
159
|
+
end
|
160
|
+
|
161
|
+
xml.phoneticPr('fontId'=>'1','type'=>'noConversion')
|
162
|
+
|
163
|
+
unless @worksheet.validations.nil?
|
164
|
+
xml.dataValidations('count'=>@worksheet.validations.size.to_s) {
|
165
|
+
@worksheet.validations.each do |validation|
|
166
|
+
xml.dataValidation('type'=>validation[:attributes][:type],
|
167
|
+
'sqref'=>validation[:attributes][:sqref],
|
168
|
+
'allowBlank'=>Integer(validation[:attributes][:allowBlank]).to_s,
|
169
|
+
'showInputMessage'=>Integer(validation[:attributes][:showInputMessage]).to_s,
|
170
|
+
'showErrorMessage'=>Integer(validation[:attributes][:showErrorMessage]).to_s) {
|
171
|
+
unless validation[:formula1].nil?
|
172
|
+
xml.formula1 validation[:formula1]
|
173
|
+
end
|
174
|
+
}
|
175
|
+
end
|
176
|
+
}
|
177
|
+
end
|
178
|
+
|
179
|
+
xml.pageMargins('left'=>'0.75','right'=>'0.75','top'=>'1',
|
180
|
+
'bottom'=>'1','header'=>'0.5','footer'=>'0.5')
|
181
|
+
|
182
|
+
xml.pageSetup('orientation'=>'portrait',
|
183
|
+
'horizontalDpi'=>'4294967292', 'verticalDpi'=>'4294967292')
|
184
|
+
|
185
|
+
unless @worksheet.legacy_drawing.nil?
|
186
|
+
xml.legacyDrawing('r:id'=>@worksheet.legacy_drawing[:attributes][:id])
|
187
|
+
end
|
188
|
+
|
189
|
+
unless @worksheet.extLst.nil?
|
190
|
+
xml.extLst {
|
191
|
+
xml.ext('xmlns:mx'=>"http://schemas.microsoft.com/office/mac/excel/2008/main",
|
192
|
+
'uri'=>"http://schemas.microsoft.com/office/mac/excel/2008/main") {
|
193
|
+
xml['mx'].PLV('Mode'=>'1', 'OnePage'=>'0','WScale'=>'0')
|
194
|
+
}
|
195
|
+
}
|
196
|
+
end
|
197
|
+
}
|
198
|
+
end
|
199
|
+
contents = builder.to_xml
|
200
|
+
contents = contents.gsub(/\n/,'')
|
201
|
+
contents = contents.gsub(/>(\s)+</,'><')
|
202
|
+
contents = contents.sub(/<\?xml version=\"1.0\"\?>/,'<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+"\n")
|
203
|
+
contents
|
204
|
+
end
|
205
|
+
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
data/lib/zip.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'zip/zip'
|
3
|
+
require 'zip/zipfilesystem'
|
4
|
+
|
5
|
+
module RubyXL
|
6
|
+
class MyZip
|
7
|
+
|
8
|
+
# Unzips .zip file at zipPath to zipDirPath
|
9
|
+
def unzip(zipPath,zipDirPath)
|
10
|
+
Zip::ZipFile.open(zipPath) { |zip_file|
|
11
|
+
zip_file.each { |f|
|
12
|
+
fpath = File.join(zipDirPath, f.name)
|
13
|
+
FileUtils.mkdir_p(File.dirname(fpath))
|
14
|
+
zip_file.extract(f, fpath) unless File.exist?(fpath)
|
15
|
+
}
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
Binary file
|
data/rubyXL.gemspec
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{rubyXL}
|
8
|
+
s.version = "1.0.4"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Vivek Bhagwat"]
|
12
|
+
s.date = %q{2011-08-01}
|
13
|
+
s.description = %q{rubyXL is a gem which allows the parsing, creation, and manipulation of Microsoft Excel (.xlsx) Documents}
|
14
|
+
s.email = %q{bhagwat.vivek@gmail.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE.txt",
|
17
|
+
"README",
|
18
|
+
"README.rdoc"
|
19
|
+
]
|
20
|
+
s.files = [
|
21
|
+
"Gemfile",
|
22
|
+
"Gemfile.lock",
|
23
|
+
"LICENSE.txt",
|
24
|
+
"README",
|
25
|
+
"README.rdoc",
|
26
|
+
"Rakefile",
|
27
|
+
"VERSION",
|
28
|
+
"lib/.DS_Store",
|
29
|
+
"lib/Hash.rb",
|
30
|
+
"lib/cell.rb",
|
31
|
+
"lib/color.rb",
|
32
|
+
"lib/parser.rb",
|
33
|
+
"lib/private_class.rb",
|
34
|
+
"lib/rubyXL.rb",
|
35
|
+
"lib/test.html",
|
36
|
+
"lib/tests/test.rb",
|
37
|
+
"lib/tests/test10.rb",
|
38
|
+
"lib/tests/test2.rb",
|
39
|
+
"lib/tests/test3.rb",
|
40
|
+
"lib/tests/test4.rb",
|
41
|
+
"lib/tests/test5.rb",
|
42
|
+
"lib/tests/test6.rb",
|
43
|
+
"lib/tests/test7.rb",
|
44
|
+
"lib/tests/test8.rb",
|
45
|
+
"lib/tests/test9.rb",
|
46
|
+
"lib/workbook.rb",
|
47
|
+
"lib/worksheet.rb",
|
48
|
+
"lib/writer/app_writer.rb",
|
49
|
+
"lib/writer/calc_chain_writer.rb",
|
50
|
+
"lib/writer/content_types_writer.rb",
|
51
|
+
"lib/writer/core_writer.rb",
|
52
|
+
"lib/writer/root_rels_writer.rb",
|
53
|
+
"lib/writer/shared_strings_writer.rb",
|
54
|
+
"lib/writer/styles_writer.rb",
|
55
|
+
"lib/writer/theme_writer.rb",
|
56
|
+
"lib/writer/workbook_rels_writer.rb",
|
57
|
+
"lib/writer/workbook_writer.rb",
|
58
|
+
"lib/writer/worksheet_writer.rb",
|
59
|
+
"lib/zip.rb",
|
60
|
+
"pkg/rubyXL-1.0.4.gem",
|
61
|
+
"rubyXL.gemspec",
|
62
|
+
"spec/lib/cell_spec.rb",
|
63
|
+
"spec/lib/color_spec.rb",
|
64
|
+
"spec/lib/hash_spec.rb",
|
65
|
+
"spec/lib/parser_spec.rb",
|
66
|
+
"spec/lib/workbook_spec.rb",
|
67
|
+
"spec/lib/worksheet_spec.rb"
|
68
|
+
]
|
69
|
+
s.homepage = %q{http://github.com/vivekbhagwat/rubyXL}
|
70
|
+
s.licenses = ["MIT"]
|
71
|
+
s.require_paths = ["lib"]
|
72
|
+
s.rubygems_version = %q{1.3.7}
|
73
|
+
s.summary = %q{rubyXL is a gem which allows the parsing, creation, and manipulation of Microsoft Excel (.xlsx) Documents}
|
74
|
+
|
75
|
+
if s.respond_to? :specification_version then
|
76
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
77
|
+
s.specification_version = 3
|
78
|
+
|
79
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
80
|
+
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
81
|
+
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
82
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.6.0"])
|
83
|
+
s.add_development_dependency(%q<rcov>, [">= 0"])
|
84
|
+
s.add_development_dependency(%q<nokogiri>, [">= 1.4.4"])
|
85
|
+
s.add_development_dependency(%q<rubyzip>, [">= 0.9.4"])
|
86
|
+
s.add_development_dependency(%q<rspec>, [">= 1.3.4"])
|
87
|
+
else
|
88
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
89
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
90
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.0"])
|
91
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
92
|
+
s.add_dependency(%q<nokogiri>, [">= 1.4.4"])
|
93
|
+
s.add_dependency(%q<rubyzip>, [">= 0.9.4"])
|
94
|
+
s.add_dependency(%q<rspec>, [">= 1.3.4"])
|
95
|
+
end
|
96
|
+
else
|
97
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
98
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
99
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.0"])
|
100
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
101
|
+
s.add_dependency(%q<nokogiri>, [">= 1.4.4"])
|
102
|
+
s.add_dependency(%q<rubyzip>, [">= 0.9.4"])
|
103
|
+
s.add_dependency(%q<rspec>, [">= 1.3.4"])
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
@@ -0,0 +1,359 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rubyXL'
|
3
|
+
|
4
|
+
describe RubyXL::Cell do
|
5
|
+
|
6
|
+
before do
|
7
|
+
@workbook = RubyXL::Workbook.new
|
8
|
+
@worksheet = RubyXL::Worksheet.new(@workbook)
|
9
|
+
@workbook.worksheets << @worksheet
|
10
|
+
(0..10).each do |i|
|
11
|
+
(0..10).each do |j|
|
12
|
+
@worksheet.add_cell(i, j, "#{i}:#{j}")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
@cell = @worksheet[0][0]
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '.change_fill' do
|
19
|
+
it 'should cause an error if hex color code not passed' do
|
20
|
+
lambda {
|
21
|
+
@cell.change_fill('G')
|
22
|
+
}.should raise_error
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should make cell fill color equal to hex color code passed' do
|
26
|
+
@cell.change_fill('0f0f0f')
|
27
|
+
@cell.fill_color.should == '0f0f0f'
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should cause an error if hex color code includes # character' do
|
31
|
+
lambda {
|
32
|
+
@cell.change_fill('#0f0f0f')
|
33
|
+
}.should raise_error
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '.change_font_name' do
|
38
|
+
it 'should make font name match font name passed' do
|
39
|
+
@cell.change_font_name('Arial')
|
40
|
+
@cell.font_name.should == 'Arial'
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe '.change_font_size' do
|
45
|
+
it 'should make font size match number passed' do
|
46
|
+
@cell.change_font_size(30)
|
47
|
+
@cell.font_size.should == 30
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'should cause an error if a string passed' do
|
51
|
+
lambda {
|
52
|
+
@cell.change_font_size('20')
|
53
|
+
}.should raise_error
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe '.change_font_color' do
|
58
|
+
it 'should cause an error if hex color code not passed' do
|
59
|
+
lambda {
|
60
|
+
@cell.change_font_color('G')
|
61
|
+
}.should raise_error
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should make cell font color equal to hex color code passed' do
|
65
|
+
@cell.change_font_color('0f0f0f')
|
66
|
+
@cell.font_color.should == '0f0f0f'
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'should cause an error if hex color code includes # character' do
|
70
|
+
lambda {
|
71
|
+
@cell.change_font_color('#0f0f0f')
|
72
|
+
}.should raise_error
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe '.change_font_italics' do
|
77
|
+
it 'should make cell font italicized when true is passed' do
|
78
|
+
@cell.change_font_italics(true)
|
79
|
+
@cell.is_italicized.should == true
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe '.change_font_bold' do
|
84
|
+
it 'should make cell font bolded when true is passed' do
|
85
|
+
@cell.change_font_bold(true)
|
86
|
+
@cell.is_bolded.should == true
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
describe '.change_font_underline' do
|
91
|
+
it 'should make cell font underlined when true is passed' do
|
92
|
+
@cell.change_font_underline(true)
|
93
|
+
@cell.is_underlined.should == true
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe '.change_font_strikethrough' do
|
98
|
+
it 'should make cell font struckthrough when true is passed' do
|
99
|
+
@cell.change_font_strikethrough(true)
|
100
|
+
@cell.is_struckthrough.should == true
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
describe '.change_horizontal_alignment' do
|
105
|
+
it 'should cause cell to horizontally align as specified by the passed in string' do
|
106
|
+
@cell.change_horizontal_alignment('center')
|
107
|
+
@cell.horizontal_alignment.should == 'center'
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'should cause error if nil, "center", "justify", "left", "right", or "distributed" is not passed' do
|
111
|
+
lambda {
|
112
|
+
@cell.change_horizontal_alignment('TEST')
|
113
|
+
}.should raise_error
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
describe '.change_vertical_alignment' do
|
118
|
+
it 'should cause cell to vertically align as specified by the passed in string' do
|
119
|
+
@cell.change_vertical_alignment('center')
|
120
|
+
@cell.vertical_alignment.should == 'center'
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'should cause error if nil, "center", "justify", "left", "right", or "distributed" is not passed' do
|
124
|
+
lambda {
|
125
|
+
@cell.change_vertical_alignment('TEST')
|
126
|
+
}.should raise_error
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
describe '.change_border_top' do
|
131
|
+
it 'should cause cell to have border at top with specified weight' do
|
132
|
+
@cell.change_border_top('thin')
|
133
|
+
@cell.border_top.should == 'thin'
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'should cause error if nil, "thin", "thick", "hairline", or "medium" is not passed' do
|
137
|
+
lambda {
|
138
|
+
@cell.change_border_top('TEST')
|
139
|
+
}.should raise_error
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
describe '.change_border_left' do
|
144
|
+
it 'should cause cell to have border at left with specified weight' do
|
145
|
+
@cell.change_border_left('thin')
|
146
|
+
@cell.border_left.should == 'thin'
|
147
|
+
end
|
148
|
+
|
149
|
+
it 'should cause error if nil, "thin", "thick", "hairline", or "medium" is not passed' do
|
150
|
+
lambda {
|
151
|
+
@cell.change_border_left('TEST')
|
152
|
+
}.should raise_error
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
describe '.change_border_right' do
|
157
|
+
it 'should cause cell to have border at right with specified weight' do
|
158
|
+
@cell.change_border_right('thin')
|
159
|
+
@cell.border_right.should == 'thin'
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'should cause error if nil, "thin", "thick", "hairline", or "medium" is not passed' do
|
163
|
+
lambda {
|
164
|
+
@cell.change_border_right('TEST')
|
165
|
+
}.should raise_error
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
describe '.change_border_bottom' do
|
170
|
+
it 'should cause cell to have border at bottom with specified weight' do
|
171
|
+
@cell.change_border_bottom('thin')
|
172
|
+
@cell.border_bottom.should == 'thin'
|
173
|
+
end
|
174
|
+
|
175
|
+
it 'should cause error if nil, "thin", "thick", "hairline", or "medium" is not passed' do
|
176
|
+
lambda {
|
177
|
+
@cell.change_border_bottom('TEST')
|
178
|
+
}.should raise_error
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
describe '.change_border_diagonal' do
|
183
|
+
it 'should cause cell to have border at diagonal with specified weight' do
|
184
|
+
@cell.change_border_diagonal('thin')
|
185
|
+
@cell.border_diagonal.should == 'thin'
|
186
|
+
end
|
187
|
+
|
188
|
+
it 'should cause error if nil, "thin", "thick", "hairline", or "medium" is not passed' do
|
189
|
+
lambda {
|
190
|
+
@cell.change_border_diagonal('TEST')
|
191
|
+
}.should raise_error
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
describe '.change_contents' do
|
196
|
+
it 'should cause cell value to match string or number that is passed in' do
|
197
|
+
@cell.change_contents('TEST')
|
198
|
+
@cell.value.should == 'TEST'
|
199
|
+
@cell.formula.should == nil
|
200
|
+
end
|
201
|
+
|
202
|
+
it 'should cause cell value and formula to match what is passed in' do
|
203
|
+
@cell.change_contents(nil, 'SUM(A2:A4)')
|
204
|
+
@cell.value.should == nil
|
205
|
+
@cell.formula.should == 'SUM(A2:A4)'
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
describe '.is_italicized' do
|
210
|
+
it 'should correctly return whether or not the cell\'s font is italicized' do
|
211
|
+
@cell.change_font_italics(true)
|
212
|
+
@cell.is_italicized.should == true
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
describe '.is_bolded' do
|
217
|
+
it 'should correctly return whether or not the cell\'s font is bolded' do
|
218
|
+
@cell.change_font_bold(true)
|
219
|
+
@cell.is_bolded.should == true
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
describe '.is_underlined' do
|
224
|
+
it 'should correctly return whether or not the cell\'s font is underlined' do
|
225
|
+
@cell.change_font_underline(true)
|
226
|
+
@cell.is_underlined.should == true
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
describe '.is_struckthrough' do
|
231
|
+
it 'should correctly return whether or not the cell\'s font is struckthrough' do
|
232
|
+
@cell.change_font_strikethrough(true)
|
233
|
+
@cell.is_struckthrough.should == true
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
describe '.font_name' do
|
238
|
+
it 'should correctly return the name of the cell\'s font' do
|
239
|
+
@cell.change_font_name('Verdana')
|
240
|
+
@cell.font_name.should == 'Verdana'
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
describe '.font_size' do
|
245
|
+
it 'should correctly return the size of the cell\'s font' do
|
246
|
+
@cell.change_font_size(20)
|
247
|
+
@cell.font_size.should == 20
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
describe '.font_color' do
|
252
|
+
it 'should correctly return the color of the cell\'s font' do
|
253
|
+
@cell.change_font_color('0f0f0f')
|
254
|
+
@cell.font_color.should == '0f0f0f'
|
255
|
+
end
|
256
|
+
|
257
|
+
it 'should return 000000 (black) if no font color has been specified for this cell' do
|
258
|
+
@cell.font_color.should == '000000'
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
describe '.fill_color' do
|
263
|
+
it 'should correctly return the color of the cell\'s fill' do
|
264
|
+
@cell.change_fill('000000')
|
265
|
+
@cell.fill_color.should == '000000'
|
266
|
+
end
|
267
|
+
|
268
|
+
it 'should return ffffff (white) if no fill color has been specified for this cell' do
|
269
|
+
@cell.fill_color.should == 'ffffff'
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
273
|
+
describe '.horizontal_alignment' do
|
274
|
+
it 'should correctly return the type of horizontal alignment of this cell' do
|
275
|
+
@cell.change_horizontal_alignment('center')
|
276
|
+
@cell.horizontal_alignment.should == 'center'
|
277
|
+
end
|
278
|
+
|
279
|
+
it 'should return nil if no horizontal alignment has been specified for this cell' do
|
280
|
+
@cell.horizontal_alignment.should == nil
|
281
|
+
end
|
282
|
+
end
|
283
|
+
|
284
|
+
describe '.vertical_alignment' do
|
285
|
+
it 'should correctly return the type of vertical alignment of this cell' do
|
286
|
+
@cell.change_vertical_alignment('center')
|
287
|
+
@cell.vertical_alignment.should == 'center'
|
288
|
+
end
|
289
|
+
|
290
|
+
it 'should return nil if no vertical alignment has been specified for this cell' do
|
291
|
+
@cell.vertical_alignment.should be_nil
|
292
|
+
end
|
293
|
+
end
|
294
|
+
|
295
|
+
describe '.border_top' do
|
296
|
+
it 'should correctly return the weight of the border on top for this cell' do
|
297
|
+
@cell.change_border_top('thin')
|
298
|
+
@cell.border_top.should == 'thin'
|
299
|
+
end
|
300
|
+
|
301
|
+
it 'should return nil if no top border has been specified for this cell' do
|
302
|
+
@cell.border_top.should be_nil
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
describe '.border_left' do
|
307
|
+
it 'should correctly return the weight of the border on left for this cell' do
|
308
|
+
@cell.change_border_left('thin')
|
309
|
+
@cell.border_left.should == 'thin'
|
310
|
+
end
|
311
|
+
|
312
|
+
it 'should return nil if no left border has been specified for this cell' do
|
313
|
+
@cell.border_left.should be_nil
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
describe '.border_right' do
|
318
|
+
it 'should correctly return the weight of the border on right for this cell' do
|
319
|
+
@cell.change_border_right('thin')
|
320
|
+
@cell.border_right.should == 'thin'
|
321
|
+
end
|
322
|
+
|
323
|
+
it 'should return nil if no right border has been specified for this cell' do
|
324
|
+
@cell.border_right.should be_nil
|
325
|
+
end
|
326
|
+
end
|
327
|
+
|
328
|
+
describe '.border_bottom' do
|
329
|
+
it 'should correctly return the weight of the border on bottom for this cell' do
|
330
|
+
@cell.change_border_bottom('thin')
|
331
|
+
@cell.border_bottom.should == 'thin'
|
332
|
+
end
|
333
|
+
|
334
|
+
it 'should return nil if no bottom border has been specified for this cell' do
|
335
|
+
@cell.border_bottom.should be_nil
|
336
|
+
end
|
337
|
+
end
|
338
|
+
|
339
|
+
describe '.border_diagonal' do
|
340
|
+
it 'should correctly return the weight of the diagonal border for this cell' do
|
341
|
+
@cell.change_border_diagonal('thin')
|
342
|
+
@cell.border_diagonal.should == 'thin'
|
343
|
+
end
|
344
|
+
|
345
|
+
it 'should return nil if no diagonal border has been specified for this cell' do
|
346
|
+
@cell.border_diagonal.should be_nil
|
347
|
+
end
|
348
|
+
end
|
349
|
+
|
350
|
+
describe '.convert_to_cell' do
|
351
|
+
it 'should correctly return the "Excel Style" description of cells when given a row/column number' do
|
352
|
+
RubyXL::Cell.convert_to_cell(0,26).should == 'AA1'
|
353
|
+
end
|
354
|
+
|
355
|
+
it 'should cause an error if a negative argument is given' do
|
356
|
+
lambda {RubyXL::Cell.convert_to_cell(-1,0)}.should raise_error
|
357
|
+
end
|
358
|
+
end
|
359
|
+
end
|