rubyXL 1.2.10 → 2.1.1
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 +14 -10
- data/Gemfile.lock +80 -21
- data/LICENSE.txt +1 -1
- data/README.rdoc +88 -82
- data/Rakefile +7 -2
- data/VERSION +1 -1
- data/lib/rubyXL.rb +13 -7
- data/lib/rubyXL/cell.rb +108 -268
- data/lib/rubyXL/generic_storage.rb +40 -0
- data/lib/rubyXL/objects/border.rb +66 -0
- data/lib/rubyXL/objects/calculation_chain.rb +28 -0
- data/lib/rubyXL/objects/cell_style.rb +75 -0
- data/lib/rubyXL/objects/color.rb +25 -0
- data/lib/rubyXL/objects/column_range.rb +74 -0
- data/lib/rubyXL/objects/container_nodes.rb +122 -0
- data/lib/rubyXL/objects/data_validation.rb +43 -0
- data/lib/rubyXL/objects/document_properties.rb +76 -0
- data/lib/rubyXL/objects/extensions.rb +36 -0
- data/lib/rubyXL/objects/fill.rb +57 -0
- data/lib/rubyXL/objects/font.rb +111 -0
- data/lib/rubyXL/objects/formula.rb +24 -0
- data/lib/rubyXL/objects/ooxml_object.rb +295 -0
- data/lib/rubyXL/objects/reference.rb +110 -0
- data/lib/rubyXL/objects/relationships.rb +59 -0
- data/lib/rubyXL/objects/shared_strings.rb +57 -0
- data/lib/rubyXL/objects/sheet_data.rb +149 -0
- data/lib/rubyXL/objects/sheet_view.rb +71 -0
- data/lib/rubyXL/objects/stylesheet.rb +200 -0
- data/lib/rubyXL/objects/text.rb +87 -0
- data/lib/rubyXL/objects/theme.rb +64 -0
- data/lib/rubyXL/objects/workbook.rb +233 -0
- data/lib/rubyXL/objects/worksheet.rb +485 -0
- data/lib/rubyXL/parser.rb +78 -442
- data/lib/rubyXL/workbook.rb +216 -385
- data/lib/rubyXL/worksheet.rb +509 -1062
- data/lib/rubyXL/writer/content_types_writer.rb +104 -68
- data/lib/rubyXL/writer/core_writer.rb +26 -43
- data/lib/rubyXL/writer/generic_writer.rb +43 -0
- data/lib/rubyXL/writer/root_rels_writer.rb +11 -19
- data/lib/rubyXL/writer/styles_writer.rb +6 -398
- data/lib/rubyXL/writer/theme_writer.rb +321 -327
- data/lib/rubyXL/writer/workbook_writer.rb +63 -67
- data/lib/rubyXL/writer/worksheet_writer.rb +29 -218
- data/rdoc/created.rid +39 -0
- data/rdoc/fonts.css +167 -0
- data/rdoc/fonts/Lato-Light.ttf +0 -0
- data/rdoc/fonts/Lato-LightItalic.ttf +0 -0
- data/rdoc/fonts/Lato-Regular.ttf +0 -0
- data/rdoc/fonts/Lato-RegularItalic.ttf +0 -0
- data/rdoc/fonts/SourceCodePro-Bold.ttf +0 -0
- data/rdoc/fonts/SourceCodePro-Regular.ttf +0 -0
- data/rdoc/images/add.png +0 -0
- data/rdoc/images/arrow_up.png +0 -0
- data/rdoc/images/brick.png +0 -0
- data/rdoc/images/brick_link.png +0 -0
- data/rdoc/images/bug.png +0 -0
- data/rdoc/images/bullet_black.png +0 -0
- data/rdoc/images/bullet_toggle_minus.png +0 -0
- data/rdoc/images/bullet_toggle_plus.png +0 -0
- data/rdoc/images/date.png +0 -0
- data/rdoc/images/delete.png +0 -0
- data/rdoc/images/find.png +0 -0
- data/rdoc/images/loadingAnimation.gif +0 -0
- data/rdoc/images/macFFBgHack.png +0 -0
- data/rdoc/images/package.png +0 -0
- data/rdoc/images/page_green.png +0 -0
- data/rdoc/images/page_white_text.png +0 -0
- data/rdoc/images/page_white_width.png +0 -0
- data/rdoc/images/plugin.png +0 -0
- data/rdoc/images/ruby.png +0 -0
- data/rdoc/images/tag_blue.png +0 -0
- data/rdoc/images/tag_green.png +0 -0
- data/rdoc/images/transparent.png +0 -0
- data/rdoc/images/wrench.png +0 -0
- data/rdoc/images/wrench_orange.png +0 -0
- data/rdoc/images/zoom.png +0 -0
- data/rdoc/js/darkfish.js +140 -0
- data/rdoc/js/jquery.js +18 -0
- data/rdoc/js/navigation.js +142 -0
- data/rdoc/js/search.js +109 -0
- data/rdoc/js/search_index.js +1 -0
- data/rdoc/js/searcher.js +228 -0
- data/rdoc/rdoc.css +580 -0
- data/rubyXL.gemspec +90 -34
- data/spec/lib/cell_spec.rb +29 -59
- data/spec/lib/parser_spec.rb +35 -19
- data/spec/lib/reference_spec.rb +29 -0
- data/spec/lib/stylesheet_spec.rb +29 -0
- data/spec/lib/workbook_spec.rb +22 -17
- data/spec/lib/worksheet_spec.rb +47 -202
- metadata +185 -148
- data/lib/.DS_Store +0 -0
- data/lib/rubyXL/Hash.rb +0 -60
- data/lib/rubyXL/color.rb +0 -14
- data/lib/rubyXL/private_class.rb +0 -265
- data/lib/rubyXL/writer/app_writer.rb +0 -62
- data/lib/rubyXL/writer/calc_chain_writer.rb +0 -33
- data/lib/rubyXL/writer/shared_strings_writer.rb +0 -30
- data/lib/rubyXL/writer/workbook_rels_writer.rb +0 -59
- data/lib/rubyXL/zip.rb +0 -20
- data/spec/lib/hash_spec.rb +0 -28
data/lib/rubyXL/cell.rb
CHANGED
|
@@ -1,209 +1,115 @@
|
|
|
1
1
|
module RubyXL
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
@
|
|
11
|
-
@row = row
|
|
12
|
-
@column = column
|
|
13
|
-
@datatype = datatype
|
|
14
|
-
@value = value
|
|
15
|
-
@formula=formula
|
|
16
|
-
@style_index = style_index
|
|
17
|
-
@formula_attributes = fmla_attr
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def value(args = {})
|
|
21
|
-
raw_values = args.delete(:raw) || false
|
|
22
|
-
return @value if raw_values
|
|
23
|
-
|
|
24
|
-
if is_date?
|
|
25
|
-
return @workbook.num_to_date(@value)
|
|
26
|
-
else
|
|
27
|
-
return @value
|
|
28
|
-
end
|
|
2
|
+
module LegacyCell
|
|
3
|
+
SHARED_STRING = 's'
|
|
4
|
+
RAW_STRING = 'str'
|
|
5
|
+
ERROR = 'e'
|
|
6
|
+
|
|
7
|
+
attr_accessor :formula, :worksheet
|
|
8
|
+
|
|
9
|
+
def workbook
|
|
10
|
+
@worksheet.workbook
|
|
29
11
|
end
|
|
30
12
|
|
|
31
13
|
def is_date?
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
tmp_num_fmt = @workbook.num_fmts_by_id[num_fmt_id]
|
|
36
|
-
num_fmt = (tmp_num_fmt &&tmp_num_fmt[:attributes] && tmp_num_fmt[:attributes][:formatCode]) ? tmp_num_fmt[:attributes][:formatCode] : nil
|
|
37
|
-
if num_fmt && workbook.date_num_fmt?(num_fmt)
|
|
38
|
-
return true
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
return false
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def is_date_format?(num_fmt)
|
|
46
|
-
skip_chars = ['$', '-', '+', '/', '(', ')', ':', ' ']
|
|
47
|
-
num_chars = ['0', '#', '?']
|
|
48
|
-
non_date_formats = ['0.00E+00', '##0.0E+0', 'General', 'GENERAL', 'general', '@']
|
|
49
|
-
date_chars = ['y','m','d','h','s']
|
|
50
|
-
|
|
51
|
-
state = 0
|
|
52
|
-
s = ''
|
|
53
|
-
num_fmt.split(//).each do |c|
|
|
54
|
-
if state == 0
|
|
55
|
-
if c == '"'
|
|
56
|
-
state = 1
|
|
57
|
-
elsif ['\\', '_', '*'].include?(c)
|
|
58
|
-
state = 2
|
|
59
|
-
elsif skip_chars.include?(c)
|
|
60
|
-
next
|
|
61
|
-
else
|
|
62
|
-
s << c
|
|
63
|
-
end
|
|
64
|
-
elsif state == 1
|
|
65
|
-
if c == '"'
|
|
66
|
-
state = 0
|
|
67
|
-
end
|
|
68
|
-
elsif state == 2
|
|
69
|
-
state = 0
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
s.gsub!(/\[[^\]]*\]/, '')
|
|
73
|
-
if non_date_formats.include?(s)
|
|
74
|
-
return false
|
|
75
|
-
end
|
|
76
|
-
separator = ';'
|
|
77
|
-
got_sep = 0
|
|
78
|
-
date_count = 0
|
|
79
|
-
num_count = 0
|
|
80
|
-
s.split(//).each do |c|
|
|
81
|
-
if date_chars.include?(c)
|
|
82
|
-
date_count += 1
|
|
83
|
-
elsif num_chars.include?(c)
|
|
84
|
-
num_count += 1
|
|
85
|
-
elsif c == separator
|
|
86
|
-
got_sep = 1
|
|
87
|
-
end
|
|
88
|
-
end
|
|
89
|
-
if date_count > 0 && num_count == 0
|
|
90
|
-
return true
|
|
91
|
-
elsif num_count > 0 && date_count == 0
|
|
92
|
-
return false
|
|
93
|
-
elsif date_count
|
|
94
|
-
# ambiguous result
|
|
95
|
-
elsif got_sep == 0
|
|
96
|
-
# constant result
|
|
97
|
-
end
|
|
98
|
-
return date_count > num_count
|
|
14
|
+
return false unless raw_value =~ /^\d+$/ # Only fully numeric values can be dates
|
|
15
|
+
num_fmt = get_number_format
|
|
16
|
+
num_fmt && num_fmt.is_date_format?
|
|
99
17
|
end
|
|
100
18
|
|
|
101
19
|
# changes fill color of cell
|
|
102
20
|
def change_fill(rgb='ffffff')
|
|
103
21
|
validate_worksheet
|
|
104
22
|
Color.validate_color(rgb)
|
|
105
|
-
|
|
23
|
+
self.style_index = workbook.modify_fill(self.style_index,rgb)
|
|
106
24
|
end
|
|
107
25
|
|
|
108
26
|
# Changes font name of cell
|
|
109
|
-
def change_font_name(
|
|
27
|
+
def change_font_name(new_font_name = 'Verdana')
|
|
110
28
|
validate_worksheet
|
|
111
|
-
|
|
112
|
-
font =
|
|
113
|
-
font
|
|
114
|
-
|
|
115
|
-
change_font(font)
|
|
29
|
+
|
|
30
|
+
font = get_cell_font.dup
|
|
31
|
+
font.set_name(new_font_name)
|
|
32
|
+
update_font_references(font)
|
|
116
33
|
end
|
|
117
34
|
|
|
118
35
|
# Changes font size of cell
|
|
119
36
|
def change_font_size(font_size=10)
|
|
120
37
|
validate_worksheet
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
change_font(font)
|
|
127
|
-
else
|
|
128
|
-
raise 'Argument must be a number'
|
|
129
|
-
end
|
|
38
|
+
raise 'Argument must be a number' unless font_size.is_a?(Integer) || font_size.is_a?(Float)
|
|
39
|
+
|
|
40
|
+
font = get_cell_font.dup
|
|
41
|
+
font.set_size(font_size)
|
|
42
|
+
update_font_references(font)
|
|
130
43
|
end
|
|
131
44
|
|
|
132
45
|
# Changes font color of cell
|
|
133
46
|
def change_font_color(font_color='000000')
|
|
134
47
|
validate_worksheet
|
|
135
|
-
#if arg is a color name, convert to integer
|
|
136
48
|
Color.validate_color(font_color)
|
|
137
|
-
|
|
138
|
-
font =
|
|
139
|
-
font
|
|
140
|
-
|
|
141
|
-
change_font(font)
|
|
49
|
+
|
|
50
|
+
font = get_cell_font.dup
|
|
51
|
+
font.set_rgb_color(font_color)
|
|
52
|
+
update_font_references(font)
|
|
142
53
|
end
|
|
143
54
|
|
|
144
55
|
# Changes font italics settings of cell
|
|
145
56
|
def change_font_italics(italicized=false)
|
|
146
57
|
validate_worksheet
|
|
147
|
-
|
|
148
|
-
font =
|
|
149
|
-
font
|
|
150
|
-
|
|
151
|
-
change_font(font)
|
|
58
|
+
|
|
59
|
+
font = get_cell_font.dup
|
|
60
|
+
font.set_italic(italicized)
|
|
61
|
+
update_font_references(font)
|
|
152
62
|
end
|
|
153
63
|
|
|
154
64
|
# Changes font bold settings of cell
|
|
155
65
|
def change_font_bold(bolded=false)
|
|
156
66
|
validate_worksheet
|
|
157
|
-
|
|
158
|
-
font =
|
|
159
|
-
font
|
|
160
|
-
|
|
161
|
-
change_font(font)
|
|
67
|
+
|
|
68
|
+
font = get_cell_font.dup
|
|
69
|
+
font.set_bold(bolded)
|
|
70
|
+
update_font_references(font)
|
|
162
71
|
end
|
|
163
72
|
|
|
164
73
|
# Changes font underline settings of cell
|
|
165
74
|
def change_font_underline(underlined=false)
|
|
166
75
|
validate_worksheet
|
|
167
|
-
|
|
168
|
-
font =
|
|
169
|
-
font
|
|
170
|
-
|
|
171
|
-
change_font(font)
|
|
76
|
+
|
|
77
|
+
font = get_cell_font.dup
|
|
78
|
+
font.set_underline(underlined)
|
|
79
|
+
update_font_references(font)
|
|
172
80
|
end
|
|
173
81
|
|
|
174
|
-
# Changes font strikethrough settings of cell
|
|
175
82
|
def change_font_strikethrough(struckthrough=false)
|
|
176
83
|
validate_worksheet
|
|
177
|
-
|
|
178
|
-
font =
|
|
179
|
-
font
|
|
180
|
-
|
|
181
|
-
change_font(font)
|
|
84
|
+
|
|
85
|
+
font = get_cell_font.dup
|
|
86
|
+
font.set_strikethrough(struckthrough)
|
|
87
|
+
update_font_references(font)
|
|
182
88
|
end
|
|
183
89
|
|
|
184
90
|
# Helper method to update the font array and xf array
|
|
185
|
-
def
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
# Get copy of xf object with modified font id
|
|
189
|
-
xf = deep_copy(xf_id())
|
|
190
|
-
xf[:fontId] = Integer(font_id.to_i)
|
|
191
|
-
# Modify xf array and retrieve new xf id
|
|
192
|
-
@style_index = modify_xf(@workbook, xf)
|
|
91
|
+
def update_font_references(modified_font)
|
|
92
|
+
xf = workbook.register_new_font(modified_font, get_cell_xf)
|
|
93
|
+
self.style_index = workbook.register_new_xf(xf, self.style_index)
|
|
193
94
|
end
|
|
95
|
+
private :update_font_references
|
|
194
96
|
|
|
195
97
|
# changes horizontal alignment of cell
|
|
196
98
|
def change_horizontal_alignment(alignment='center')
|
|
197
99
|
validate_worksheet
|
|
198
|
-
|
|
199
|
-
@style_index = modify_alignment(@workbook,@style_index,true,alignment)
|
|
100
|
+
self.style_index = workbook.modify_alignment(self.style_index, true, alignment)
|
|
200
101
|
end
|
|
201
102
|
|
|
202
103
|
# changes vertical alignment of cell
|
|
203
104
|
def change_vertical_alignment(alignment='center')
|
|
204
105
|
validate_worksheet
|
|
205
|
-
|
|
206
|
-
|
|
106
|
+
self.style_index = workbook.modify_alignment(self.style_index, false, alignment)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# changes wrap of cell
|
|
110
|
+
def change_text_wrap(wrap=false)
|
|
111
|
+
validate_worksheet
|
|
112
|
+
self.style_index = workbook.modify_text_wrap(self.style_index, wrap)
|
|
207
113
|
end
|
|
208
114
|
|
|
209
115
|
# changes top border of cell
|
|
@@ -234,106 +140,82 @@ module RubyXL
|
|
|
234
140
|
# changes contents of cell, with formula option
|
|
235
141
|
def change_contents(data, formula=nil)
|
|
236
142
|
validate_worksheet
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
@datatype = ''
|
|
143
|
+
self.datatype = RAW_STRING
|
|
144
|
+
|
|
145
|
+
case data
|
|
146
|
+
when Date then data = workbook.date_to_num(data)
|
|
147
|
+
when Integer, Float then self.datatype = ''
|
|
243
148
|
end
|
|
244
|
-
|
|
245
|
-
|
|
149
|
+
|
|
150
|
+
self.raw_value = data
|
|
151
|
+
@formula = formula
|
|
246
152
|
end
|
|
247
153
|
|
|
248
154
|
# returns if font is italicized
|
|
249
155
|
def is_italicized()
|
|
250
156
|
validate_worksheet
|
|
251
|
-
|
|
252
|
-
false
|
|
253
|
-
else
|
|
254
|
-
true
|
|
255
|
-
end
|
|
157
|
+
get_cell_font.is_italic
|
|
256
158
|
end
|
|
257
159
|
|
|
258
160
|
# returns if font is bolded
|
|
259
161
|
def is_bolded()
|
|
260
162
|
validate_worksheet
|
|
261
|
-
|
|
262
|
-
false
|
|
263
|
-
else
|
|
264
|
-
true
|
|
265
|
-
end
|
|
163
|
+
get_cell_font.is_bold
|
|
266
164
|
end
|
|
267
165
|
|
|
268
|
-
# returns if font is underlined
|
|
269
166
|
def is_underlined()
|
|
270
167
|
validate_worksheet
|
|
271
|
-
|
|
272
|
-
if @workbook.fonts[font_id()][:font][:u].nil?
|
|
273
|
-
false
|
|
274
|
-
else
|
|
275
|
-
true
|
|
276
|
-
end
|
|
168
|
+
get_cell_font.is_underlined
|
|
277
169
|
end
|
|
278
170
|
|
|
279
|
-
# returns if font has a strike through it
|
|
280
171
|
def is_struckthrough()
|
|
281
172
|
validate_worksheet
|
|
282
|
-
|
|
283
|
-
if @workbook.fonts[font_id()][:font][:strike].nil?
|
|
284
|
-
false
|
|
285
|
-
else
|
|
286
|
-
true
|
|
287
|
-
end
|
|
173
|
+
get_cell_font.is_strikethrough
|
|
288
174
|
end
|
|
289
175
|
|
|
290
|
-
# returns cell's font name
|
|
291
176
|
def font_name()
|
|
292
177
|
validate_worksheet
|
|
293
|
-
|
|
178
|
+
get_cell_font.get_name
|
|
294
179
|
end
|
|
295
180
|
|
|
296
|
-
# returns cell's font size
|
|
297
181
|
def font_size()
|
|
298
182
|
validate_worksheet
|
|
299
|
-
|
|
183
|
+
get_cell_font.get_size
|
|
300
184
|
end
|
|
301
185
|
|
|
302
|
-
# returns cell's font color
|
|
303
186
|
def font_color()
|
|
304
187
|
validate_worksheet
|
|
305
|
-
|
|
306
|
-
'000000' #black
|
|
307
|
-
else
|
|
308
|
-
@workbook.fonts[font_id()][:font][:color][:attributes][:rgb]
|
|
309
|
-
end
|
|
188
|
+
get_cell_font.get_rgb_color || '000000'
|
|
310
189
|
end
|
|
311
190
|
|
|
312
191
|
# returns cell's fill color
|
|
313
192
|
def fill_color()
|
|
314
193
|
validate_worksheet
|
|
315
|
-
|
|
316
|
-
return @workbook.get_fill_color(xf)
|
|
194
|
+
return workbook.get_fill_color(get_cell_xf)
|
|
317
195
|
end
|
|
318
196
|
|
|
319
197
|
# returns cell's horizontal alignment
|
|
320
198
|
def horizontal_alignment()
|
|
321
199
|
validate_worksheet
|
|
322
|
-
xf_obj =
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
end
|
|
326
|
-
xf_obj[:alignment][:attributes][:horizontal].to_s
|
|
200
|
+
xf_obj = get_cell_xf
|
|
201
|
+
return nil if xf_obj.alignment.nil?
|
|
202
|
+
xf_obj.alignment.horizontal
|
|
327
203
|
end
|
|
328
204
|
|
|
329
205
|
# returns cell's vertical alignment
|
|
330
206
|
def vertical_alignment()
|
|
331
207
|
validate_worksheet
|
|
332
|
-
xf_obj =
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
208
|
+
xf_obj = get_cell_xf
|
|
209
|
+
return nil if xf_obj.alignment.nil?
|
|
210
|
+
xf_obj.alignment.vertical
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
# returns cell's wrap
|
|
214
|
+
def text_wrap()
|
|
215
|
+
validate_worksheet
|
|
216
|
+
xf_obj = get_cell_xf
|
|
217
|
+
return nil if xf_obj.alignment.nil?
|
|
218
|
+
xf_obj.alignment.wrap_text
|
|
337
219
|
end
|
|
338
220
|
|
|
339
221
|
# returns cell's top border
|
|
@@ -361,46 +243,10 @@ module RubyXL
|
|
|
361
243
|
return get_border(:diagonal)
|
|
362
244
|
end
|
|
363
245
|
|
|
364
|
-
# returns Excel-style cell string from matrix indices
|
|
365
|
-
def Cell.convert_to_cell(row=0,col=0)
|
|
366
|
-
row_string = (row + 1).to_s #+1 for 0 indexing
|
|
367
|
-
col_string = ''
|
|
368
|
-
|
|
369
|
-
if row < 0 || col < 0
|
|
370
|
-
raise 'Invalid input: cannot convert negative numbers'
|
|
371
|
-
end
|
|
372
|
-
|
|
373
|
-
unless col == 0
|
|
374
|
-
col_length = 1+Integer(Math.log(col) / Math.log(26)) #opposite of 26**
|
|
375
|
-
else
|
|
376
|
-
col_length = 1
|
|
377
|
-
end
|
|
378
|
-
|
|
379
|
-
1.upto(col_length) do |i|
|
|
380
|
-
|
|
381
|
-
#for the last digit, 0 should mean A. easy way to do this.
|
|
382
|
-
if i == col_length
|
|
383
|
-
col+=1
|
|
384
|
-
end
|
|
385
|
-
|
|
386
|
-
if col >= 26**(col_length-i)
|
|
387
|
-
int_val = col / 26**(col_length-i) #+1 for 0 indexing
|
|
388
|
-
int_val += 64 #converts 1 to A, etc.
|
|
389
|
-
|
|
390
|
-
col_string += int_val.chr
|
|
391
|
-
|
|
392
|
-
#intval multiplier decrements by placeholder, essentially
|
|
393
|
-
#a B subtracts more than an A this way.
|
|
394
|
-
col -= (int_val-64)*26**(col_length-i)
|
|
395
|
-
end
|
|
396
|
-
end
|
|
397
|
-
col_string+row_string
|
|
398
|
-
end
|
|
399
|
-
|
|
400
246
|
def inspect
|
|
401
|
-
str = "(#{
|
|
247
|
+
str = "#<#{self.class}(#{row},#{column}): #{raw_value.inspect}"
|
|
402
248
|
str += " =#{@formula}" if @formula
|
|
403
|
-
str += ", datatype = #{
|
|
249
|
+
str += ", datatype = #{self.datatype}, style_index = #{self.style_index}>"
|
|
404
250
|
return str
|
|
405
251
|
end
|
|
406
252
|
|
|
@@ -408,54 +254,48 @@ module RubyXL
|
|
|
408
254
|
|
|
409
255
|
def change_border(direction, weight)
|
|
410
256
|
validate_worksheet
|
|
411
|
-
|
|
412
|
-
@style_index = modify_border(@workbook,@style_index)
|
|
413
|
-
if @workbook.borders[border_id()][:border][direction][:attributes].nil?
|
|
414
|
-
@workbook.borders[border_id()][:border][direction][:attributes] = { :style => nil }
|
|
415
|
-
end
|
|
416
|
-
@workbook.borders[border_id()][:border][direction][:attributes][:style] = weight.to_s
|
|
257
|
+
self.style_index = workbook.modify_border(self.style_index, direction, weight)
|
|
417
258
|
end
|
|
418
259
|
|
|
419
260
|
def get_border(direction)
|
|
420
261
|
validate_worksheet
|
|
421
|
-
|
|
422
|
-
if @workbook.borders[border_id()][:border][direction][:attributes].nil?
|
|
423
|
-
return nil
|
|
424
|
-
end
|
|
425
|
-
return @workbook.borders[border_id()][:border][direction][:attributes][:style]
|
|
262
|
+
get_cell_border.get_edge_style(direction)
|
|
426
263
|
end
|
|
427
264
|
|
|
428
265
|
def validate_workbook()
|
|
429
|
-
unless
|
|
430
|
-
|
|
431
|
-
unless sheet.nil? || sheet.sheet_data.nil? || sheet.sheet_data[
|
|
432
|
-
if sheet.sheet_data[
|
|
266
|
+
unless workbook.nil? || workbook.worksheets.nil?
|
|
267
|
+
workbook.worksheets.each do |sheet|
|
|
268
|
+
unless sheet.nil? || sheet.sheet_data.nil? || sheet.sheet_data[row].nil?
|
|
269
|
+
if sheet.sheet_data[row][column] == self
|
|
433
270
|
return
|
|
434
271
|
end
|
|
435
272
|
end
|
|
436
273
|
end
|
|
437
274
|
end
|
|
438
|
-
raise "This cell #{self} is not in workbook #{
|
|
275
|
+
raise "This cell #{self} is not in workbook #{workbook}"
|
|
439
276
|
end
|
|
440
277
|
|
|
441
278
|
def validate_worksheet()
|
|
442
|
-
if
|
|
443
|
-
|
|
444
|
-
else
|
|
445
|
-
raise "This cell #{self} is not in worksheet #{worksheet}"
|
|
446
|
-
end
|
|
279
|
+
return if @worksheet && @worksheet[row][column] == self
|
|
280
|
+
raise "This cell #{self} is not in worksheet #{worksheet}"
|
|
447
281
|
end
|
|
448
282
|
|
|
449
|
-
def
|
|
450
|
-
|
|
283
|
+
def get_cell_xf
|
|
284
|
+
workbook.cell_xfs[self.style_index]
|
|
451
285
|
end
|
|
452
286
|
|
|
453
|
-
def
|
|
454
|
-
|
|
287
|
+
def get_cell_font
|
|
288
|
+
workbook.fonts[workbook.cell_xfs[self.style_index].font_id]
|
|
455
289
|
end
|
|
456
290
|
|
|
457
|
-
def
|
|
458
|
-
|
|
291
|
+
def get_cell_border
|
|
292
|
+
workbook.borders[get_cell_xf.border_id]
|
|
459
293
|
end
|
|
294
|
+
|
|
295
|
+
def get_number_format
|
|
296
|
+
workbook.stylesheet.get_number_format_by_id(get_cell_xf.num_fmt_id)
|
|
297
|
+
end
|
|
298
|
+
|
|
460
299
|
end
|
|
461
300
|
end
|
|
301
|
+
|